Почти все функции подсчета очков, о которых я слышал, в основном основаны на том, где сейчас находится машина. Самый простой подход уже представлен в AWS в качестве примера: просто наберите больше очков, если вы находитесь ближе к центральной линии. Более изощренные подходы приносят больше очков, если машина близка к ручной более или менее идеальной линии. Например. линия, которая будет справа перед левым поворотом и слева в середине поворота. Алгоритм ближайшей оптимизации политики затем может узнать, какие хорошие действия были, а какие нет.

Что я сделал

Мой подход был другим: я использовал направление поворота машины (которое доступно в качестве параметра в функции подсчета очков во время тренировки).

Моя функция оценки работает следующим образом:

Нарисуйте круг фиксированного радиуса вокруг машины.

Возьмите пересечение этого круга с центральной линией.

Стремитесь к этой точке. Т.е. Оценка будет самой высокой, если направление поворота таково, что передние колеса указывают туда. Чем больше отклонение, тем ниже оценка.

Я скорректировал радиус круга в зависимости от дорожки и того, насколько узкие углы. Вот и все. Это вывело меня в восьмерку лучших в мире. Помимо этого, мне нужно было настроить только один из параметров обучения: я установил коэффициент дисконтирования на 0,5, а не на значение по умолчанию 0,999.

Почему это хорошая идея?

Примерно через 15 минут тренировки машина завершает свой первый круг. Через минуту он завершает еще один круг, и после этого он может пробежать еще 50 без единой аварии. Другие подходы обычно занимали много часов, если не дней, чтобы сойтись к в некоторой степени стабильной модели. Но почему?

Быстрый ответ ведет к более быстрому обучению: обучение с подкреплением - это поощрение за хорошее поведение. Чем яснее связь между поведением и оценкой, тем быстрее можно усвоить. Представьте, что вы пытаетесь чему-то дрессировать свою собаку. Вы могли делать это, предоставляя вознаграждение каждый вечер, например, давая больше или лучше еды, если он вел себя хорошо. Хотя в принципе это работает, это займет много времени. Если вы хотите потренироваться в некоторых трюках, вам придется давать награду сразу после того, как что-то было сделано хорошо.

То же самое и с функцией подсчета очков в DeepRacer: в принципе можно было указать только очки за завершение круга. В конечном итоге алгоритм PPO научится управлять. Но он улучшится только в том случае, если когда-нибудь закончит круг, и даже тогда он будет едва учиться с каждым успехом. На самом деле, немного лучше, обеспечивая постоянную оценку отсутствия сбоев, уже позволяет алгоритму медленно (но заметно) учиться. Конечно, оценка в зависимости от положения машины намного более прямая. Тем не менее, он дает только некую среднюю оценку за последние пару кадров, которые приводят машину к тому месту, где она находится сейчас. В прошлом может быть пара неверных команд рулевого управления, которые позже компенсировались другими командами. Оба в конечном итоге будут поощряться, и только в конечном итоге хорошие команды будут иметь лучшую статистику и, следовательно, будут поощряться чаще всего.

Указание в «правильном» направлении настолько прямое, насколько это возможно. Он немедленно сообщает алгоритму обучения, хорошее это направление рулевого управления или нет. Усреднение по нескольким кадрам не требуется. Это также причина, по которой я уменьшил коэффициент дисконтирования: оценка никоим образом не оценивает хорошие действия в прошлом (в отличие от оценки по позиции). Вероятно, я мог бы еще больше снизить коэффициент дисконтирования. У меня правда пока не было времени поиграться с этим.

Эта прямая оценка - основная причина того, что этот подход так быстро обучается.

Использование местной информации облегчает обучение: в конечном итоге автомобиль должен двигаться, не зная ни точек пути, ни того, где он находится. Он может только работать с изображением камеры и принимать решение. Это означает, что гораздо проще изучить функцию подсчета очков, основанную только на информации, которую можно увидеть. Я использую только информацию о центральной линии прямо перед автомобилем, которую обычно можно увидеть. Идеально оптимизированная линия будет (по крайней мере, в принципе) также зависеть от частей трека, которые нельзя даже увидеть во время принятия решения. Это не значит, что невозможно выучить этот более сложный путь, просто он труднее.

Срезание углов - это хорошо: это не должно вызывать особого удивления. Это быстрее, потому что таким образом путь становится короче. Это также снижает риск съезда с трассы. Наконец, это также помогает не отвлекаться от дороги. Если при повороте налево автомобиль движется справа, камера в основном видит зеленый цвет и лишь небольшую часть трассы, поэтому труднее решить, в каком направлении двигаться. Увеличение радиуса в функции подсчета очков, описанной выше, приводит к направлению, в котором углы срезаются сильнее.

Разве это не обман?

Ну, сначала это немного похоже на обман. Верно? В конце концов, существует тщательно продуманный алгоритм обучения, который может понять, как управлять. А теперь мы прямо говорим машине, как она должна управлять, используя «сложную математику».

Это правда, но задача состоит в том, чтобы не узнать, в каком направлении лучше двигаться, с учетом путевых точек и координат автомобиля. Сложная часть состоит в том, чтобы обучить нейронную сеть таким образом, чтобы она могла находить это направление на основе изображения с камеры. Только в виртуальной среде мы можем использовать положение автомобиля и трассы, потому что эта информация любезно предоставлена ​​виртуальной средой.

То, что дает оценка, основанная на положении, - это дополнительная нагрузка, связанная с изучением того, как направление управления влияет на положение в нейронной сети.

Таким образом, нужно вложить в функцию оценки как можно больше знаний о проблеме, чтобы минимизировать количество информации, которую нейронная сеть необходимо изучить, и сделать обратную связь для обучения как можно более прямой.

Редактировать (октябрь 2020 г.): Теперь, когда на трассе есть препятствия или другие машины, выбранный мной подход больше не работает. Однако его можно расширить, приняв во внимание препятствия при выборе направления поворота. Мне любопытно посмотреть, реализует ли кто-нибудь этот подход или что еще люди придумают.

Функцию подсчета очков и параметры, используемые для обучения, можно найти здесь (оставьте мне звездочку, если у вас есть учетная запись github;)
https://github.com/falktan/deepracer