Моя первая попытка реализовать алгоритм обучения с подкреплением началась с 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