Почему моя реализация Ti c Ta c Toe Deep Q-Learning не учит блокировать движения противника? - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь решить Ti c Ta c Toe с помощью Deep Q-Network.

Окружение:

Массив длиной 9 используется для представления состояния игры, где 1 означает отмеченные позиции текущего игрока и -1 для следующего игрока. 0 используется для неотмеченных позиций. Переменная ход используется для определения следующего хода. Действие представлено в виде списка с номерами строки и столбца. 0 Награда дается за непрекращающиеся ходы и dr aws. За победу дается вознаграждение в размере 1.

Пример:

 x | - | -

 - | - | o 

 - | - | -

представлено как [1,0,0,0,0,0,0, -1,0], здесь x представлен как 1, а o как -1, поскольку следующий ход - x, действие [1,2] изменит состояние на

 x | - | -

 - | - | o 

 - | x | -

, представленное как [-1,0,0,0,0 , -1,0,1,0], здесь x представлен как -1, а o как 1, так как следующий ход - это o

Deep Q-Network:

Функция q принимает состояние и действие для вывода значения q, связанного с этим перемещением для этого состояния. Я обновляю функцию q, используя целевое значение q для состояния s и действие a как

целевое значение q (s, a ) = гамма * (награда (s, a) - значение q (s ', a'))

Где gamma = 1, s '- следующее состояние после того, как действие a выполнено в состоянии s и a '- следующий оптимальный ход для следующего игрока, определяемый функцией q.

Я вычитаю значение q из награды в соответствии с моим пониманием алгоритма минимакса.

Лучшее действие получается путем использования действия из списка допустимых ходов для получения значения q для текущего состояния и действие с наивысшим значением q считается лучшим ходом

Я использую онлайн q-сеть, чтобы обеспечить следующее оптимальное движение, которое обновляется во время каждой выборки и офлайн q -сеть, которая предоставляет значение q для получения целевого значения q, которое обновляется реже в соответствии с реализацией DDQN. Наряду с исследованием и эксплуатацией эпсилон-распада.

Я также использую буфер воспроизведения опыта

Используемая нейронная сеть:

model = models.Sequential()
model.add(layers.Dense(50, input_dim=11, activation='sigmoid'))
model.add(layers.Dense(20, activation='sigmoid'))
model.add(layers.Dense(1, activation='linear'))

с оптимизатором rmsprop со скоростью обучения 0,01

epsilon = от 1 до 0,05 со скоростью затухания 0,9995

размер буфера воспроизведения опыта = 500 эпизодов

размер_пакета для обучения = 500 состояний и действий

офлайн-модель обновляется с весами онлайн с интервалом в 500 эпизодов.

После тренировки для 20000 эпизодов колебания потерь кривая потерь

DQN не смог заблокировать ходы и был только заинтересован в завершении ряда. Я хочу понять, что пошло не так в этой реализации. Это из-за нестабильности DQN или из-за того, что я сделал fl aws. Любая помощь приветствуется. Это мой первый пост, и я не знаю, как писать вопрос, исправьте ошибки в вопросе.

Это код, но он написан не очень хорошо

1 Ответ

1 голос
/ 08 мая 2020

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

Одна из вещей, которую вы могли бы попробовать, - это обратное распространение наград со скидкой в ​​каждом эпизоде. По сути, после завершения каждого эпизода вы должны сделать вознаграждение следующим образом:

new_reward = gamma^(T-t)*terminal_reward

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

...