1

Хорошо, поэтому я создал Q-ученику нейронной сети, используя ту же идею, что и алгоритм Atari от DeepMind (за исключением того, что я даю необработанные данные, а не изображения (все же)).Почему моя нейронная сеть Q-ученик не изучает tic-tac-toe

Нейронные сети сборка:

  • 9 входов (0 для пустого места, 1 для "X", -1 для "O")

  • 1 скрытого слой с 9-50 нейроны (пытались с различными размерами, активация функции сигмовидных)

  • 9 выходов (1 для каждого действия, выводит Q-значение, активация функции сигмовидной)

  • MSE функция потерь
  • Адам backprop

Я 100% уверен, сеть построена правильно, так как градиентных проверок и много испытаний.

Q-параметры:

  • -1 вознаграждение за потерянное игру
  • -1 вознаграждение, если шаг предпринимается попытка уже занят место (например, X уже в том месте, где игрок O пытается поставить его «O»)
  • 0 награда за черпает
  • 0 награды за хода, которые не приводят к конечному состоянию
  • +1 награды за выиграли игру
  • Следующее состояние (в s, a, r, s ') - это состояние после вашего собственного и хода вашего противника. Например. пустая доска и игрок X имеет первый поворот и помещает «X» в верхний левый угол. Затем игрок O помещает «O» в верхний правый угол. Тогда s, a, r, s 'будет s = [0,0,0,0,0,0,0,0,0], a = 0, r = 0, s' = [1,0, - 1,0,0,0,0,0,0]

Проблема

Все мои Q-значения к нулю, если я дам -1 награду, когда ход делается уже занят место. Если я этого не сделаю, сеть не узнает, что она не должна перемещаться по уже занятым местам и, по-видимому, изучает произвольные Q-значения. Также моя ошибка, похоже, не сокращается.

Решения, которые не работают

  • Я попытался изменить награды (0, 0,5, 1) и (0, 1), но она до сих пор не научились.

  • Я попытался представить состояние как 0 для пустого, 0,5 для O, 1 для X, но не работал.

  • Я попытался дать следующее состояние сразу после того, как сделан ход, но это не помогло.

  • Я пробовал с Адамом и спинкой ванили, но все тот же результат.

  • Я попытался с партиями из переигровки памяти и стохастического градиентного спуска, но все же
  • Changed сигмовидной к РЕЛУ, но не помогло.
  • Всех видов вещей, которые я не могу вспомнить сейчас

проекта в GitHub: https://github.com/Dopet/tic-tac-toe (Извините за уродливый код в основном из-за все эти реорганизации коды, и это должно было быть простым тестом чтобы увидеть, если алгоритм работы)

Основные моменты:

  • TicTac класс имеет саму игру (из U петь шаблонный метод из абстрактного класса Game)
  • NeuralNetwork класс записывает некоторые данные в файл, называемый MyLogFile.log в текущем каталоге
  • Блочные и комбинированные классы просто используются для создания выигрышных ситуаций
  • jblas-1.2.4. jar содержит библиотеки DoubleMatrix
+1

Это сообщение отлично, насколько это возможно. Проблема в том, что (а) я не вижу ничего неправильного в вашем подходе; (b) вы не предоставили код для воспроизведения ошибки. – Prune

+0

Я добавил проект в GitHub. Пожалуйста, спросите, есть ли у вас что-то непонятное! https://github.com/Dopet/tic-tac-toe – Dope

+0

[Минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve) применяется здесь. – Prune

ответ

1

Это был вопрос вознаграждения/удаления функции активации из выходного уровня. Большую часть времени, когда у меня были награды [-1, 1] и моя функция активации выходного уровня, была сигмоида, которая идет от [0, 1]. Это привело к тому, что сеть всегда имела ошибку при награждении ее -1, потому что выход никогда не может быть меньше нуля. Это заставило значения перейти к нулю, так как он попытался исправить ошибку, но это не могло

0

Я думаю, что ваша формулировка неверна. Вы обновляете значение состояния, используя максимальное значение, которое NN дает для следующего состояния.

expectedValue[i] = replay.getReward() + gamma *targetNetwork.forwardPropagate(replay.getNextState()).max();

Это работает для отдельных параметров проигрывателя. Но поскольку tic tac toe - игра в 2 игрока, более высокая ценность «следующего состояния» (противника) плохо для значения текущего состояния.

Вы можете принять максимальное значение 2 состояния вперед (используя NN для прогнозирования двух состояний вперед), но это тоже не очень хорошо работает, поскольку вы предполагаете, что второй ход, который вы делаете, является оптимальным и приводит к множеству неправильных обновлений ,

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

Вы можете в конечном итоге вознаградить вспомогательные оптимальные ходы позитивно и наоборот, но при большом количестве игр все работает в вашу пользу.

+0

Это не должно быть проблемой, так как мое следующее состояние - это состояние после вашего собственного и движения вашего противника (см. Раздел Q-параметров выше, например, о том, что я имею в виду). Но я действительно получил эту работу. Это был вопрос вознаграждения/удаления функции активации из выходного уровня. Большую часть времени, когда у меня были награды [-1, 1] и моя функция активации выходного уровня, была сигмоида, которая идет от [0, 1]. Это привело к тому, что сеть всегда имела ошибку при награждении ее -1, потому что выход никогда не может быть меньше нуля. Это заставило значения перейти к нулю, так как он пытался исправить ошибку, но не смог – Dope