Данный агент использует VisionHead и RenderHeads из 18d_world_model_03:1. Веса VisionHead и RenderHeads заморожены. В целом работает.

Проблемы:

  • жрётся ощутимо больше памяти, чем 17-е агенты. Ну это и понятно - 17-ый агент оперировал цепочкой из 4-х токенов, а здесь сразу в 36 раз больше
  • как следствие время роллаута и оптимизации тоже выросли. 6 млн шагов 2,5 часа требует =(

В ходе запусков выяснились интересные подробности:

  1. в ale был баг в логике Frostbite, который приводил к тому, что игра переходила в режим скринсейвера. В итоге агент видел разворачивающееся действие, но нажатие кнопнок не давало никакого эффекта (). Агент познаёт безнадёгу, т.к. понимает, что от него ничего не зависит. Воспроизведение элементарное - надо, чтобы агент замёрз на последней жизни. Пофикшено в ale_py=0.12.0+neurolab3
  2. после фикса бага вылез другой баг. Теперь если агент заходит в иглу на последней жизни, то ошибочно вздёргивался флаг terminated. Это всё из-зи того, что есть промежуточное состояние игры, в котором начисляются очки (levels clearance). А они начисляются с обратным отсчётом температуры. А в ale_py=0.12.0+neurolab3 я незамысловато поставил, что если жизнь последняя и температура упала до 0, то вздёрнуть флаг terminated. Короче, оба бага пофикшены в ale_py=0.12.0+neurolab4
  3. prediction_coef=0.1, который хорошо работал для 17-ых агентов, стал приводить к вырожденному поведению в 18-ых агентах. Оказалось, что это слишком высокое значение, из-за которого агент предпочитает абсолютную предсказуемость. А она достигается, если просто стоять или делать простые механические движения. Почему значение коэффициента работало в 17-ых, и сломалось в 18-ых? Потому что в 17-х мы предсказывали эмбеддинг вектор (latent space), а 18-ых мы предсказываем пиксели. В итоге коэффициент по разному влияет на градиенты.
  4. градиенты. Добавил выгрузку в тензорборд влияния того или иного лосса на градиент. Выяснилось, что, действительно, снижение prediction_coef с 0.1 до 0.02 снижает влияние лосса по предсказанию на несколько порядков. Т.е. связь нелинейная.
  5. после получения вклада каждого лосса в градиенты выяснилось, что доминирующее значение вносит велью-лосс. Стал разбираться почему. Выяснилось, что есть агента колбасит туда-сюда, когда он утонет или пройдёт уровень. В обоих случая во входящей цепочке из 4-х картинок он видит статичную сцены, где ничего не двигается. И в итоге не может понять: это идёт начисление очков или это он утонул. И вот видно, чтоб если он думает, что идёт начисление очков и агент предполагает, что сейчас он нахоботит 40 очков, а по факту 2. И лосс просто громадные получается. Система такая: так, тащим влево. А потом следующий пример из батча: когда агент думает, что он сейчас нахоботит 20, а получает 30. И система такая: так, тащим вправо. Короче, великий тяни-толкай из-за того, что агент лишён возможности комплексно оценить обстановку. Я изначально думал, что 4-х кадров хватит. Да, этого хватит для активных игровых действий, но тут есть вот эти промежуточные состояния (начисление очков, анимация утопленности), которые на коротких цепочках сложно (если не невозможно) выявить.

Мораль-то какая.

  1. Без чистого сигнала агенту очень туго приходится. Выясняется, что всё это время я тренировал агента на грязных сигналах.
  2. Цепочка из 4-х наблюдений - этого недостаточно для Frostbite. Нужно 8-м. Либо нужно решать задачу по типу Transformer-XL, где мы анализируем эмбеддинг вектора.
  3. Нужно внимательно смотреть на градиенты, чтобы правильно выставить веса потерь.
  4. Если лосс колбасит, то это верный признак, что что-то идёт не так и надо с этим разбираться.