Deep Q-Networks Explained — LessWrong

МЕНЮ


Главная страница
Поиск
Регистрация на сайте
Помощь проекту
Архив новостей

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Примечание: это длинный пост. Пост построен таким образом, что не всем нужно читать все — разделы 1 и 2 представляют собой справочную информацию, которую можно пропустить, а разделы 4 и 5 посвящены техническим деталям, которые не все хотят или должны знать. Раздела 3 самого по себе достаточно, чтобы получить общее представление о DQN, если вы уже знаете, как работает обучение с подкреплением.

Этот пост был моим последним проектом курса «Основы безопасности AGI» .

Целью этого поста является краткое  изложение Deep Q-Networks — нейронных сетей, обученных с помощью Deep Q-Learning. Алгоритм, обычно называемый просто DQN, — это алгоритм, который впервые представил на карте глубокое обучение с подкреплением. Статья  2013 года также является первой статьей в разделе «Ключевые статьи» превосходного  ресурса Spinning Up In Deep RL . В результате любой, кто хочет понять обучение с подкреплением, скорее всего, начнет здесь. Поскольку чтение и копирование статей может быть затруднено, цель этого ресурса — немного облегчить процесс обучения для тех, кто хочет улучшить свои знания в области машинного обучения после начального курса глубокого обучения.

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

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

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

Обучение с подкреплением (раздел 2)  — Справочная информация по RL. Это можно смело пропустить, если вы уже знакомы с основами обучения с подкреплением, такими как состояния, действия и почему обучение с подкреплением сложнее, чем обучение с учителем.

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

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

Репликация DQN (раздел 5).  Этот раздел основан на разделе 4 и включает советы и рекомендации по работе DQN в коде. Я рекомендую читать этот раздел только в том случае, если вы заинтересованы в самостоятельном воспроизведении этой или подобных статей.

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

Независимо от того, как далеко вы продвинулись, отзывы, безусловно, приветствуются — одна из целей этого поста — проверить, готов ли я выполнять дополнительную работу по дистилляции, поэтому, если вы нашли это полезным (или бесполезным), я буду рад услышать об этом!

Контролируемое обучение с использованием нейронных сетей (раздел 1)

Чтобы понять контролируемое обучение, давайте начнем с игрушечной задачи, которую часто используют для сравнения алгоритмов и проверки их работоспособности, прежде чем применять их к более сложным областям. MNIST — это набор данных, состоящий из десятков тысяч рукописных цифр от 0 до 9. Каждый фрагмент данных содержит изображение в оттенках серого размером 28x28 пикселей и метку того, к какой цифре это изображение следует отнести.

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

Вопрос, который мы можем задать - возможно ли вообще написать программу, которая бы правильно размечала эти изображения? Точнее, можем ли мы написать программу, которая будет правильно маркировать похожие изображения, которые мы раньше не видели? Ответ здесь должен быть да. Если бы было вычислительно невозможно принять 784 пикселя в качестве входных данных и вернуть цифру в качестве выходных данных, люди тоже не смогли бы этого сделать! Поэтому должен быть какой-то способ принимать эти пиксели в качестве входных данных и почти всегда возвращать правильный результат. Я говорю «почти», потому что вы можете себе представить, что я, возможно, очень плохо пишу цифры — возможно, я пишу 6, которая выглядит как 8.

Это 6 или 8? Вы можете видеть, как это будет трудно сказать.

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

Представьте, что у нас есть некая теоретическая математическая функция, которая принимает на вход 784 пикселя и выводит распределение вероятностей того, насколько вероятно, что изображение будет содержать каждую цифру от 0 до 9. Для этого существует некоторая оптимальная функция, но ее практически невозможно найти. Суть машинного обучения заключается в поиске способа  аппроксимации этой функции — итеративного приближения к этой функции, пока наше приближение не станет достаточно хорошим, чтобы компьютер мог выполнить задачу. Обычный способ сделать это, а также способ, которым мы будем подходить к DQN позже, — это использование нейронной сети. Это 20-минутное видео представляет собой хорошее введение. Таким образом, обучение нейронной сети выполнению контролируемой задачи обучения включает в себя следующие этапы:

  1. Для начала настройте нашу нейронную сеть совершенно случайным образом [1]
  2. Возьмите группу изображений и предложите сети угадать, что это за изображения.
  3. Обновите нейронную сеть, чтобы она лучше предсказывала изображения, если вы их повторите. В частности, мы обновляем нейронную сеть, чтобы минимизировать  ошибку прогнозирования — разницу между правильными прогнозами (1 для правильной категории, 0 для всего остального) и тем, что предсказала сеть.
  4. Повторяем шаги 2 и 3, пока не будем удовлетворены результатом.

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

Обучение с подкреплением (раздел 2)

Обучение с подкреплением (RL) — совсем другое дело. В обучении с учителем мы пытались улучшить прогнозы, а в обучении с подкреплением мы хотим максимизировать будущую награду. Эта награда зависит от поставленной задачи. В среде, где сеть (называемая агентом  в обучении с подкреплением) управляет роботом, что мы должны вознаграждать? Это зависит от того, чего мы хотим — это может быть максимальное пройденное расстояние, сальто назад или что-то еще, что мы можем указать.

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

Для игр Atari, которые являются предметом сегодняшней статьи, максимальное вознаграждение — это игровой счет. Итак, каковы здесь входы и выходы? Deep Q-Networks являются примером  безмодельного RL. В безмодельном RL у агента нет явной модели [2]  правил игры или того, что он вообще играет в игру. Он учится, что делать, исключительно на основе входных данных, которые мы ему передаем, в данном случае пикселей из среды Atari.

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

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

Итак, мы имеем здесь набор пикселей в качестве входных данных и распределение вероятностей (MNIST) или ожидаемое будущее вознаграждение (Atari) в качестве выходных данных. Это начинает во многом напоминать нашу проблему MNIST.


МНИСТАтари
Входные данные (набор пикселей)Рукописная цифраИзображение видеоигры [3]
ВыходРаспределение вероятностей того, насколько вероятно, что входные данные представляют собой каждую цифру.Ожидаемая будущая награда за каждое следующее действие, которое мы можем предпринять на изображении.

Таким образом, мы свели нашу проблему обучения с подкреплением к задаче обучения с учителем! Мы даже можем использовать один и тот же тип сети, известный как  сверточная нейронная сеть , для решения задач MNIST и Atari. Итак, проблема обучения с подкреплением решена, верно? Ну... не совсем. Есть еще несколько проблем, над которыми нам нужно работать.

Предположения о данных. При обучении с учителем мы предполагаем, что входные данные  независимы  и  одинаково распределены. В MNIST, если первое изображение имеет цифру 3, это не имеет никакого отношения к тому, каким будет следующее изображение. Они также одинаково распределены: если у вас есть набор данных, состоящий из 50% кошек и 50% собак, предполагается, что данные будут взяты из этого распределения. Это не так в играх Atari. Если я сделаю ход в игре Atari, это напрямую повлияет на следующий ввод, который я получу. Кроме того, базовое распределение постоянно меняется. Если я играю в Space Invaders, я никогда не увижу игровое состояние, в котором половина кораблей исчезла, если только я не смогу сначала сбить другую половину, что ограничивает возможные наблюдения, которые я мог бы получить.

Награда скудная. Всякий раз, когда MNIST угадывает изображение случайным образом, он сразу же узнает, где что-то пошло не так и что нужно изменить, чтобы улучшить себя. В большинстве игр Atari вероятность того, что случайное действие приведет к получению награды, мала. Мы получаем вознаграждение только в том случае, если успешно набираем очки. Если мы не набираем очков, что нам делать тогда? А для подсчета очков часто требуется несколько совместных действий. В Space Invaders вам нужно переместить корабль в нужную точку, нажать кнопку огня и пуля поразит корабль. В Pong вам нужно вывести ракетку противника из позиции, перехватить мяч на своей стороне поля, а затем запустить мяч мимо него, чтобы забить. 

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

ПроблемаРешение
Допущения о данных (независимые, одинаково распределенные)Буфер воспроизведения опыта (см. раздел 3).
Награда редкаяЭпсилон-жадное исследование (см. разделы 3–4)
Оптимальная политика неизвестнаQ-Learning (см. раздел 4)

Именно эти три проблемы сделали обучение с подкреплением такой сложной проблемой. Только когда  появилась Deep Q-Networks , эти проблемы были решены впервые.

Обзор DQN (раздел 3)

Есть две статьи, на которые обычно ссылаются, когда говорят о Deep Q-Networks (DQN). Один из них датирован 2013 годом ( Игра в Atari с помощью обучения с подкреплением ), а другой — 2015 года. ( Контроль на человеческом уровне посредством обучения с подкреплением ). Для наших целей мы будем использовать статью 2015 года. Оба очень похожи, но статья 2015 года включает в себя пару дополнительных приемов для улучшения алгоритма и упоминает больше гиперпараметров  [ 4]  , используемых для обучения сети.

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

Уоткинс и Даян опубликовали в 1992 году доказательство того, что Q-Learning будет сходиться к оптимальным значениям действий, пока мы  неоднократно отбираем все действия во всех состояниях , а возможное пространство действий дискретно [5] . На самом деле мы не можем выбрать все возможные состояния игры, поэтому идея DQN состоит в том, чтобы подойти достаточно близко к этому предположению, чтобы мы могли сойтись к Q-функции, которая достаточно хороша, чтобы хорошо играть в игру. В частности, мы хотим выполнить выборку широкого распределения состояний игры, время от времени выполняя случайные действия, и мы хотим выполнять их неоднократно. Вскоре мы увидим больше об этом.

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

Что касается самой программы, мы собираемся разбить ее на части —  настройка , часть, в которой агент действует в окружающей среде ( фаза действия ), и часть, в которой агент тренируется, чтобы добиться большего успеха в будущем ( фаза обучения ). . Эти последние две фазы могут быть полностью отделены друг от друга [6] ,  но в статье DQN на первом месте стоит фаза действия.

При настройке создаем следующие вещи:

  • Список, в котором хранятся данные о том, что агент видел и делал на данный момент. Это называется  буфером воспроизведения опыта.
  • Нейронная  сеть , которая принимает данные наблюдения и выводит ожидаемое общее вознаграждение за каждое возможное действие, которое она может предпринять. Это используется на актерском этапе.
  • Копия нейронной сети, которая обновляет только каждые C (C=1000) временных шагов. Это используется на этапе обучения для повышения стабильности DQN и называется  целевой сетью.

На актерском этапе мы выполняем следующие действия:

  • Передайте  наблюдение  в момент времени  в качестве входных данных нейронной сети, которая выводит ожидаемое будущее вознаграждение за каждое возможное действие, которое мы можем предпринять.
  • Выберите  действие . Для этого мы выбираем случайное действие с вероятностью эпсилон [7] , а в остальное время выбираем действие с наибольшей ожидаемой будущей наградой. Это называется  эпсилон-жадной стратегией исследования.
  • Получите  награду и наблюдение в момент  t+1 из окружающей среды.
  • Сохраните наблюдение в момент времени t, предпринятое нами действие, полученную нами награду, завершен ли текущий эпизод, а также наблюдение в момент времени t+1 в  буфере воспроизведения опыта  для последующего использования на этапе обучения.

На этапе действия создаются данные для использования на этапе обучения, где агент учится действовать лучше.

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

Всякий раз, когда мы предпринимаем действие, мы сохраняем наблюдение в  момент t,  действие, награду, независимо от того, выполнен эпизод или нет, а также наблюдение в момент  t+1 в этом буфере воспроизведения. Затем, когда приходит время улучшить нашу политику посредством обучения, мы берем пакет из 32 случайных действий из нашего буфера опыта и используем их для обучения агента.

Подумайте о тренировочном процессе следующим образом. Вы учитесь играть в шахматы, поэтому начинаете играть. Поначалу ты не очень хорош, но записываешь все свои движения. Затем после каждой игры вы просматриваете случайную выборку этих ходов [8]  и спрашиваете себя, какой ход вам следовало сделать. Со временем вы научитесь лучше оценивать шахматные позиции и сможете применять эти знания в своих играх. Агент проводит это обучение каждые несколько шагов, а не между играми, но общая идея та же.

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

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

После этого мы можем рассмотреть этап обучения. На этапе обучения мы делаем следующее:

  • Отберите случайную партию Н элементы (N = 32) из буфера воспроизведения.
  • Установите для каждой  цели  обучения текущее вознаграждение (полученное из буфера воспроизведения) плюс  оценку целевой сети будущего вознаграждения с учетом наблюдения в момент  t+1 . Поскольку целевая сеть знает, что произошло в момент  t+1 , а Q-сеть — нет, у нее должен быть более точный прогноз, который можно использовать для обучения Q-сети.
  • Вычислите разницу между целями обучения и  оценкой общего вознаграждения Q-сети , учитывая наблюдение в момент времени  t . Это наша  функция потерь .
  • Выполните  градиентный спуск в Q-сети, чтобы минимизировать эту функцию потерь.
  • Каждый С шагов (C = 1000) обновить целевую сеть с помощью параметров Q-сети.

При изучении этого алгоритма меня смущала одна часть: почему мы пытаемся минимизировать ошибку прогнозирования, а не максимизировать будущую награду. Дэвид Куарел любезно объяснил мне, почему это так. Представьте, что вы всегда точно знаете, какую награду (включая сумму будущих наград) вы получите за любое действие в игре Atari. В этом случае оптимальное действие тривиально — с вероятностью 1 предпринять любое действие, которое максимизирует вашу будущую награду. Выбор действия, которое принесет наибольшую будущую награду, учитывая ваши текущие знания, тривиален; точное знание того, какие действия принесут какое вознаграждение, является сложной задачей.

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

И вот оно! Подводя итог нашему алгоритму, наш агент сначала принимает текущее наблюдение, выводит действие и получает информацию о том, что произошло (награда и следующее наблюдение) из окружающей среды. Затем он учится, случайным образом выбирая выборку своих предыдущих ходов, проверяя, насколько правильным или неправильным было предсказание будущего вознаграждения, и обновляя его в пользу улучшенных прогнозов. Этот алгоритм в сочетании с буфером воспроизведения опыта и целевой сетью для уменьшения расходящегося поведения достаточен для обучения агента достижению сверхчеловеческой игры в некоторых играх Atari.

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

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

Техническое объяснение DQN (раздел 4)

В предыдущем разделе мы сознательно избегали математических вычислений, но здесь мы собираемся углубиться. Из нашего последнего раздела мы знаем, что DQN работает, сходясь к идеальной Q-функции, которая максимизирует общее вознаграждение. Чтобы максимизировать общую награду, мы учитываем текущую награду плюс сумму ожидаемых наград в будущем, с настоящего момента и до конца игры. Мы также применяем к этой сумме ставку дисконтирования, называемую  гаммой (по умолчанию 0,99). При гамме 0,99 временной шаг  t+n  дисконтируется на 0,99н, поэтому постоянная награда, равная 1 за каждый временной шаг, будет равна 1 + 0,99 + 0,9801 и так далее.

Q-функции работают по аналогичному алгоритму, целью которого является максимизация суммы дисконтированных наград с этого момента и до конца игры. Идеальная Q-функция вопрос*(с,а) можно записать следующим образом:

Где ? — наша  политика , ? наша ставка дисконтирования, и рт — награда в момент времени t. Стоит отметить, что вопрос*(с,а) означает оптимальную Q-функцию, тогда как вопрос(с,а) без звездочки представляет текущую Q-функцию. Цель состоит в том, чтобы вопрос(с,а) постепенно прийти к нашему оптимальному вопрос*(с,а).

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

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

Это выглядит сложно, но на самом деле все проще, чем кажется. Давайте вернемся к нашему нематематическому описанию из раздела 3 и немного изменим его:

  • Красная секция: образец случайной партии Н элементы (N = 32) из буфера воспроизведения.
  • Синий раздел: установите для каждой  цели  обучения текущее вознаграждение (полученное из буфера воспроизведения) плюс  оценку будущей награды целевой сети с учетом наблюдения в момент  t+1 . Поскольку целевая сеть знает, что произошло в  момент t+1 , а Q-сеть — нет, у нее должен быть более точный прогноз, который можно использовать для обучения Q-сети.
    Зеленый раздел: Рассчитайте  оценку будущего вознаграждения Q-сети , учитывая наблюдение в момент времени  t.
  • Возьмите среднеквадратическую ошибку [9]  между синей и зеленой секциями. Это наша  функция потерь .

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

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

Initialize experience replay buffer D, Q-network Q, and target Q-network q.  Set q’s parameters to Q.  For each step: 	With probability ?, select a random action. Otherwise, pick the action with the highest expected future reward according to Q(s, a). 	Execute action a, and collect reward r and observation t+1 from the environment. 	Store the transition obs(t), action, reward, obs(t+1) in D.  If current step is a training step: 	Collect a random batch of transitions from D. 	For each transition j, set future reward to r(j) if the episode ended at j, else r(j) + gamma * q(s’, a’). 	Perform gradient descent with respect to the loss function to update Q. 	Every C steps, set q’s parameters to Q.

И вот оно! DQN использует две копии нейронной сети для постоянного совершенствования и приближения к идеальной Q-функции для конкретной среды. Мы используем буфер воспроизведения опыта, чтобы приблизительно удовлетворить требования контролируемого обучения (независимые, одинаково распределенные входные данные) и Q-функций (возможность многократно выполнять все действия во всех состояниях) достаточно точно, чтобы позволить математическим предположениям выполняться в реальной жизни. И теперь вы знаете, как работает DQN!

Но что, если вы хотите это запрограммировать? Тогда вам нужно будет знать более мелкие детали: из чего именно состоит наблюдение? Как мы обрабатываем входные данные Atari? Каковы наши гиперпараметры и какие именно слои есть в нашей нейронной сети? Все эти и другие подробности читайте в разделе 5!

Репликация DQN (раздел 5)

Полный псевдокод для DQN, включая достаточно деталей, чтобы следовать реальному коду, выглядит следующим образом. Я предлагаю следовать вместе с реализацией на этом этапе. Реализацию CleanRL можно найти здесь:  https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/dqn_atari.pyМою реализацию можно найти здесь:  https://github.com/JayBaileyCS/RLAlgorithms/blob/main /DQN_From_Scratch_Atari.ipynbОсновное различие между этими двумя реализациями заключается в том, что я написал свой собственный немного более медленный, но гораздо менее сложный буфер воспроизведения. Если вас интересует максимальная производительность, используйте CleanRL. Если вы хотите узнать немного больше о том, как готовят хот-доги, воспользуйтесь моим. Я также использовал свою реализацию в качестве образца для этой статьи, так что, возможно, за ней будет немного легче следовать. Стоит отметить: обе эти реализации включают некоторые улучшения гиперпараметров по сравнению с документом 2015 года, поэтому, если вы хотите конкретно воспроизвести статью 2015 года, обратите пристальное внимание на гиперпараметры ниже в этом разделе!

Реализация CleanRL слева, моя справа. Красная линия представляет средние результаты статьи за 2013 год. Как видите, с 2013 года мы внесли некоторые изменения, которые значительно улучшили результаты. Вкратце, эти изменения включают добавление целевой сети, использование оптимизатора Адама вместо RMSProp и настройку гиперпараметров.

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

Алгоритм DQN

Set up the Atari environment Set up the device to perform calculations on Set up replay buffer, q_network, target_network, optimiser, and initial observation. Note: Use the RMSProp optimiser instead of Adam if you want a faithful reproduction. Optional: Set up logs. Optional: Seed the run for reproducibility.  For each step: 	Calculate epsilon 	Select a random number from 0 to 1. If less than epsilon, select a random action. Otherwise, select argmax(q_network). 	Perform this step in the environment, getting next_obs, reward, done, and info from the environment. 	Add the above items into the replay buffer. 	Set the observation to the next_obs returned from the environment.  If step > replay start size and step % training frequency = 0: 	Sample batch_size samples from the replay buffer 	Calculate the expected future reward at t+1 from target_network 	Calculate the expected future reward at t from q_network. 	Perform MSE loss on expected target_network future reward - expected q_network future reward. 	Perform gradient descent 	Optional: Perform logs every N steps. N is up to you.  If step % target network update frequency = 0: 	Set target_network’s parameters to be equal to q_network’s parameters.

Нейронная сеть

Сверточная нейронная сеть состоит из следующего:

Первый слой: принимает на вход тензор 4x84x84. (Четыре предварительно обработанных кадра Atari). Применяет сверточный слой из 32 фильтров 8x8 с шагом 4, за которым следует нелинейность выпрямителя [10]  (torch.nn.ReLU).

Второй слой: сверточный слой из 64 фильтров 4x4 с шагом 2, за которым следует ReLU.

Третий слой: сверточный слой из 64 фильтров 3x3 с шагом 1, за которым следует ReLU.

Четвертый уровень: Полностью связный слой с входами 64*7*7 и 512 выходами.

Последний уровень: 512 входов, N выходов, где N — количество допустимых действий в среде.

Гиперпараметры

В документе имеются следующие гиперпараметры:

ГиперпараметрЦенитьОписание
Шаги10МОбщее количество временных шагов для обучения агента.
Размер мини-партии32Количество выборок, которые необходимо получить из буфера воспроизведения.
Размер памяти воспроизведенияКоличество кадров, сохраняемых в буфере воспроизведения. Мы храним только самые последние кадры.
Длина истории агента4Сколько входных кадров передать в наблюдение.
Частота обновления целевой сети10 тыс.Как часто (по шагам) мы обновляем целевую сеть. Это 1 КБ в реализациях Github.
Коэффициент скидки0,99Гамма в разделе 4.
Повтор действия4Сколько раз повторить одно и то же действие после его выполнения. Оно должно быть таким же, как длина истории агента.
Частота обновления4Как часто (по шагам) мы обучаем агента. 
Скорость обучения2.5e-4Скорость обучения оптимизатора.
Градиентный импульс0,95Гиперпараметр только для RMSProp. Игнорируйте, если используете Адама.
Квадрат градиентного импульса0,95Гиперпараметр только для RMSProp. Игнорируйте, если используете Адама.
Минимальный квадрат градиента0,01Гиперпараметр только для RMSProp. Игнорируйте, если используете Адама.
Начальная разведка1Начальное значение эпсилона для эпсилон-жадного исследования.
Заключительное исследование0,1Окончательное значение эпсилона для эпсилон-жадного исследования. В реализациях Github это 0,01.
Заключительный кадр исследованияЧисло  шагов , за которые эпсилон линейно отжигается [11]  до конечного значения. (Не запутайтесь, это ШАГИ, а не кадры - каждый шаг равен 4 кадрам)
Начальный размер повтора50 тыс.Сколько шагов пройдет, прежде чем мы начнем обучение агента. 80 тысяч на Github.
Безоперационный максимум30Максимальное количество шагов, чтобы не предпринимать никаких действий перед началом игры.

Окружающая среда Атари

Если вы прочитаете статью 2013 или 2015 года, вы заметите, что они относятся к функции ?, которая предварительно обрабатывает кадры Atari. В настоящее время мы делаем это, добавляя обертки в  среду спортзала OpenAI , используя  Atari API , поэтому все, что делает ?, теперь находится в  функции make_env . Если вы хотите написать свою собственную, вот оболочки, которые вы захотите изучить, или функциональные возможности, которые вы хотите воспроизвести:

  • Вызовите  Gym.make(<environment_id>)  с нужной средой Atari. Я предлагаю использовать  версии NoFrameskip-v4 — ванильный DQN немного хрупкий и имеет проблемы с v0 и v5, каждая из которых случайным образом заставляет вас предпринимать те же действия, что и раньше, в 25% случаев, чтобы добавить некоторую случайность к проблеме. Если вы хотите использовать версию 5, это вполне разумно, но вам следует ожидать более низких оценок.
  • NoopResetEnv — для случайного количества шагов от 1 до 30 после того, как среда запускает новый эпизод, ничего не делать. Это добавляет в игру некоторую случайность, гарантируя, что агент не просто запомнит одну правильную последовательность действий, которые нужно выполнять каждый раз.
  • MaxAndSkipEnv — выберите действие каждые четыре кадра. Для всех остальных кадров выполните то же действие, которое вы только что выполнили. Это значительно ускоряет вычисления.
  • EpisodicLifeEnv — завершайте эпизод только в том случае, если игра действительно окончена. Например, Breakout дает вам 5 жизней, а не только 1.
  • FireResetEnv — в некоторых играх для начала игры требуется нажать кнопку огня. FireResetEnv делает это автоматически.
  • ClipRewardEnv  — во время тренировки обрезайте награды до -1, если вы теряете очки, или до 1, если вы набираете очки. Это позволяет агенту лучше обобщать результаты игр с сильно различающимися показателями. Pong, например, имеет оценку от -21 до +21, тогда как другие игры Atari, такие как Beam Rider, могут иметь оценки в тысячах.
  • ResizeObservation и  GrayScaleObservation  — измените входной сигнал RGB 210x160 на оттенки серого 84x84. Улучшает вычислительную производительность.
  • FrameStack — при обучении агента передается наблюдение размером 4x84x84, состоящее из четырех сложенных кадров, чтобы он получал всю необходимую визуальную информацию, несмотря на то, что действовал только каждые четыре кадра.

Эти обертки для спортзала являются стандартными для решений Atari RL, а не только для DQN.

Дальнейшие улучшения (раздел 6)

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

Rainbow DQN объединяет полдюжины улучшений, внесенных в стандартный DQN за последние годы, и проверяет, насколько хорошо они работают вместе. В этой статье обобщаются все основные улучшения DQN на данный момент, что делает ее фантастическим, хотя и устрашающим ресурсом. Рассказ обо всех этих улучшениях мог бы стать отдельной статьей! Я предлагаю взглянуть как на статью Rainbow DQN, так и на ссылочные статьи, откуда взято каждое отдельное достижение, чтобы понять его. Или предложите мне сделать дистилляцию Rainbow DQN в качестве продолжения :P

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

Самопрогнозирующие представления  (SPR) добавляют в Rainbow цели с самоконтролем и пополнение данных, что значительно повышает эффективность выборки DQN. Это было добавлено в MuZero (преемник AlphaGo) как часть недавнего  алгоритма EfficientZero . Если вы дочитали до этого места, спасибо, что остаетесь со мной! Надеюсь, вы узнали больше об обучении с подкреплением и DQN. Этот пост также был написан для того, чтобы проверить, насколько я готов к выделению тем исследований в области ИИ, поэтому мне бы хотелось услышать, что вы думаете об этой статье, о каких-либо камнях, с которыми вы могли столкнуться, или о любых обходных путях, которые вы считали ненужными.

  1. ^

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

  2. ^

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

  3. ^

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

  4. ^

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

  5. ^

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

  6. ^

    Одна из статей в разделе «Дальнейшие улучшения», ApeX DQN, делает именно это.

  7. ^

    Epsilon начинается с 1, а затем линейно уменьшается до меньшего числа (0,01–0,1 в зависимости от реализации) в течение первых 10 % прогона.

  8. ^

    Вы можете спросить себя, не лучше ли вам смотреть на одни ходы, чем на другие: если вы потеряли ферзя, вам, вероятно, следует обратить пристальное внимание на ход, непосредственно предшествующий ему. Это называется приоритетным воспроизведением опыта и является одним из улучшений Rainbow DQN из раздела «Дальнейшие улучшения».

  9. ^

    Среднеквадратическая потеря ошибки (или потеря MSE) просто берет ошибку прогноза и возводит ее в квадрат. Помимо наказания за большие отклонения, это также обрабатывает отрицательные числа — мы хотим обрабатывать ошибку +N и -N одинаково, поскольку нас волнует абсолютное значение ошибки, а не ее направление. Возведение в квадрат +N и -N приводит к N^2, решая эту проблему.

  10. ^

    Этот термин звучит замысловато, но на самом деле он просто устанавливает все негативные активации в 0.

  11. ^

    Уменьшите со временем. Если наше начальное исследование равно 1, а окончательное исследование — 0,1, то общее изменение составит 0,9 за 1 миллион шагов. Это означает, что на каждом пройденном шаге мы уменьшаем эпсилон на 0,9/1 000 000. Итак, когда мы прошли половину пути, мы претерпели половину изменения, то есть на 500 000 шагов эпсилон = 0,55.


Источник: www.lesswrong.com

Комментарии: