Задачка с телегой в долине
Решение — обычный такой дип ку-лёрнинг.
- Чтобы агент побыстрее научился отползать с мёртвой точки и учился не целую вечность, хвалим его за прирост в скорости.
- [ОТКЛЮЧЕНО] В начале обучения в историю мы сохраняем в том числе симметричные случаи (хоть задача и несимметрична, "раскачка" между холмами полезна).
- В одном месте к признакам состояния добавляем их же, возведённые в квадрат (потому что если бы я писал эвристику, там бы были квадраты расстояния; так пусть машина сама подберёт что-то подобное). Ненужные члены полинома элиминируем гейтом, то есть линейным слоем + сигмоидой.
- Близость до флажка решил не добавлять в обновлённый реворд, уж совсем читерство.
Пробовал что-то вроде Brain Damage, тупое усреднение, добавление шума в веса, добавление шума в данные (вообще оно-то как раз должно было помочь, потому что у позиции и скорости есть свойство локальности) — и ещё много что. Кое-что удалил, кое-что осталось в виде закомментированного кода (но я старался, чтобы было аккуратно).
Сохраняю раз в несколько шагов "карту" выученного поведения агента, а также историю ревордов. Довольно прикольно — и много рассказывает о задаче и пространствах решений.
- точка входа —
main.py
- архитектура агента и её обёртка — в
model.py
- обновлённая награда — в
training.py
- память (просто циклический буфер) — в
memory.py
- рисование картинок — в
utils.py
Бонусом пара неравенств, которые решают задачу, взяты с интернета
и в виде готового кода лежат в файле deterministic_policy_for_comparison.py
.
Ещё один бонус — интересные и не очень картинки, которые получились в процессе.
Ситуация, когда вознаграждение агенту слишком сильно отличается от исходного. Сделать хотел утюг — слон получился вдруг.