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

Первой простой задачей, за которую я взялся, была игра FrozenLake. Игра проста, окружающая среда представляет собой квадрат 4 на 4, где игрок начинает с квадрата S и переходит к квадрату G. Падение в яму или квадрат H означает, что игра окончена. Реализация этой игры в библиотеке тренажерного зала имеет простую функцию вознаграждения. 1, если агент достигает цели, 0, если нет. Пространство действия — это всего лишь четыре стороны света, а пространство наблюдения — 16 возможных квадратов, в которых может находиться игрок. В игре также есть одна загвоздка: пол скользкий, и есть шанс, что вы можете двигаться в случайном направлении каждый ход. Однако, чтобы посмотреть, работает ли встроенная политика, я отключу скользкий режим.

Так как же агент строит свою политику? Существует множество различных способов реализации обучения с подкреплением, таких как итерация ценности или политики, решение MDP, TD-обучение, но я буду изучать Q-обучение.

В Q-обучении агент хочет максимизировать значение «Q», которое является значением, которое отображается в определенном состоянии и действии. В начале будет инициализирована таблица Q, где мощность Q(s, a) равна пространство действия × пространство наблюдения. Агент играет в игру на протяжении многих эпизодов и по ходу строит таблицу q.

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

После того, как агент выберет действие, мы будем использовать приведенное ниже уравнение, чтобы агент мог «обучиться». В уравнении max_a Q(S_t+1, a) — это значение q наилучшего действия для следующего состояния после того, как агент выполнит свое действие. Q(S_t, A_t) — это значение q текущего состояния. Значение q для следующего состояния умножается на гамму, коэффициент дисконтирования, поскольку оно находится на расстоянии одного временного шага, концепция, при которой будущие вознаграждения стоят меньше, чем немедленное вознаграждение. R_t+1 — награда после выполнения действия. Вместе вознаграждение + разница между дисконтированной будущей полезностью и текущей полезностью — это то, каким, по мнению агента, должно быть текущее значение q. Целевое значение умножается на альфу, скорость обучения, чтобы подтолкнуть текущее значение q к «истинному» значению q, которое агент узнает с течением времени.

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

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

Хотя все это просто и дешево в вычислительном отношении, для задачи FrozenLake требуется только q-таблица размером 4 * 16 = 64. Что, если бы мы захотели использовать Q-learning для более сложной среды? Возьмем в качестве примера задачу CartPole.

Задача CartPole — это игра, в которой шест балансирует на тележке, которую можно толкать влево или вправо. Возможные действия для этой проблемы только применение силы +1 или -1. Однако пространство наблюдения является непрерывным. Заданное состояние в пространстве наблюдения состоит из положения тележки, скорости тележки, угла полюса и угловой скорости полюса. Q-таблица в этом случае не сработает. Вот где вступает в действие Deep Q-learning.

В глубоком Q-обучении вместо таблицы поиска Q(s, a) мы можем думать о Q(s, a) как о функции. Если мы рассмотрим уравнение обновления Q, оно похоже на то, как обучается нейронная сеть. «Цель», которая представляет собой вознаграждение + дисконтированная будущая полезность, — это то, каким должно быть значение q. Q(S_t, A_t) — это то, что модель считает текущим значением q. Разница между ними будет заключаться в потерях, и мы можем медленно обновлять веса сети со скоростью обучения. С помощью нейронной сети мы можем настроить сеть, предоставив состояния и целевое значение q, и сеть будет возвращать пространство действий и значения q для каждого действия, когда мы используем его для прогнозирования.

Система вознаграждений в игре CartPole проста. За каждый временной шаг, когда шест был в вертикальном положении, вы получали бы +1. После попытки внедрить глубокое Q-обучение для игры CartPole я получил в среднем 10 баллов, несмотря на запуск алгоритма для 100 эпизодов. Фактически, через некоторое время затухание эпсилон приводит к тому, что эпсилон приближается к 0, поэтому функция Q сходилась к субоптимальной политике. Проблема заключалась в том, что когда мы подгоняли сеть к последнему состоянию, модель постепенно «забывала» о прошлых препятствиях, которые у нее были, и возвращалась к исходной точке. Хотя модель учится преодолевать определенное препятствие, более поздние состояния не будут сталкиваться с этим препятствием, поэтому вес сети сместится с решения на это препятствие.

Решением этой проблемы является воспроизведение опыта. Мы сохраняем «воспоминания» о прошлых состояниях и действиях и воспроизводим эти воспоминания, чтобы информировать модель о своем прошлом. Реализация воспроизведения опыта будет состоять в том, чтобы хранить массив кортежей (состояние, действие, вознаграждение, новое_состояние, isOver), где сеть соответствует случайному набору состояний, а не просто соответствует последнему состоянию. Используя этот метод, агент получил средний балл 430,26 за 50 воспроизведений при тестировании политики.

Давайте сравним это со случайной игрой со средним результатом 21,48.

Давайте сравним это с человеческой игрой. Я набираю в среднем 30,8 баллов за 45 прохождений, но, в отличие от случайной игры, человеческая игра со временем «научится».

Если мы посмотрим на скорость обучения для человеческой игры по сравнению с глубоким q-обучением, мы увидим, что скорость обучения выше для машины! Очевидно, эталоном человеческой игры является только один игрок, которым являюсь я, так что это не точная мера человеческой производительности. Давайте посмотрим, сможем ли мы улучшить наш алгоритм обучения с подкреплением. Несколько вещей, которые мы могли бы настроить, это размер партии, чтобы увеличить «память», система вознаграждения, гиперпараметры для нашей нейронной сети и, возможно, многое другое, но здесь мы собираемся изменить систему вознаграждения. Вместо простого +1 за каждый временной шаг мы будем масштабировать вознаграждение в соответствии с диапазоном угла полюса. CartPole-v1 прекращает работу после того, как угол полюса превысит [-0,418, 0,418] радиан, поэтому мы допустим вознаграждение = 1-|a/0,418| с углом полюса в радианах, чтобы придать больший вес углу полюса, который является более вертикальным. Вот результаты:

Похоже, производительность намного лучше. Обратите внимание, что после 10 эпизодов счет никогда не падает ниже 100, по сравнению с исходной стратегией, где счет иногда резко падает после 120 эпизодов. Я предполагаю, что это может быть связано с тем, что шест имеет стимул оставаться на уровне 0 радиан, поэтому у шеста меньше возможностей для падения, в то время как старая система вознаграждения по-прежнему дает такое же вознаграждение, если шест вот-вот упадет, но в определенных пределах. Тестируя эту политику на 50 играх, мы набрали в среднем 489,88 балла. Это на целых 50 баллов больше, чем в среднем по старой системе.

В целом, это был забавный первый взгляд на обучение с подкреплением. В будущих постах я, возможно, попытаюсь рассмотреть некоторые из более сложных сред, таких как игры Atari в спортзале OpenAI, или попытаюсь написать среду самостоятельно. Когда я просматривал среду тренажерного зала, там был раздел Box2D, где было множество сценариев, смоделированных с помощью физической библиотеки Box2D. Это было неожиданностью, так как я работал с Box2D, когда создавал свою RPGConcept (см. мои посты от 2018 года)! Возможно, я сделаю свою среду на Java. В конечном счете, я хочу иметь возможность делать что-то в Minecraft, используя Malmo, платформу для экспериментов с искусственным интеллектом, созданную поверх Minecraft от Microsoft.

Код: https://github.com/chengxi600/RLStuff/blob/master/Q%20Learning/QLearning_DQN.ipynb