Одна из самых крутых вещей, которые мне пришлось сделать в AWS ReInvent на этой неделе, - это обучить модель обучения с подкреплением для автономного управления новым транспортным средством Amazon DeepRacer!

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

Эти же концепции можно применить к обучению модели обучения с подкреплением.

Для этой конкретной задачи мы сосредоточились на функции вознаграждения, а специалисты по данным AWS уже рассчитали для нас гиперпараметры. В модели используется AWS Sagemaker с Tensorflow, и по мере обучения модели вы можете наблюдать за симуляцией ее обучения на базе AWS RoboMaker. В функции вознаграждения у нас был доступ к различным переменным для этой конкретной модели - координаты X и Y транспортного средства, ориентация транспортного средства, список всех (координаты x, y) путевых точек вдоль трассы, ближайший путевая точка к транспортному средству, процентное продвижение транспортного средства по треку, количество шагов, сделанных транспортным средством, логическое значение того, находится ли транспортное средство на треке или нет, и многое другое. С этими переменными мы должны были решить, как мы можем реализовать их, чтобы написать нашу функцию вознаграждения таким образом, чтобы научить модель успешно автономно ездить по трассе и оставаться на ней (# 2 - наша цель).

Вы можете посетить семинар на github здесь (если вы перейдете в лабораторную работу 1, вы увидите различные переменные и их определения):



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

В итоге я обучил несколько моделей и кое-чему научился у всех. За первую модель я наградил ее за то, что она держалась близко к центральной линии трассы. Было 3 уровня наград, делящих ширину колеи на 3 расстояния от центра. Ближайшие к центру получали наибольшее вознаграждение, и вознаграждение соответственно уменьшалось. Если машина сошла с колеи / за пределы ширины колеи, на нее начислялась отрицательная награда. Награда уменьшалась, если машина двигалась слишком медленно (дроссельная заслонка ниже определенного порога) и если она ехала хаотично (слишком далеко влево или вправо). Я также добавил награду за прогресс - я хотел подчеркнуть, что он должен идти полностью по трассе. Я всегда делаю это со своим щенком, если я тренирую его поведению, которое может включать несколько шагов, я гарантирую, что по мере его прогресса я буду больше волноваться, чтобы он знал, что движется в правильном направлении, и был поощрен к завершению всей задачи .

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

А теперь я применяю к модели гоночную стратегию. У меня действительно есть несколько вопросов, которые мне нужно здесь рассмотреть. Сколько рекомендаций мне нужно дать модели? Если я стану слишком конкретным, то разве я не просто «жестко кодирую» и разрушаю цель машинного обучения? Разве не прелесть этих моделей в том, что они могут найти лучший путь для достижения чего-либо, настолько, что они даже могут научить нас новым или лучшим подходам? Так что, возможно, мне просто нужно выяснить, как сделать цель очень ясной для моей модели, чтобы она могла найти лучший подход сама по себе.

На этом этапе я решил вернуться к цели и снова проработать логику вознаграждения. Цель - как можно быстрее закончить один круг по трассе. Но есть некоторые правила. Оставайтесь в пределах белых линий, не сбивайтесь с пути. Имеет ли значение, если вы останетесь в центре? На самом деле, прижаться к внешнему краю трассы при приближении к повороту - это часть гоночной стратегии. Поэтому ответ - нет, нам не нужно придерживаться центра, мы получаем выгоду от использования всей ширины колеи. Моя первая модель, казалось, ехала прямо и часто недостаточно поворачивала на поворотах, поэтому сошла с пути - возможно, общее снижение вознаграждения за чрезмерное рулевое управление было не лучшим вариантом. Мне нужно было, чтобы он хорошо крутился на поворотах. Мне также нужно было, чтобы он замедлился при приближении к повороту, поэтому общее снижение вознаграждения на более низких скоростях может быть не оптимальным? Я по-прежнему считаю, что прогресс здесь - хороший выбор, поскольку он относится к цели прохождения круга.

Узнайте больше о стратегии автомобильных гонок здесь:



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

Я смог опробовать четыре свои модели на треке в реальной жизни. К моему удивлению, единственная модель, которая могла проехать полный круг без отклонения от трассы, была самой простой. Значит ли это, что меньше контроля, больше руководства? Разве более простые награды работают лучше? Были ли мои награды неясными? Требует ли более сложная система вознаграждения более продолжительного обучения модели? Требует ли более сложная система вознаграждения корректировки гиперпараметров? Требуются дальнейшие исследования, а также изучение того, как отлаживать модель, как полностью интерпретировать диаграммы и журналы и т. Д.

Моя последняя модель на самом деле тоже неплохо справилась. Он смог ехать прямо и пройти несколько поворотов, прежде чем сойти с трассы. Возможно, ему просто нужно больше времени на тренировку, я тренировал его всего 1 час, может быть, еще 1 может помочь.

Кроме того, после того, как модель закончила обучение, продолжает ли она учиться, когда я проверяю ее в реальной жизни (загружаю модель в DeepRacer и гоняю по трассе)? Сохраняется ли функция вознаграждения в модели и продолжает ли она влиять на ее поведение? Потому что, оказавшись на трассе, когда мы подключились к нашей машине по IP-адресу, мы смогли управлять дроссельной заслонкой. В некоторые моменты, когда казалось, что машина ехала более хаотично и казалось, что она может соскользнуть с трассы, я замедлял ее, чтобы у нее было больше времени для принятия более точных решений. Если бы он сохранил функцию вознаграждения, которая * могла бы * объяснить, почему несколько раз моя машина, казалось, теряла волю к жизни и просто останавливалась, когда я немного понижал газ - возможно, из-за медленного снижения вознаграждения за вождение, которое я добавил к этой модели. Хотя функция вознаграждения была звездой в этом упражнении, мое любопытство задето, и я рад продолжить изучение обучения с подкреплением, чтобы лучше понять, как эти модели работают под капотом и что на самом деле происходит за кулисами.

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