Как сопоставить оценку DeepMind Deep Q-Learning в Breakout

Если вы так же увлечены Deep Q-Learning, как и я, но у вас никогда не было времени понять или реализовать его, это для вас: в одной записной книжке Jupyter я 1) кратко объясню, чем обучение с подкреплением отличается от обучения с учителем, 2) обсудите теорию, лежащую в основе Deep Q-Networks (DQN), рассказав вам, где вы найдете соответствующие объяснения в статьях и что они означают, и 3) как реализовать компоненты, необходимые для работы в python и tensorflow.

В 2013 году лондонский стартап DeepMind опубликовал новаторский документ под названием Игра в Atari с глубоким обучением с подкреплением на arXiv: авторы представили вариант обучения с подкреплением под названием Deep Q-Learning, который позволяет успешно изучать политики управления для различных игр для Atari 2600. получение в качестве входных данных только пикселей экрана и награды при изменении счета игры. В некоторых из этих игр агент даже превосходит людей-экспертов! Это поразительный результат, потому что раньше ИИ ограничивались одной единственной игрой, например, шахматами, тогда как в этом случае типы и содержание игр в Аркадной обучающей среде значительно различаются, и при этом не требуется корректировки архитектуры. требуется алгоритм обучения или гиперпараметры.

Неудивительно, что DeepMind был куплен Google за 500 миллионов долларов. С тех пор компания является одним из ведущих институтов, продвигающих исследования в области глубокого обучения, и более поздняя статья, посвященная DQN, была опубликована в Nature.

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

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

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

Deep Q-Learning требует для работы нескольких компонентов, таких как среда, которую агент может исследовать и изучать, предварительная обработка кадров игр Atari, две сверточные нейронные сети, ответ на дилемму исследования-эксплуатации (электронная жадность), правила для обновления параметров нейронных сетей, отсечения ошибок и буфера, называемого памятью воспроизведения, где прошлые игровые переходы сохраняются и извлекаются при обучении.

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



Здесь я опишу эксперименты, которые я проводил с помощью записной книжки, и, что более важно, мелкие детали, которые я обнаружил во время их выполнения, которые оказались критически важными для правильной работы DQN: В нескольких темах обсуждаются проблемы с сопоставлением оценок, о которых сообщает DeepMind (см. Здесь, Здесь и здесь), и я изначально боролся с похожими проблемами.

Приступим: Понг

Я начал свои эксперименты со средой Pong, поскольку ее относительно легко и быстро изучить для агента DQN из-за ее простоты: агент управляет ракеткой, которую можно перемещать вверх и вниз, и цель состоит в том, чтобы отбить мяч в таким образом, чтобы противник не мог до него добраться. Игра заканчивается, когда один из игроков набирает 21 очко.

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

В начале обучения агент DQN выполняет только случайные действия и, таким образом, получает вознаграждение около -20 (что означает, что он безнадежно проигрывает). После 30-45 минут тренировки агент уже научился бить по мячу и может набирать первые очки.

Сплошной линией показано вознаграждение за обучение (среднее количество баллов за тренировочные эпизоды за последние 100 эпизодов), а пунктирной линией - оценочный балл (средний балл за эпизод после 10 000 кадров жадного игрового процесса). Одна эпоха эквивалентна 50 000 обновлений параметров или 200 000 кадров.

Оценка быстро достигает максимального значения +21. Оценка обучения остается ниже из-за политики электронной жадности с эпсилон-отжигом, используемой во время обучения. На гифке слева все очки начисляются почти одинаково, что означает, что агент обнаружил почти идеальную стратегию. Мне бы хотелось, чтобы два агента DQN научились играть друг против друга, но в настоящее время тренажерный зал OpenAi не поддерживает многопользовательский Pong.

Далее: Прорыв

Давайте посмотрим на Breakout, среду, показанную в видео, которая изначально заставила меня захотеть реализовать DQN самостоятельно после того, как я увидел, как агент роет туннель сбоку от экрана, который позволяет мячу попадать в блоки, подпрыгивая сзади. стена.

В статье Nature Mnih et al. 2015 , DeepMind сообщает, что Breakout получил оценку 317 баллов. Я запустил записную книжку на Breakout в течение ночи, надеясь на аналогичный результат. После первоначального успеха с Pong я взволнованно проснулся на следующее утро, чтобы проверить улучшения агента, и обнаружил, что награда достигла плато около 35 без каких-либо дальнейших улучшений. О той же проблеме, касающейся DQN и Breakout (без окончательного ответа на вопрос, в чем проблема), сообщалось здесь: Максимум результатов решения DQN составляет ~ 35 вознаграждений.

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

Уменьшив скорость обучения, я получил награду примерно до 50, что по-прежнему составляло всего около 15% от того, что сообщает DeepMind.

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

Wang et al. 2016 сообщают о 418,5 (Double DQN) и 345,3 (Dueling DQN) для Breakout (Таблица 2). Лучший оценочный эпизод, который я видел во время своих экспериментов, получил 421 балл (показан в начале этой статьи). Если вы хотите попробовать это сами, клонируйте репозиторий и запустите записную книжку. Соответствующие параметры сети включены, и, поскольку я тренировал Breakout в детерминированной среде (BreakoutDeterministic-v4), вы должны получить такой же результат.

Какие корректировки потребовались для достижения этого улучшения?

  1. Используйте правильный инициализатор! DQN использует функцию активации Relu, и правильный инициализатор - He et al. 2015 уравнение 10 ( щелкните здесь, чтобы получить подробное объяснение ). В тензорном потоке используйте tf.variance_scaling_initializer с scale = 2.
  2. Убедитесь, что вы обновляете целевую сеть с правильной периодичностью: в документе говорится, что частота обновления целевой сети измеряется количеством обновлений параметров (которые происходят каждые четыре кадра, см. Расширенная таблица данных 1 в Mnih et al. 2015), тогда как в коде DeepMind он измеряется количеством вариантов действий / кадров, которые видит агент. Давайте посмотрим на код DeepMind: Здесь вы можете увидеть, что по умолчанию update_freq=4 и target_q=10000 (строки 14 и 31). Здесь вы можете видеть, что по умолчанию обновления параметров происходят каждые 4 шага (self.numSteps%self.update_freq==0) и здесь, что целевая сеть обновляется каждые 10.000 шагов (self.numSteps%self.target_q==1) - частота обновления целевой сети, таким образом, измеряется в numSteps, а не в обновления параметров.
  3. Убедитесь, что ваш агент действительно пытается изучить ту же задачу, что и в статье DeepMind!
    Я обнаружил, что передача терминального состояния в память воспроизведения при потере жизни (как это сделал DeepMind) имеет огромное значение. Это имеет смысл, поскольку в противном случае за потерю жизни не будет отрицательной награды, и агент не замечает, что потеря жизни - это плохо.
    DeepMind использовал минимальный набор из четырех действий в Breakout (xitari), несколько версии Breakout спортзала OpenAi имеют шесть действий. Дополнительные действия могут резко изменить сложность задачи, которую пытается изучить агент! Среды Breakout-v4 и BreakoutDeterministic-v4 имеют четыре действия (отметьте env.unwrapped.get_action_meanings()).
  4. Используйте функцию потерь Хубера (Mnih et al. 2013 называют эту ошибку отсечением), чтобы избежать взрывных градиентов. Градиенты обрезаются до определенного порогового значения, если они превышают его. Обратите внимание, что по сравнению с квадратичной функцией потерь производная зеленой кривой на графике, показанном ниже, не увеличивается (и не уменьшается) для x ›1 (или x‹ −1).

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

Если вы хотите обучить сеть самостоятельно, установите TRAIN на True в первой ячейке записной книжки.

Подумайте о том, чтобы сделать ваш компьютер доступным удаленно, что я описал в этом сообщении блога: Удаленный доступ к вашей станции глубокого обучения и настройка пробуждения по локальной сети. Вы можете преобразовать записную книжку в сценарий python, используя jupyter-nbconvert --to script DQN.ipynb, а затем запустить его в сеансе tmux, который я описал здесь: jupyter и тензорная доска в tmux. Это имеет то преимущество, что вы можете отсоединиться от сеанса tmux и повторно подключиться к нему удаленно, чтобы проверить работу агентов или внести изменения в код, где бы вы ни находились.

Если вы хотите использовать тензорную плату для отслеживания улучшений сети, введите tensorboard --logdir=summaries в терминале, в котором активирована соответствующая виртуальная среда. Откройте браузер и перейдите по адресу http: // localhost: 6006. Это также работает удаленно.

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

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

Поэтому я рекомендую вам попробовать реализовать DQN с нуля для себя и, при необходимости, посмотреть мой код для сравнения, чтобы узнать, как я реализовал различные компоненты. Не стесняйтесь писать мне сообщение, если вам нужны разъяснения или подсказки, я буду рад помочь.

Повеселись :)

Фабио