Введение:

В последней части своей серии я расскажу, как я реализовал Фазу 3 своего проекта (полная случайность), а также объясню еще один агент обучения с подкреплением (DDQN). Я также расскажу о возможных направлениях развития этого проекта в будущем.

Среда этапа 3:

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

Алгоритм этапа 2:

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

Однако, как только я применил этот алгоритм к новой среде, агент работал ужасно. Он застрял, пытаясь скопировать стратегию, которую он хорошо усвоил на последнем этапе, но не смог адаптироваться к изменяющемуся поведению других автомобилей в окружающей среде и потерпел катастрофу в результате с выживаемостью около 20%. Таким образом, мне нужно было придумать нового агента, который был бы гораздо более «продвинутым» по своим способностям.

Проблемы:

Не желая сразу отказываться от градиента политики, я попытался следовать вековой поговорке: «Чем больше слоев, тем лучше результаты». Поскольку у меня было только два полностью связанных слоя, я подумал, что добавление нескольких сверточных слоев может дать агенту большую гибкость и способность лучше понимать среду. Однако, поскольку я тестировал несколько вариантов этой версии, он вернул только немного более усовершенствованную версию первой среды с коэффициентом точности, изменяющимся с 20% выживаемости с 2-слойным агентом FCL до 25% выживаемости с мой новый 5-слойный CNN. Несмотря на улучшенные результаты, выживаемость 25% на участке шоссе в 1 милю неприемлема ни при каких условиях. В результате мне пришлось перейти на другой алгоритм обучения с подкреплением, и этот алгоритм назывался DDQN.

Итак, что такое DDQN?

DDQN или Dueling Deep Q Networks - это алгоритм обучения с подкреплением, который пытается создать значение Q с помощью двух оценщиков функций: один, который оценивает функцию преимущества, а другой, оценивает функцию ценности. Функция значения вычисляет значение заданного входного кадра, а функция преимущества вычисляет выгоды от выполнения заданного действия. Вместе они могут обеспечить хорошую оценку того, насколько хорошо следующий кадр выполняет при определенной паре действий состояния. Кроме того, эта стратегия изучает, какие кадры являются ценными, а не изучает последствия каждого кадра. В таких средах, как есть, это преимущество, потому что для многих кадров наши действия не решают исход игры. Часто бывает только одно неверное движение (которое приводит к сбою), поэтому остальные 3 действия не имеют прямых последствий. Таким образом, лучше понять, какие фреймы лучше подходят в текущем контексте, чем 20 или 30 действий в будущем. Эта двойная сетевая структура показывает лучшие результаты, чем одиночные сетевые структуры, такие как DQN, поскольку каждая функция оценки может фокусироваться на другой части изображения, используя разные стратегии для создания лучшей оценки для функции Q. В случае с нашей средой функция ценности может быть сфокусирована на новых автомобилях, которые присоединяются к окружающей среде, тогда как функция преимущества может уделять больше внимания нашему непосредственному окружению, следя за тем, чтобы не произошла авария в конце игры. На диаграмме ниже показаны две структуры: первая - это структура DQN, а вторая - это структура DDQN.

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

Наша сеть будет пытаться максимизировать Q-значение для данной пары действий состояния. В DDQN значение Q складывается из функции ценности и преимущества. Однако, чтобы повысить стабильность оптимизации, мы вычитаем среднее значение функции преимущества из преимущества данного действия. Таким образом, преимущество имеет значение, позволяющее сравнивать себя с другими действиями, при этом оно должно изменяться только в зависимости от среднего значения преимущества, а не максимума или минимума функции преимущества.

Https://arxiv.org/pdf/1511.06581.pdf

Моя реализация DDQN

Поскольку моя игра была не очень сложной, я смог использовать относительно простую архитектуру нейронной сети. Две сети разделяют 3 сверточных слоя, и каждая функция преимуществ и ценности имеет по 2 полностью связанных слоя. Выходной слой функции значения имеет только один узел, чтобы обозначить ценность данного кадра, а функция преимущества имеет 4 выхода, по одному для каждого действия.

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

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

В результате всего этого сеть работала намного лучше, чем исходный алгоритм, достигнув максимальной выживаемости около 94% в 200 эпизодах. Этот алгоритм занял около 8–16 часов, прежде чем он смог показать шаблоны в игре, и около двух дней, пока он не перестал пробовать новые шаблоны.

Результаты

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

Однако DDQN по-прежнему показывает наиболее многообещающие результаты для будущей работы в этой области по сравнению с такими алгоритмами, как градиент политики или DQN. Вероятно, это связано с природой окружающей среды. В отличие от шахмат и понга, симуляторы беспилотных автомобилей не имеют четких конечных точек, если только не произойдет сбой. В результате относительное значение каждого кадра не может быть успешно определено функцией кумулятивного вознаграждения. Вместо этого ключом к этой фазе был переход к функции вознаграждения, основанной на скорости, с оценкой только ее текущего значения и, возможно, с включением члена, который вознаграждает изменение.

Выводы и дальнейшие действия

Пока что на этом я и буду заниматься этим проектом. Однако в будущем я хотел бы продолжить работу с этим DDQN, поскольку считаю, что это может быть идеальным алгоритмом для такого типа проблем. Тем не менее, я бы немного изменил тип ввода, а также функцию вознаграждения, чтобы в результате было больше «рисковать» и ездить быстрее. Тип ввода, в частности, можно изменить, по крайней мере, несколько, чтобы включить больше данных о других автомобилях в кадре.

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

Большое вам спасибо за чтение этой серии, и я хотел бы услышать ваши отзывы !!

Код для части 2

Часть 0

Часть 1