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