Нейросетевая структура данных
Итак, я работаю над небольшим сайд-проектом с целью экспериментирования с генетическими алгоритмами. Проект включает в себя два класса, твари и еда. Твари получают голод каждый клещ и теряют голод, когда находят пищу. Твари могут двигаться, а пища неподвижна. У каждого существа есть геном, который представляет собой просто строку случайно сгенерированных символов. Цель состоит в том, что после нескольких поколений, твари будут развиваться специализированные модели движения, которые приводят к оптимальной пище. потребление.
В данный момент каждое существо управляется нейронной сетью. Нейронная сеть инициализируется весами и смещениями, полученными из генома животного. Первый вход в нейронную сеть равен [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 ответ:
Просто идея.
У вас есть
Например, можно использовать хэш-функцию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
.