Поединок двойного DQN, воспроизведение приоритетного опыта и…

1656584560 poedinok dvojnogo dqn vosproizvedenie prioritetnogo opyta i…

Томас Симонини

1*idlcWBCQGKJ2rMjKPwAKiQ

Эта статья является частью курса глубокого подкрепления из Tensorflow?️. Проверьте приложение здесь.

В нашей последней статье о Deep Q Learning из Tensorflow мы внедрили агента, обучающегося играть в простую версию Doom. В видеоверсии мы научили агента DQN, играющего в Space Invaders.

Однако во время тренинга мы увидели, что существует много вариативности.

Глубокое Q-Learning было введено в 2014 году. С тех пор было сделано много улучшений. Итак, сегодня мы увидим четыре стратегии, значительно улучшающие обучение и результаты наших агентов DQN:

  • фиксированные Q-цели
  • двойные DQN
  • дуэль DQN (он же DDQN)
  • Повторение приоритетного опыта (он же PER)

Мы внедрим агента, который научится играть в Doom Deadly Corridor. Наш AI должен двигаться к основной цели (жилету) и убедиться, что они выживают, одновременно убивая врагов.

Фиксированные Q-цели

теория

В статье Deep Q Learning мы видели, что, когда мы хотим вычислить ошибку TD (он же потеря), мы вычисляем разницу между целевым значением TD (Q_target) и текущим значением Q (оценка Q).

1*Zplt-1wTWu_7BGmZCBFjbQ

Но мы не имеем ни малейшего представления о реальной цели TD. Нам нужно это оценить. Используя уравнение Беллмана, мы увидели, что цель TD – это только вознаграждение за выполнение этого действия в этом состоянии плюс пониженное наивысшее значение Q для следующего состояния.

1*KsQ46R8zyTQlKGv91xi6ww

Однако проблема в том, что мы используем те же параметры (весы) для оценки цели. и Значение Q. Как следствие, существует большая корреляция между целевым значением TD и изменяемыми нами параметрами (w).

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

Это как если бы вы были ковбоем (оценка Q) и хотите поймать корову (Q-цель), вы должны подойти поближе (уменьшить ошибку).

1*BCsZHA3cO3zsQySkRuWPEw

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

1*aKuCo_MvnoCa148m3U9YXg
1*T5MwyKNbDmG9Vb_fQg1t-w

Это приводит к очень странному пути преследования (большое колебание в тренировке).

1*Kt6H_kh_rfSu7EkN9bU0oA

Вместо этого мы можем использовать идею фиксированных Q-целей, представленную DeepMind:

  • Использование отдельной сети с фиксированным параметром (назовем его w-) для оценки цели TD.
  • На каждом шагу Tau мы копируем настройки из нашей сети DQN, чтобы обновить целевую сеть.
1*D9i0I2EO7LKL2aAb2HLfTg

Благодаря этой процедуре у нас будет более стабильное обучение, поскольку целевая функция некоторое время остается фиксированной.

Реализация

Реализация фиксированных q-целей достаточно проста:

  • Сначала создаем две сети (DQNetwork, TargetNetwork)
  • Затем мы создаем функцию, которая будет принимать нашу DQNetwork параметры и скопируйте их в наш TargetNetwork
  • Наконец, во время обучения мы вычисляем цель ТД с помощью нашей целевой сети. Мы обновляем целевую сеть с помощью DQNetwork каждый tau шаг (tau является гиперпараметром, который мы определяем.

Двойные DQN

теория

Двойные DQN, или двойное обучение, были введены Хадо ван Хасселтом. Этот метод справляется с проблемой переоценки Q-значений.

Чтобы понять эту проблему, вспомните, как мы вычисляем TD Target:

1*KsQ46R8zyTQlKGv91xi6ww

Вычисляя цель TD, мы сталкиваемся с простой проблемой: как мы в этом уверены лучшим действием для следующего состояния является действие с наивысшим значением Q?

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

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

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

  • используйте нашу сеть DQN, чтобы выбрать наилучшее действие для следующего состояния (действие с наивысшим значением Q).
  • используйте нашу целевую сеть, чтобы вычислить целевое значение Q для выполнения этого действия в следующем состоянии.
1*g5l4q162gDRZAAsFWtX7Nw

Таким образом, Double DQN помогает нам снизить переоценку значений q и, как следствие, помогает нам тренироваться быстрее и иметь более стабильное обучение.

Реализация

1*oyGR6gJ4WyqeKOfq0Cd8iQ

Дуэль DQN (он же DDQN)

теория

Помните, что Q-значения соответствуют к тому, как хорошо быть в этом состоянии и выполнять действия в этом состоянии Q(s,a).

Итак, мы можем разложить Q(s,a) как сумму:

  • V(s): ценность пребывания в этом состоянии
  • Как): преимущество выполнения этого действия в этом состоянии (насколько лучше выполнить это действие по сравнению со всеми возможными действиями в этом состоянии).
1*yPtkPCxjXP2TbK8VlUuXtA

С помощью DDQN мы хотим разделить оценщик этих двух элементов, используя два новых потока:

  • тот, что оценивает значение состояния V(s)
  • тот, что оценивает преимущество для каждого действия A(s,a)
1*FkHqwA2eSGixdS-3dvVoMA

А потом объединяем эти два потока через специальный слой агрегации для получения оценки Q(s,a).

Подождите? Но зачем нам рассчитывать эти два элемента в отдельности, если потом объединить их?

Разъединив оценку, наш DDQN интуитивно может узнать, какие состояния являются (или не являются) ценными. без необходимо изучать эффект каждого действия в каждом состоянии (так как он вычисляет V(s)).

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

Как следствие, путем разъединения мы можем вычислить V(s). Это особенно полезно для государств, где их действия не влияют на окружающую среду соответствующим образом. В этом случае нет необходимости рассчитывать значение каждого действия. Например, движение влево или вправо имеет значение только в случае риска столкновения. И в большинстве штатов выбор действия не влияет на происходящее.

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

0*qor_kPiSwiWt8uQF

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

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

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

0*ue6KTm1dRQ0A6sM4

Но если мы это сделаем, мы попадем в вопросы идентификациито есть с учетом Q(s,a) мы не можем найти A(s,a) и V(s).

И невозможность найти V(s) и A(s,a) по Q(s,a) будет проблемой для нашего обратного распространения. Чтобы избежать этой проблемы, мы можем заставить наш оценщик функции преимущества иметь 0 преимущество при выбранном действии.

Для этого вычитаем среднее преимущество всех возможных действий государства.

0*kt9_Z41qxgiI0CDl

Поэтому эта архитектура помогает нам ускорить обучение. Мы можем вычислить значение состояния, не вычисляя Q(s,a) для каждого действия в этом состоянии. И это может помочь нам найти гораздо более надежные значения Q для каждого действия, разъединив оценку между двумя потоками.

Реализация

Единственное, что нужно сделать это изменить архитектуру DQN, добавив эти новые потоки:

Приоритетное воспроизведение опыта

теория

Восстановление приоритетного опыта (PER) было введено в 2015 году Томом Шаулом. Идея заключается в том, что некоторые переживания могут быть важнее других для нашего обучения, но могут случаться реже.

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

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

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

Мы используем абсолютное значение величины нашей ошибки TD:

0*0qPwzal3qBIP0eFb

И мы поставить этот приоритет в опыт каждого буфера воспроизведения.

0*iKTTN92E7wwnlh-E

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

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

0*iCkLY7L3R3mWEh_O

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

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

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

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

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

Чтобы исправить это предупреждение, мы используем весовые коэффициенты выборки важности (IS), которые корректируют обновление путем уменьшения веса часто встречающихся выборок.

0*Lf3KBrOdyBYcOVqB

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

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

Реализация

На этот раз реализация будет несколько более изысканной.

Прежде всего, мы не можем просто реализовать PER, сортируя все буферы воспроизведения опыта в соответствии с их приоритетами. Это совсем не будет эффективным из-за O(nlogn) для вставки и O(n) для выборки.

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

Sumtree – это двоичное дерево, то есть дерево с максимум двумя дочерними элементами для каждого узла. Листья (глубочайшие узлы) содержат значение приоритета, а массив данных, указывающий на листки, содержит опыт.

Обновление дерева и выборка будут действительно эффективны (O(log n)).

1*Go9DNr7YY-wMGdIQ7HQduQ

Затем мы создаем объект памяти, который будет содержать наше дерево суммы и данные.

Далее, чтобы испытать минипартию размера k, диапазон [0, total_priority] будет разделен на k диапазонов. Значение равномерно отбирается от каждого диапазона.

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

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

Агент Doom Deathmatch

Этот агент представляет собой Dueling Double Deep Q Learning с PER и фиксированными q-целями.

Мы сделали видеоурок по реализации:

Блокнот здесь

Это все! Вы только что создали более умного агента, который учится играть в Doom. Прекрасно! Помните, что если вы хотите иметь агента с действительно хорошей работой, вам нужно гораздо больше часов GPU (около двух дней обучения)!

1*pN5raRODUzEQOLw0egyXYg

Однако всего 2–3 часа обучения на CPU (да, CPU), наш агент понял, что им нужно убить врагов, прежде чем они смогут двигаться вперед. Если они двигаются вперед, не убивая врагов, они будут убиты, прежде чем получить жилет.

Не забудьте реализовать каждую часть кода самостоятельно. Очень важно попытаться изменить код, который я вам дал. Попытайтесь добавить эпохи, изменить архитектуру, добавить фиксированные Q-значения, изменить скорость обучения, использовать более жесткую среду… и так далее. Экспериментируйте, получайте удовольствие!

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

В следующей статье мы узнаем превосходный гибридный метод между алгоритмами обучения с подкреплением на основе ценностей и политик. Это является базовым для современных алгоритмов: Advantage Actor Critic (A2C). Вы введете агента, который научится играть в Outrun!

1*0M5OiOwKemAwkObBy1K6VQ

Если вам понравилась моя статья, пожалуйста, нажмите кнопку ? ниже столько раз, сколько вам понравилась статья поэтому другие люди увидят это здесь на Medium. И не забудь следовать за мной!

Если у вас есть какие-либо мнения, комментарии, вопросы, не стесняйтесь оставлять комментарии ниже или отправлять мне электронное письмо: hello@simoninithomas.com или твиты @ThomasSimonini.

1*_yN1FzvEFDmlObiYsstIzg
1*mD-f5VN1SWYvhrZAbvSu_w
1*PqiptT-Cdi8uwosxuFn2DQ

Продолжайте учиться, оставайтесь замечательными!

Курс глубокого подкрепления с Tensorflow?️

? Программа обучения

? Видео версия

Часть 1: Введение в учебу с подкреплением

Часть 2: более глубокое погружение в обучение с подкреплением с помощью Q-Learning

Часть 3: Введение в Deep Q-Learning: давайте поиграем в Doom

Часть 3+: Улучшение в глубоком обучении Q: двойной DQN на дуэли, повторение приоритетного опыта и фиксированные Q-цели

Часть 4: Введение в градиенты политики с Doom и Cartpole

Часть 5: Введение в методы Advantage Actor Critic: давайте поиграем в Ежа Соника!

Часть 6: Проксимальная оптимизация политики (PPO) из Sonic the Hedgehog 2 и 3

Часть 7: Обучение на основе любопытства стало легким Часть I

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *