Я реализовал 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'])