Повышение моего GA с помощью нейронных сетей и / или обучения по усилению - PullRequest
8 голосов
/ 17 марта 2010

Как я уже упоминал в предыдущих вопросах, я пишу приложение для решения лабиринтов, чтобы помочь мне узнать больше о теоретических предметах CS, после некоторой проблемы у меня работает Генетический алгоритм, который может развить набор правил (обрабатывается логическими значениями ) чтобы найти хорошее решение через лабиринт.

При этом только с ГА все в порядке, но я бы хотел усилить ее с помощью нейронной сети, хотя у меня нет реальных практических знаний о нейронных сетях (нет формального теоретического образования в области КС). После небольшого прочтения этой темы я обнаружил, что нейронную сеть можно использовать для обучения генома с целью улучшения результатов. Допустим, у меня есть геном (группа генов), например

1 0 0 1 0 1 0 1 0 1 1 1 0 0...

Как я могу использовать нейронную сеть (я предполагаю MLP?) Для обучения и улучшения моего генома?

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

(из http://people.revoledu.com/kardi/tutorial/ReinforcementLearning/Q-Learning-Algorithm.htm)

1.  Set parameter , and environment reward matrix R
   2. Initialize matrix Q as zero matrix
   3. For each episode:
          * Select random initial state
          * Do while not reach goal state
                o Select one among all possible actions for the current state
                o Using this possible action, consider to go to the next state
                o Get maximum Q value of this next state based on all possible actions
                o Compute
                o Set the next state as the current state

  End Do

  End For 

Большая проблема для меня - реализовать матрицу наград R и что это за матрица Q, и получить значение Q. Я использую многомерный массив для моих состояний лабиринта и перечисления для каждого движения. Как это будет использоваться в алгоритме Q-Learning?

Если бы кто-то мог помочь, объяснив, что мне нужно сделать, чтобы реализовать следующее, желательно на Java, хотя C # тоже было бы неплохо, возможно, с некоторыми примерами исходного кода, это было бы полезно.

Ответы [ 3 ]

3 голосов
/ 18 марта 2010

Как отмечалось в некоторых комментариях, ваш вопрос действительно включает в себя большой набор базовых знаний и тем, которые вряд ли можно красноречиво охватить в стеке потока. Однако здесь мы можем предложить подходы, чтобы обойти вашу проблему.

Прежде всего: чем занимается ваша ГА? Я вижу набор двоичных значений; кто они такие? Я вижу их как либо:

  • плохо : последовательность инструкций «повернуть направо» и «повернуть налево». Почему это плохо? Потому что вы в основном делаете случайную, грубую попытку решения вашей проблемы. Вы не развиваете генотип: вы уточняете случайные догадки.
  • лучше : каждый ген (местоположение в геноме) представляет особенность, которая будет выражена в фенотипе. Не должно быть соотношения 1: 1 между геномом и фенотипом!

Позвольте мне привести вам пример: в нашем мозгу 10 10 13 нейронов. Но у нас всего около 10 ^ 9 генов (да, это не точное значение, потерпите меня на секунду). Что это говорит нам? Что наш генотип не кодирует каждый нейрон. Наш геном кодирует белки, которые затем идут и составляют компоненты нашего тела.

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

Теперь подумайте о своем GA: что вы пытаетесь достичь? Вы уверены, что развивающиеся правила помогут? Другими словами - как бы вы выступили бы в лабиринте? Что может быть наиболее успешным, что может вам помочь: иметь другое тело или иметь память о правильном пути, чтобы выбраться? Возможно, вы захотите пересмотреть свой генотип и сделать так, чтобы он кодировал способности запоминания . Возможно, закодируйте в генотипе, сколько данных может храниться и как быстро ваши агенты могут получить к ним доступ, а затем измерить пригодность с точки зрения того, как быстро они выходят из лабиринта. Другой (более слабый) подход может заключаться в кодировании правил, которые ваш агент использует, чтобы решить, куда идти. Сообщение о возвращении домой - это кодирование функций, которые после выражения могут быть выбраны по пригодности.


Теперь к нейронной сети. Следует помнить, что NN являются фильтрами . Они получают вход. выполнить над ним операции и вернуть вывод. Что это за выход? Может быть, вам просто нужно различать истинное / ложное условие; например, как только вы передадите карту лабиринта в NN, он может сказать вам, можете ли вы выйти из лабиринта или нет. Как бы вы сделали такую ​​вещь? Вам нужно будет правильно кодировать данных.

Это ключевой момент для NN: ваши входные данные должны быть правильно закодированы. Обычно люди нормализуют его, возможно, масштабируют, возможно, вы можете применить к нему сигма-функцию, чтобы избежать слишком больших или слишком малых значений; это детали, которые касаются ошибок и производительности. Теперь вам нужно понять, что такое NN, и для чего вы не можете его использовать.

К твоей проблеме сейчас. Вы упомянули, что хотите использовать NN: а как же,

  • использование нейронной сети для управления агентом и
  • используя генетический алгоритм для развития параметров нейронной сети?

Перефразировано так:

  • давайте предположим, что у вас есть робот: ваш NN управляет левым и правым колесом, и в качестве входного сигнала он получает расстояние до следующей стены и сколько он проделал до сих пор (это только пример)
  • вы начинаете с генерации случайного генотипа
  • превращают генотип в фенотип: первый ген - это чувствительность сети; второй ген кодирует коэффициент обучения; третий ген .. и так далее и тому подобное
  • теперь, когда у вас есть нейронная сеть, запустите симуляцию
  • посмотрите, как это работает
  • генерирует второй случайный генотип, развивает второй NN
  • Посмотрите, как этот второй человек выполняет
  • найдите лучшего человека, затем либо измените его генотип, либо рекомбинируйте его с проигравшим
  • повтор

здесь есть превосходное чтение по этому вопросу: Inman Harvey Microbial GA .

Надеюсь, я кое-что понял по таким вопросам. NNs и GA не являются серебряной пулей для решения всех проблем. В некоторых они могут сделать очень многое, в других они просто неправильный инструмент. Это (до сих пор!) Зависит от нас, чтобы получить лучший, и для этого мы должны понимать их хорошо.

Удачи в этом! Приятно знать такие вещи, которые делают повседневную жизнь более увлекательной:)

1 голос
/ 18 марта 2010

Вероятно, нет "гена лабиринта", чтобы найти,

генетические алгоритмы пытаются настроить вектор свойств и «систему фильтрации», чтобы решить с помощью своего рода алгоритма «отбора наиболее подходящих» выяснить, какой набор свойств будет работать лучше.

Самый простой способ найти выход из лабиринта - всегда двигаться влево (или вправо) вдоль стены.

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

РЕДАКТИРОВАТЬ: Как упоминалось выше, алгоритм обратного отслеживания подходит для этой задачи лучше, чем GA или NN. Как объединить оба алгоритма описано здесь NeuroGen описывает, как GA используется для обучения NN.

0 голосов
/ 28 апреля 2010
  • Попробуйте использовать бесплатную библиотеку NerounDotNet C # с открытым исходным кодом для своих нейронных сетей вместо ее реализации.

  • Для библиотеки по усиленному обучению в настоящее время я ищу ее, особенно для Dot NET Framework.

...