Нейросетевая структура данных


Итак, я работаю над небольшим сайд-проектом с целью экспериментирования с генетическими алгоритмами. Проект включает в себя два класса, твари и еда. Твари получают голод каждый клещ и теряют голод, когда находят пищу. Твари могут двигаться, а пища неподвижна. У каждого существа есть геном, который представляет собой просто строку случайно сгенерированных символов. Цель состоит в том, что после нескольких поколений, твари будут развиваться специализированные модели движения, которые приводят к оптимальной пище. потребление.

В данный момент каждое существо управляется нейронной сетью. Нейронная сеть инициализируется весами и смещениями, полученными из генома животного. Первый вход в нейронную сеть равен [0,0]. Нейронная сеть производит два выхода, которые диктуют направление движения существа x и y соответственно. Этот выход используется как вход для нейронной сети на следующем тике. Например:
1: [0,0]->NN->[.598.., -.234...] // Critter moves right and up
2: [.598...,-.234...]->NN->[-.409...,-.232...] // Critter moves left and up
3: [-.409...,-.232...]->NN-> etc.

Проблема заключается в том, что независимо от того, как весовые коэффициенты инициализируясь, нейронная сеть находит своего рода "неподвижную точку".- То есть после двух или трех итераций выход и вход практически одинаковы, поэтому тварь всегда движется в одном и том же направлении. Сейчас я не тренирую нейронную сеть, да и не хочу этого делать. Так что я ищу альтернативный метод генерации выходных данных.

Более конкретно, предположим, что у меня есть n случайных Весов, генерируемых геномом. Мне нужно отношение, определяемое теми N весами, которые могут отображать (в самом широком смысле этого слова) 2 входа в диапазоне [-1,1] до двух выходов в том же диапазоне. Главное, что я хочу, чтобы веса оказывали существенное влияние на поведение функции. я не хочу, чтобы это было что-то вроде y=mx+b, где мы только меняем y и b. Я знаю, что это довольно расплывчатое описание. Сначала я думал, что нейронная сеть будет идеальной, но похоже, что входы практически не влияют на выходы без обучения (которое справедливо, поскольку нейронные сети предназначены для обучения).

Какой-нибудь совет?

1 3

1 ответ:

Просто идея.

У вас есть f(genome) -> (w_1, w_2, ..., w_n), где f генерирует w на основе genome.

Например, можно использовать хэш-функцию h и вычислить [h(w_1, ..., w_(n/2)), h(w_(n/2+1), ..., w_n))].

Обычно хэш-функция должна давать очень четкие выходные данные для небольшого изменения входных данных. Но не всегда. Вы можете искать хэш-функции, которые являются непрерывными (небольшое изменение на входе, небольшое изменение на выходе). Этот вид функции будет использоваться для поиска сходства, http://en.wikipedia.org/wiki/Locality_sensitive_hashing может дать некоторые идеи. Таким образом, вы можете использовать хэш непосредственно в геноме.

В противном случае вы можете попытаться разделить геном или веса и дать расщеплениям разные цели. Скажем, n = 4.

(w_1, w_2) аффекты x

(w_3, w_4) аффекты y

Затем можно вычислить x как (w_1 + w_2*Random_[-1,1])/2, где Random_[-1,1] - случайное число из интервала [-1,1] и предположить, что w_i \in [-1,1] для всех i.

Аналогично для y.

Ваш генетический алгоритм затем оптимизирует скорость и хаотичность перемещения животных, чтобы оптимально находить пищу. Если у вас больше веса (или больше генома), вы можете попытаться придумать более причудливую функцию в подобном духе. Это фактически показывает, что с генетическими алгоритмами решение проблемы смещается к поиску хорошего представления генома и хорошей функции пригодности, поэтому не волнуйтесь, если вы застряли на нем. немного.