(Gym, OpenAI, MTS Contest - NTI)
Обученный Агент находится в /solve/test_agent.py, веса в /solve/weights_learned_solve.zip. При запуске Агента в константу WEIGHTS_PATH указать путь к разархивированным весам.
Тестирование агента производится на весах, снятых с модели, обученной за ~2000 эпизодов (2000 +- 300).
- https://gist.github.com/154King154/180aaeb0cf82e9b480f2646b0e94466a
- https://gist.github.com/tnnNull/1095b56a6291971ad70a5c0923a4555c
- https://gist.github.com/tnnNull/60b9b4f436ecc2a7ddab1901edd293f6
Была оформлена модель, содержащая в себе 2 скрытых слоя, 64 нейрона на каждом с функцией активации RELU. Входной слой принимал массив из observation, выходной слой на softmax, с размером action.
Был написан массив, содержащий историю действий, представленных в виде
[s, a, r, s1], где s - текущий state, a - совершенное действие, r - полученный reward, s1 - новое состояние, после выполнения a.
Модель была реализована на TensorFlow без использования оболочки Keras.
После чего мы тренировали агента ~2000 эпизодов.
- Загружаем наблюдения и состояние в агента, получаем на выходе некоторое действие.
- Вводим вероятность выполнения случайного действия, вместо предложенного нейросетью. Были использованы различные константные значения вероятностей, и также линейное снижение вероятности с каждой итерацией.
- Получаем reward за совершенное действие, помещаем в память тот самый массив ^ ([s, a, r, s1])
- При завершении игры (возвращении средой истинного значения done = TRUE) мы обновляем веса модели, дисконтируя полученный reward, а также вводим собственные штрафы за некоторые действия (нап. зависание в воздухе в малом расстоянии от посадочной платформы).
- Для удобства дополняем историю наград текущей, а также историю количества шагов
- Каждые несколько эпизодов мы экпортируем веса модели в формате .ckpt
- Создаем новую модель TensorFlow, описанную выше.
- Загружаем веса обученной модели из формата .ckpt
- Проводится тестирование за 100 эпизодов, при необходимости можно рендерить эпизод. На выходе получаем среднее значение за 100 эпизодов.
- Использование DeepQNeuralNetwork алгоритма, а также хранение наград за каждый шаг эпизода и дисконтирования их с каждым шагом на определённый коэффициент.
- Обучение происходит на батчах состоящих из массивов [s, a, r, s1], которые хранятся в памяти. Для этого перед запуском обучения происходит 32 случайных действия для начального заполнения памяти. В последствии случайным образом достается батч из памяти.
- Для улучшения решения использовалась дополнительная стратегия. Агент совершал действие, предсказанное нейросетью в 95% случаях, в остальных же случаях он совершал случайное действие. Это улучшило средний результут за 100 эпизодов с 120 до 150.
- Вторым способом улучшения было использование не константного значения вероятности совершения случайного действия, а линейного уменьшения вероятности с максимального (10%) до минимального (3%) на протяжении всего обучения. Это увеличило средниее количество очков за 100 эпизодов с 170 до 186.
- Третьей идеей для улучшения было использование не линейного уменьшения вероятности, а экспоненциального. Но данное улучшение особо не повлияло на финальный результат обучения, за 100 эпизодов тестирования средний результат со 186 увеличился до 191, т.е. незначительно.
- Четвертая идея - введение дополнительного штрафования за зависания в воздухе. Одной из проблем обучения было то, что Агент зависал над платформой и не садился на нее. Для избавления от данной ситуации мы ввели штраф, начисляемый в конце эпизода. Чем дальше находится Агент от платформы по координатам x и y, тем больше штраф. Средний результат на тестах увеличился с 191 до 240.
Вот ссылочка: https://youtu.be/oDuOOPdJ4Jw