DoodleJump Q-Learning, как вознаграждать и какие материалы? - PullRequest
0 голосов
/ 20 апреля 2020

Я реализовал DoodleJump и хочу, чтобы ИИ изучал его через Q-Learning. ANN и весь процесс Q-Learning уже реализованы.

Но, похоже, он пока не работает. Я вполне уверен, что причина этого кроется в системе вознаграждений или во входном проектировании объектов (возможно, в обоих).

Итак, мой вопрос: что было бы хорошим способом вознаграждения агента здесь и какие входные данные я должен дать ИНС?


Мой подход был:

Вознаграждение system:

  • вознаграждение -5, когда агент слишком низок, поэтому он теряет
  • вознаграждение 1 при попадании на платформу
  • , в противном случае вознаграждение всегда равно 0

Входные данные:

  • игрок смотрит в 8 направлений (вверх, вверх, вправо, вправо, вниз, вправо, вниз, вниз влево, влево, вверх влево )
  • если в направлении есть платформа, выбирается ближайшая и вычисляется расстояние
  • при условии, что расстояние равно d. Тогда вход для этого направления: 1.0/d
  • таким образом, вход будет больше, если платформа ближе. И оно всегда меньше 1
  • , если нет платформы от определенного направления, соответствующий входной сигнал равен 0
  • , первый параметр - скорость восходящего движения агента (также может быть отрицательной) ( также нормализован, так что всегда между -1 и 1)

Итак, весь входной массив:

input = [velocity, distance first direction, distance second direction, …, distance 8. direction]

Так что у меня часто бывают такие входные данные:

[-0.2   0.    0.    0.    0.    0.    0.25  0.    0.  ]
[0.4 0.  0.  0.  0.  0.  0.  1.  0. ]
[0.6        0.14285714 0.         0.         0.         0.11111111        0.         0.         0.        ]

Но, как я уже сказал, он не работает.

(Чтобы предотвратить NaN, я установил здесь y на 0, поэтому проблема не в том, что Q-значения возрастают до бесконечности)

Вот моя модель:

model = Sequential()

model.add(Dense(9))
model.add(Activation('relu'))
model.add(Dense(6))
model.add(Activation('relu'))
model.add(Dense(3))
model.add(Activation('linear'))

model.compile(loss='mse',
              optimizer=Adam(),
              metrics=['mae'])

1 Ответ

0 голосов
/ 02 мая 2020

Не прямое решение, а обходной путь:

Теперь я попробовал другой подход, я попробовал его с контролируемым обучением - абсолютно успешно. Это работает как шарм.

...