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

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

Используя исторические данные, мы обучаем динамическую модель, которую можно рассматривать как своего рода симулятор окружающей среды, поскольку нам не разрешено тренироваться на месте. Используя исторические данные и анализируя пары наблюдение-действие, мы можем предварительно обучить нашего агента имитировать текущую политику.

Наконец, мы используем современные алгоритмы обучения с подкреплением, такие как TRPO и PPO, чтобы улучшить изученную политику с помощью симулятора, гарантируя, что обновленная политика никогда не будет работать хуже, чем исходная политика.

Чтобы оценить жизнеспособность нашего решения, мы провели тесты в простой среде Тренажерный зал CartPole. CartPole - это игра с балансировкой полюсов, состоящая из 4-х мерного пространства наблюдения: положение тележки, скорость тележки, угол полюса, угловая скорость полюса, все из которых инициализируются случайными значениями в интервале [-0,05, 0,05], и два возможных действия. , двигаясь влево или вправо.

Игра продолжается до тех пор, пока игроку удается удерживать шест в определенном радиусе, при этом тележка не покидает экран. Оценка - это количество успешных шагов, и средний балл выше 200 обычно считается допустимым решением.

Для генерации данных журнала, необходимых для обучения модели динамики и предварительного обучения агента, была обучена случайная политика, средняя оценка которой составила около 175. Мы позволили ему сыграть 100 000 игр, записали их все и собрали эти данные в большой, сбалансированный набор данных.

Мы обучили как динамическую модель, так и агент, используя этот сгенерированный набор данных, и результаты были потрясающими. Все выглядело хорошо, все контролировалось - по крайней мере, я так думал. Используя Tensorboard Google Tensorflow, у меня были графики и визуальные эффекты практически всего. Функции затрат, распределение весов нейронной сети, точность и т. Д.

При тестировании решения в реальной среде я был ошеломлен, когда симулятор не работал. Было сделано много странных оценок, которые я не мог объяснить. Я потратил неделю на отладку каждого модуля системы, дважды проверяя все, но безрезультатно.

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

Давайте посмотрим.

Визуализация данных

Как вы могли заметить, эти игры очень похожи. Как и 99,997 других игр в нашем наборе данных. «Случайная» политика, которую я тренировал, не обращая особого внимания на ее особенности, оказалась совершенно противоположной. Все 100 000 игр оказались правыми. Это означало, что большая часть пространства наблюдения никогда не исследовалась во время фазы обучения нашей динамической модели, которая затем не могла быть обобщена, не изучая левую / правую симметрию.

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

Исправление исследования политики

Итак, чтобы исправить это, первым делом нужно создать политику, которая исследует все пространство состояний (как влево, так и вправо). Для этого есть два основных метода:

  • Применение достаточного шума к выходу сети политик, чтобы вызвать случайные случайные действия.
  • Применение достаточного шума непосредственно к весам политики сети (как предлагает OpenAI).

В итоге мы остановились на первом методе, поскольку его очень легко реализовать, и пока мы просто экспериментируем с динамической моделью.

На следующем графике показана гистограмма встреченных x-позиций по всему набору данных, сгенерированному новой политикой:

Успехов! Полюс теперь движется вправо и влево, полностью исследуя пространство состояний.

Исправление модели динамики

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

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

Но, конечно, зачем это нужно? Поразмыслив над этим в течение нескольких минут, это на самом деле становится очень очевидным. Следуйте за мной сюда:

  • Модель динамики принимает в качестве входных данных предыдущее состояние наблюдения и предыдущее действие.
  • Результатом динамической модели является прогнозируемое следующее состояние наблюдения за окружающей средой.
  • Модель динамики обучается с использованием обратного распространения в наборе данных зарегистрированных эпизодов для предварительно обученной политики.

И поскольку любой обучающий эпизод завершается при достижении любого из граничных условий Cartpole (например, x ›2,4 или x‹ -2,4), это означает, что в обучающих данных нет ни одного состояния наблюдения за пределами этих границ. И поэтому совершенно очевидно, что наша динамическая модель никогда не сможет предсказать одно из этих состояний ...

Опять же, очевидное решение представилось:

  • Убедитесь, что модель динамики обучена переходам через «граничную зону завершения», снова настроив обучающий набор.

Но после погружения в более сложную литературу по обучению с подкреплением выясняется, что не только мы столкнулись с этой проблемой. Группа Сергея Левинеса в Калифорнийском университете в Беркли опубликовала статью в августе 2017 года, в которой подробно описывается решение именно этой проблемы.

Вместо того, чтобы модель динамики предсказывала следующее состояние наблюдения s +, они предсказали разницу между следующим состоянием и текущим!

Каждое следующее состояние s + затем строится как сумма текущего состояния s и выходных данных модели динамики Delta (s):

Код TensorFlow для простейшей из возможных версий модели динамики (простая однослойная ванильная сеть) выглядит следующим образом:

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

И, наконец, у нас есть работающая динамическая модель. Чтобы проверить, насколько хорошо динамическая модель соответствует реальной среде, мы проводим следующий эксперимент:

  • Загрузить предварительно обученного агента
  • Инициализируйте новый объект Gym env («Cartpole») и сбросьте его, чтобы получить obs_real_start.
  • Установите начальное состояние модели динамики равным «obs_real_start»
  • Отсюда мы можем выбирать действия с нашим агентом, используя в качестве входных данных предсказанные наблюдения из динамической модели.
  • На каждом этапе мы сравниваем прогнозируемое состояние из динамической модели с реальным состоянием из Gym.env (выбирая те же действия) и печатаем l2_loss на каждом этапе.
  • Как только одно из состояний наблюдения (прогнозируемое / реальное) указывает на завершение эпизода, мы останавливаемся и распечатываем номер шага и окончательный l2_loss.

Вот результат:

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

Итак, теперь у нас есть достойная динамическая модель, которую можно использовать для оптимизации агента с помощью тонкой настройки вне политики, без взаимодействия с реальной средой!

Конечно, в этом блоге показано только то, что вы можете делать с простейшими базовыми моделями (однослойные сети прямого распространения) без особой регуляризации. На практике вы, очевидно, захотите использовать LSTM в сочетании с такими методами, как dropout и Batchnorm. Но основной рабочий процесс остается прежним.

Если вам интересно узнать больше о том, как мы масштабируем эту концепцию для оптимизации реальных производственных сред, взгляните на нашу платформу ECC.ai!

Ваше здоровье :)