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

И что я нашел сначала: https://keon.io/deep-q-learning/. Этот пост в блоге достаточно хорош, поэтому он предоставляет простой исходный код с пояснениями. На самом деле реализация была настолько простой, что я был почти уверен, что смогу сделать лучше, конечно..

Сначала я не очень понял базу всего RL:

и это было моей точкой зрения, где *if* я могу ловко настроить вокруг этого ..но, черт возьми, нет, я не могу ..

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

  • Udacity Reinforcement Learning (лучший курс, который я смог там найти, в частности, он не охватывает нейронную сеть и глубокое RL, а вместо этого охватывает основные принципы RL! + Преподаватели — просто золото)
  • Объяснение Microsoft Reinforcement Learning (как практическое решение проблем, представленных в ранее упомянутом курсе. Поскольку, к сожалению, это было на java, и на данный момент нет обзоров. !)
  • (Udacity Nanodegrees хороши, но не справляются с этими основными основами, но если у вас есть лишние деньги, эти курсы могут дать вам некоторые интересные причуды, практические занятия с фреймворками и более сложные проблемы, а также некоторые видео довольно хорошо объясняются в способ, которого я больше нигде не нашел!)

— После того, как вы пройдете курсы, обратите внимание, помимо многих других, на Multi Armed Bandits и связанный с ним алгоритм UCB
— Я нашел id очень полезным для мышления, а также для таких алгоритмов, как поиск по дереву Монте-Карло ( MCTS ), используемых в АльфаГо и другие. Для справки, мою реализацию вы можете найти по адресу: https://github.com/rezer0dai/mcts.

Но тогда, принимая уравнения Беллмана за «абсолютные», что еще я мог бы изменить в коде, чтобы сделать его другим, извлечь из него уроки, помимо простого копирования и вставки, возможно ли даже улучшить его?

После нескольких месяцев исследований и экспериментов оказалось, что способов сделать это предостаточно! В общем рекомендую пройти через: https://github.com/higgsfield/RL-Adventure-2

(Soft)АктерКритик

  • вы можете разделить проблему на выполнение действия и состояние + действие, приближающее результат. Благодаря этому вы можете играть самостоятельно, взаимодействуя с окружающей средой!
  • также, как только вы заморозите аппроксиматор Q-Function, вы получите хорошие преимущества для аппроксимации функции Advantage (более стабильные и надежные оценки)
  • переход от On-Policy к Off-Policy
  • статья: https://arxiv.org/abs/1801.01290
  • пример: https://github.com/rezer0dai/wheeler/blob/master/utils/softnet.py

Приоритетный буфер опыта

  • Ядром улучшения являются воспоминания. Если вы вспомните, что вы делали, хорошо и что плохо, вы можете извлечь из этого уроки и сравнить с текущим опытом.
  • Однако, чтобы эффективно вспоминать по памяти, лучше, когда вы рисуете важные, но что важно?
    td_error (преимущество): если вы считаете это ошибкой, которую вы сделали, и градиент, который вы можете использовать для более эффективного улучшения
    новизна (любопытство): насколько редким был для вас этот опыт? очень редко может привести к более глубокому изучению.
  • как только ваша память будет заполнена, вы можете добавить в основном опыт, который вы вряд ли видели раньше (любопытство?)
  • статья: https://arxiv.org/abs/1511.05952
  • пример: h ttps://github.com/takoika/PrioritizedExperienceReplay

Политика Градиенты, все дороги ведут в Рим

  • REINFORCE+ ванильный PG
    — вы в основном проходите через весь эпизод, сбрасываете награды и делаете шаг обучения
    — однако вы можете использовать методы ActorCritic, чтобы учиться чаще
  • PPO( TRPO )
    — пример эффективного метода, который не полагается на вероятно устаревшие пары состояние-действие в вашем буфере воспроизведения
    — почему устаревшее — это плохо? хорошо, потому что тогда вероятность этих действий низка, и это дает довольно неэффективный градиент (плохой сигнал исправления)
    — как это решается? путем запуска нескольких сред в масштабе + вероятности отсечения (+ хороший трюк для извлечения действительного соотношения)
    — документ: https://arxiv.org/abs/1707.06347
    — реализация: https:// github.com/higgsfield/RL-Adventure-2/blob/master/3.ppo.ipynb
  • DPPG( MADDPG )
    — блестящая идея и техника, когда вы не полагаетесь на вероятность действия, чтобы получить градиент
    тогда как? используя те же градиенты, что и в Critic Neural Network ~ Функция действие-значение !! прочитать статью!
    — статья: https://arxiv.org/abs/1509.02971
    — реализация: https://github.com/vilcek/RL-Adventure-2/blob/ мастер/5.ddpg.ipynb

Зашумленные сети для изучения

  • классическим способом изучения окружающей среды была эпсилон-жадная политика (полное случайное действие с определенной вероятностью)
  • популярный выбор, но скорее специфичный для предметной области — «процесс Орнштейна-Уленбека», который дает вам «связанный шум»
  • оба метода применяют случайность к конечному результату вашего аппроксиматора функции (нейронной сети)
  • однако было доказано, что вместо этого эффективно применять случайность непосредственно к весам вашего аппроксиматора функции!
  • статья: https://arxiv.org/abs/1706.10295
  • реализация: https://github.com/rezer0dai/wheeler/blob/master/utils/nes.py

Преимущества, преимущества N-Steps / GAE

  • при обучении с подкреплением возникают некоторые проблемы с конвергенцией:
    — предвзятость
    — дисперсия
    — присвоение кредита
  • n-шаговая задача счетчика дисперсии, смещение gae + дисперсия
  • что касается присвоения кредита Rudder trough LSTM
    — однако и в этой области я голосую за GAE
  • статья: https://arxiv.org/abs/1506.02438
  • статья: https://arxiv.org/abs/1806.07857

Отложенное обучение/обновления

  • Кажется эффективным позволить агенту немного взаимодействовать с окружающей средой без взаимодействия, только собирать опыт
  • затем выполните несколько раундов обучения после определенного количества шагов
  • откладывание обновлений целевых сетей в SoftActorCritic может сделать его более устойчивым к изменениям
  • реализация: https://github.com/rezer0dai/ReacherBenchmarkDDPG/blob/master/ddpg_agent.py

РНН

  • следуя уравнениям Беллмана, мы должны следовать марковским свойствам по определению, то есть состояние должно содержать важную информацию для продвижения вперед (нет необходимости искать прошлое или утечки из будущего)
  • в то время как нам может быть сложно это сделать — правильно спроектировать, для RNN это звучит более естественно, так как она учится на последовательностях → какие особенности траекторий состояний эффективно сохранять
  • проблема RNN связана с устаревшими образцами, поскольку функции меняются, и поэтому при воспроизведении из буфера вам также необходимо их пересчитывать ~ большая потеря производительности (однако PPO - это совсем другая история!)
  • реализация: https://github.com/rezer0dai/wheeler/blob/master/utils/rnn.py

Масштаб — асинхронный

  • поскольку PPO является тяжелым из-за параллельного запуска нескольких сред, другие алгоритмы также могут извлечь из этого пользу (A3C, ..)
  • как сделать с несколькими спортивными залами OpenAI, пример единства — 20 рук
  • реализация: https://github.com/rezer0dai/wheeler/blob/master/utils/taskmgr.py

Несколько ботов (экспериментально)

  • Несколько агентов работают над одной проблемой
  • как они сотрудничают ?
    — обмен опытом
    — обмен/синхронизация аппроксиматоров функций политики (большинство весов)
  • реализация: https://github.com/rezer0dai/wheeler/blob/master/experimental/her_coop.ipynb

Несколько целей (подзадач) ~ экспериментально

  • Хотя некоторые задачи могут быть более сложными, может быть эффективно разделить их на несколько более мелких подзадач с различными функциями вознаграждения.
  • как 3D-навигация, чтобы перемещаться по x-y-z
  • применение внимания к подзадачам может повысить эффективность
  • реализация: https://github.com/rezer0dai/wheeler/blob/master/experimental/her_coop.ipynb

ОНА / Любопытство

  • Разработка функций вознаграждения может быть одной из самых важных частей решения сложной проблемы.
  • Однако может быть более простой способ, как это сделать:
    — пусть это будет черно-белая задача (награда 1 или 0) → ЕЕ
    — награда врасплох — мы закончили в этом состоянии при переходе → Любопытство
  • статья: https://arxiv.org/abs/1707.01495
  • статья: https://arxiv.org/abs/1705.05363

И это только моя текущая область, на которую я смотрю, но вы можете найти целую кучу исследований, которые выходят далеко за рамки: https://spinningup.openai.com/en/latest/spinningup/keypapers.html