Теперь я научился почти гарантированно обучать нейронку управлять машинкой при сложной физике. Ради чего я и написал два прошлых поста.
В двух прошлых постах шло обсуждение обучения при простой физике, когда нет сил, колёс, инерции итд, а машинка просто безусловно двигается вперёд и безусловно поворачивается по воле нейронки. Даже для такой простой задачи обучение толком не сходится, как можете видеть (уж слишком сложные трассы я наделал видимо).
Ну и я начал исследовать как же добиться того чтобы можно было начинать обучение с простой физики, а заканчивать сложной. Сравнил три разных подхода:
1. Начинать обучение сразу со сложной физики (x = 0.0).
2. Встроить сложность физики в параметр оптимизации и давать очень большую награду за его увеличение.
3. Начинать с простой (x = 1.0), а потом постепенно увеличивать сложность в цикле (x -= 0.02).
Первый вариант изображён синим цветом, по нему видно что он очень плохой, в среднем не проходит трассу, не может научиться быстро ездить, много врезается в стену. Поэтому какое-то сведение к простой физике жизненно необходимо, иначе ничего никогда обучить нельзя. Именно это я и видел в одном из прошлых постов.
Второй вариант изображён зелёным цветом, и его суть в том что сложность физики эволюционируется рядом с параметрами нейросети, и награда за сложную физику даётся очень большая, больше чем прохождение конкретных уровней. Сделал награду такой: если все трассы пройдены, то давать награду за сложность физики, иначе штрафовать за сложность физики, чтобы она была максимально простой. Идея была в том что сначала нейронка обучается проходить все трассы на простой физике, и только как этого достигает, она начинает проходить по сложной физике, причём ей запрещено разучиваться проходить хотя бы одну трассу, иначе она теряет очень много награды.
Этот вариант был самым перспективным, и как мне казалось, гениальным. Я думал что смогу просто встроить в метрику любые подобные параметры, и не надо будет писать ручные циклы, а можно будет делать всё в рамках одного обучения. Но как оказалось, это обучалось очень плохо, доходило до простоты физики около 0.2, и дальше никак не эволюционировало. Как я посмотрел, машинка стала вилять, и из-за медленного прохождения трассы ей перестало хватать квоты на число шагов и поэтому она не могла дальше уменьшать простоту физики, ведь у неё есть требование что все трассы должны проходиться.
Я перепробовал очень много модификаций к этой идее, но ничего не смогло заставить её нормально сходиться.
То как эта метрика работает можно видеть на графике: количество пройденных треков у неё очень хорошее, потому что на оптимизирует до тех пор, пока все треки не пройдутся, но сложность физики она оптимзириует очень плохо, а штраф не в нуле.
Ну и третий вариант, изображён красным цветом, самый тупой: сначала тупо запускаем 100 поколений эволюции на простой физике, затем усложняем физику с шагом 0.02, и эволюционируем максимум 10 поколений, или пока новый скор не будет больше или равен старому. Затем снова эволюционируем 100 поколений чтобы машикна стала лучше ездить.
И это показывает себя лучше всего. Правда видно большую вариацию в скорости сходимости простой физики и в других параметрах (закрашенная красная область), потому что довольно много запусков, которые за первые 100 поколений не научились проходить все трассы, и затем для таких плохих машинок мы начинаем упрощать физику, и им становится всё сложнее и сложнее.
Проблема нестабильности обучения даже при простой физике - задача, которую ещё предстоит решить. Ведь если я её не решу, то не смогу создать агентов, которые обучаются без эволюции, онлайн, как люди и животные. Да, именно такая у меня конечная цель.
Пока у меня гипотеза что основной компьют тратится на обучение зрения, поэтому простая физика так легко дообучается до сложной, поэтому здесь есть идея добавить автокодировщик на зрение. Может тогда стабильность улучшится.
#машинки