Deep RL Course, юнит 6: actor-critic и A2C
Полный перевод шестого юнита курса Hugging Face: проблема дисперсии в REINFORCE, идея актора и критика, функция преимущества, A2C и практика — робот-манипулятор Panda в panda-gym со Stable-Baselines3.
Это перевод шестого юнита курса Hugging Face Deep RL Course:
теория, практическое занятие (ноутбук notebooks/unit6/unit6.ipynb), тест и заключение. Предыдущий юнит о политике —
градиент политики, карта курса — в путеводителе.
Введение
Заголовок раздела «Введение»В юните 4 мы изучили первый алгоритм на основе политики — REINFORCE.
В методах на основе политики мы стремимся оптимизировать политику напрямую, без функции ценности. Точнее, REINFORCE входит в подкласс методов на основе политики, который называют методами градиента политики. Этот подкласс оптимизирует политику напрямую, оценивая веса оптимальной политики градиентным подъёмом.
Мы видели, что REINFORCE работает хорошо. Но поскольку для оценки отдачи мы используем сэмплирование Монте-Карло (отдачу считаем по целому эпизоду), у оценки градиента политики большая дисперсия.
Вспомните: оценка градиента политики — это направление самого быстрого роста отдачи. Иначе говоря, она говорит, как обновить веса политики, чтобы действия, ведущие к хорошей отдаче, выбирались с большей вероятностью. Дисперсия Монте-Карло, которую мы подробнее изучим в этом юните, замедляет обучение: чтобы её сгладить, нужно много примеров.
Поэтому сегодня мы изучим методы actor-critic — гибридную архитектуру, сочетающую методы на основе ценности и на основе политики. Она стабилизирует обучение, уменьшая дисперсию, с помощью:
- актора (actor), который управляет тем, как ведёт себя агент (метод на основе политики);
- критика (critic), который оценивает, насколько хорошее действие совершено (метод на основе ценности).
Мы изучим один из таких гибридных методов — Advantage Actor Critic (A2C) — и обучим агента со Stable-Baselines3 в робототехнической среде. Мы обучим:
- робота-манипулятора 🦾 выводить руку в нужное положение.
Звучит увлекательно? Начнём!
Проблема дисперсии в REINFORCE
Заголовок раздела «Проблема дисперсии в REINFORCE»В REINFORCE мы хотим увеличивать вероятность действий траектории пропорционально тому, насколько высока отдача:
- Если отдача высокая, мы поднимаем вероятности сочетаний (состояние, действие).
- Если же отдача низкая, мы опускаем вероятности сочетаний (состояние, действие).
Эта отдача вычисляется сэмплированием Монте-Карло. Мы собираем траекторию, считаем дисконтированную отдачу и по этой оценке увеличиваем или уменьшаем вероятность каждого действия этой траектории. Если отдача хорошая, все действия «подкрепляются» — их вероятность растёт.
Плюс этого метода в том, что он несмещённый. Мы не оцениваем отдачу, а берём только настоящую полученную отдачу.
Но из-за стохастичности среды (случайных событий в эпизоде) и стохастичности политики траектории могут давать разную отдачу, а это даёт высокую дисперсию. Из одного и того же начального состояния можно получить очень разную отдачу. Поэтому отдача из одного и того же состояния может сильно меняться от эпизода к эпизоду.
flowchart LR S["Одно и то же начальное состояние"] --> T1["Траектория 1: отдача 10"] S --> T2["Траектория 2: отдача −2"] S --> T3["Траектория 3: отдача 35"]
Решение — сгладить дисперсию, взяв много траекторий в надежде, что дисперсия отдельных траекторий в сумме усреднится и даст «истинную» оценку отдачи.
Но если сильно увеличить размер батча, падает эффективность по данным (sample efficiency). Поэтому нужны другие механизмы уменьшения дисперсии.
Если хотите глубже разобраться в компромиссе смещения и дисперсии в глубоком обучении с подкреплением, прочитайте эти статьи:
- Making Sense of the Bias / Variance Trade-off in (Deep) Reinforcement Learning;
- Bias-variance Tradeoff in Reinforcement Learning;
- High Variance in Policy gradients.
Advantage Actor-Critic (A2C)
Заголовок раздела «Advantage Actor-Critic (A2C)»Уменьшаем дисперсию методами actor-critic
Заголовок раздела «Уменьшаем дисперсию методами actor-critic»Чтобы уменьшить дисперсию REINFORCE и обучать агента быстрее и лучше, используют сочетание методов на основе политики и на основе ценности — метод actor-critic.
Чтобы понять actor-criticактор-критик (actor-critic)EN actor-criticДве сети — актор (политика) и критик (оценка V); критик даёт актору оценку преимущества., представьте, что вы играете в видеоигру. Вы играете вместе с другом, который даёт вам обратную связь. Вы — актор, а друг — критик.
Сначала вы не умеете играть, поэтому пробуете действия наугад. Критик наблюдает за вашими действиями и даёт обратную связь.
Учась на этой обратной связи, вы обновляете свою политику и начинаете играть лучше.
А друг (критик) тоже обновляет свой способ давать обратную связь, чтобы в следующий раз она была точнее.
Такова идея actor-critic. Мы учим две аппроксимации функций:
- политику, которая управляет действиями агента: ;
- функцию ценности, которая помогает обновлять политику, оценивая, насколько хорошее действие совершено: .
Процесс actor-critic
Заголовок раздела «Процесс actor-critic»Мы увидели общую картину actor-critic — теперь разберёмся, как актор и критик улучшаются вместе во время обучения.
Как мы видели, в методах actor-critic две аппроксимации функций (две нейросети):
- актор — функция политики с параметрами θ: ;
- критик — функция ценности с параметрами w: .
Посмотрим на процесс обучения, чтобы понять, как оптимизируются актор и критик.
- На каждом шаге мы получаем от среды текущее состояние и подаём его на вход актору и критику.
- Политика по состоянию выдаёт действие .
- Критик тоже получает это действие на вход и по и вычисляет ценность этого действия в этом состоянии — Q-значение.
- Действие , выполненное в среде, даёт новое состояние и награду .
- Актор обновляет параметры политики с помощью Q-значения:
- С обновлёнными параметрами актор выбирает следующее действие в новом состоянии .
- Затем критик обновляет свои параметры ценности:
flowchart LR E["Среда"] -->|"состояние S_t"| A["Актор π_θ"] E -->|"состояние S_t"| C["Критик q̂_w"] A -->|"действие A_t"| E A -->|"действие A_t"| C C -->|"Q-значение: насколько хорошо действие"| A E -->|"награда R_t+1, состояние S_t+1"| C
Добавляем преимущество: Advantage Actor-Critic (A2C)
Заголовок раздела «Добавляем преимущество: Advantage Actor-Critic (A2C)»Обучение можно стабилизировать ещё сильнее, если использовать в роли критика функцию преимущества, а не функцию ценности действия.
Идея в том, что функция преимуществапреимущество (advantage)EN advantageA = r − b или A(s, a) = Q(s, a) − V(s): насколько действие лучше среднего в этой ситуации. вычисляет относительное преимущество действия по сравнению с другими возможными в этом состоянии действиями: насколько это действие в этом состоянии лучше средней ценности состояния. Из ценности пары «состояние — действие» вычитается средняя ценность состояния:
Иначе говоря, эта функция показывает, какую дополнительную награду мы получим, если совершим это действие в этом состоянии, по сравнению со средней наградой в этом состоянии.
Дополнительная награда — это то, что сверх ожидаемой ценности состояния.
- Если , градиент толкает в эту сторону.
- Если (действие хуже средней ценности состояния), градиент толкает в противоположную сторону.
Чтобы реализовать функцию преимущества в таком виде, нужны две функции ценности — и . К счастью, хорошей оценкой функции преимущества служит TD-ошибка:
Практика: A2C для робототехники в panda-gym 🤖
Заголовок раздела «Практика: A2C для робототехники в panda-gym 🤖»Теперь, когда вы изучили теорию Advantage Actor Critic (A2C), вы готовы обучить агента A2C со Stable-Baselines3 в робототехнической среде. Мы обучим:
- робота-манипулятора 🦾 выводить руку в нужное положение.
Мы будем использовать panda-gym.
Чтобы это занятие засчиталось для сертификата, нужно выложить обученные модели на Hub и получить такой результат:
PandaReachDense-v3— результат ≥ −3,5.
Чтобы узнать результат, найдите свою модель на лидерборде: результат = средняя награда − стандартное отклонение награды. Подробнее о сертификации — в разделе курса.
Чтобы начать, нажмите кнопку «Open In Colab»: ноутбук unit6.ipynb в Colab.
Юнит 6: Advantage Actor Critic (A2C) для робототехнических симуляций в panda-gym 🤖
Заголовок раздела «Юнит 6: Advantage Actor Critic (A2C) для робототехнических симуляций в panda-gym 🤖»🎮 Среды: Panda-Gym.
📚 Библиотека RL: Stable-Baselines3.
Мы постоянно улучшаем наши руководства, поэтому, если найдёте проблемы в этом ноутбуке, откройте issue в репозитории на GitHub.
Цели ноутбука 🏆. К концу ноутбука вы:
- научитесь пользоваться Panda-Gym — библиотекой сред;
- сможете обучать роботов с помощью A2C;
- поймёте, зачем нормализовать вход;
- сможете выложить обученного агента и код на Hub с красивым видео игры и оценкой качества 🔥.
Что нужно заранее 🏗️: 🔲 📚 изучить методы actor-critic по юниту 6 🤗
Обучим наших первых роботов 🤖
Заголовок раздела «Обучим наших первых роботов 🤖»Включаем GPU 💪
Заголовок раздела «Включаем GPU 💪»Чтобы ускорить обучение агента, используем GPU. Для этого откройте Runtime > Change Runtime type и выберите
Hardware Accelerator > GPU.
Создаём виртуальный дисплей 🔽
Заголовок раздела «Создаём виртуальный дисплей 🔽»Во время работы нам понадобится записать видео игры. В Colab для этого нужен виртуальный экран, чтобы отрисовывать среду (и записывать кадры). Следующая ячейка устанавливает библиотеки, создаёт и запускает виртуальный экран 🖥
%%capture!apt install python-opengl!apt install ffmpeg!apt install xvfb!pip3 install pyvirtualdisplay# Виртуальный дисплейfrom pyvirtualdisplay import Display
virtual_display = Display(visible=0, size=(1400, 900))virtual_display.start()Устанавливаем зависимости 🔽
Заголовок раздела «Устанавливаем зависимости 🔽»Ставим несколько пакетов:
gymnasium;panda-gym— содержит среды с роботом-манипулятором;stable-baselines3— библиотека глубокого обучения с подкреплением SB3;huggingface_sb3— дополнительный код для Stable-Baselines3, чтобы загружать модели на Hugging Face 🤗 Hub и скачивать их оттуда;huggingface_hub— библиотека для работы с репозиториями Hub.
!pip install stable-baselines3[extra]!pip install gymnasium!pip install huggingface_sb3!pip install huggingface_hub!pip install panda_gymИмпортируем пакеты 📦
Заголовок раздела «Импортируем пакеты 📦»import os
import gymnasium as gymimport panda_gym
from huggingface_sb3 import load_from_hub, package_to_hub
from stable_baselines3 import A2Cfrom stable_baselines3.common.evaluation import evaluate_policyfrom stable_baselines3.common.vec_env import DummyVecEnv, VecNormalizefrom stable_baselines3.common.env_util import make_vec_env
from huggingface_hub import notebook_loginPandaReachDense-v3 🦾
Заголовок раздела «PandaReachDense-v3 🦾»Агент, которого мы будем обучать, — робот-манипулятор, которому нужно управлять движением (двигать руку и пользоваться рабочим органом).
В робототехнике рабочий орган (end-effector) — устройство на конце руки робота, предназначенное для взаимодействия со средой.
В PandaReach робот должен поместить рабочий орган в целевую точку (зелёный шар).
Мы будем использовать плотную версию среды. Это значит, что у нас будет плотная функция награды (dense reward), которая выдаёт награду на каждом шаге (чем ближе агент к выполнению задачи, тем выше награда). В отличие от разреженной функции награды (sparse reward), где среда выдаёт награду только тогда, когда задача выполнена.
Кроме того, мы будем использовать управление перемещением рабочего органа: действие — это смещение рабочего органа. Отдельными движениями каждого сустава (управление суставами) мы не управляем.
В оригинале здесь рисунок: рука робота Panda, зелёный шар-цель и стрелки смещения рабочего органа по x, y, z.
Так обучение пойдёт легче.
Создаём среду
Заголовок раздела «Создаём среду»В PandaReachDense-v3 робот должен поместить рабочий орган в целевую точку (зелёный шар).
env_id = "PandaReachDense-v3"
# Создаём средуenv = gym.make(env_id)
# Получаем пространство состояний и пространство действийs_size = env.observation_space.shapea_size = env.action_spaceprint("_____OBSERVATION SPACE_____ \n")print("The State Space is: ", s_size)print("Sample observation", env.observation_space.sample()) # случайное наблюдениеПространство наблюдений — словарь из трёх элементов:
achieved_goal— положение цели (x, y, z);desired_goal— расстояние (x, y, z) между положением цели и текущим положением объекта;observation— положение (x, y, z) и скорость рабочего органа (vx, vy, vz).
Раз наблюдение — словарь, нужна политика MultiInputPolicy, а не MlpPolicy.
print("\n _____ACTION SPACE_____ \n")print("The Action Space is: ", a_size)print("Action Space Sample", env.action_space.sample()) # случайное действиеПространство действий — вектор из 3 значений:
- управление перемещением по x, y, z.
Нормализуем наблюдения и награды
Заголовок раздела «Нормализуем наблюдения и награды»Хорошая практика в обучении с подкреплением — нормализовать входные признаки.
Для этого есть обёртка, которая считает скользящее среднее и стандартное отклонение входных признаков.
Награды мы нормализуем той же обёрткой, добавив norm_reward = True.
Чтобы заполнить эту ячейку, загляните в документацию.
env = make_vec_env(env_id, n_envs=4)
# Добавляем эту обёртку, чтобы нормализовать наблюдения и наградуenv = # TODO: добавьте обёрткуРешение
env = make_vec_env(env_id, n_envs=4)
env = VecNormalize(env, norm_obs=True, norm_reward=True, clip_obs=10.)Создаём модель A2C 🤖
Заголовок раздела «Создаём модель A2C 🤖»Подробнее о реализации A2C в Stable-Baselines3 — в документации.
Чтобы найти лучшие параметры, я посмотрел на официальных обученных агентов команды Stable-Baselines3.
model = # Создайте модель A2C и попробуйте подобрать лучшие параметрыРешение
model = A2C(policy = "MultiInputPolicy", env = env, verbose=1)Обучаем агента A2C 🏃
Заголовок раздела «Обучаем агента A2C 🏃»Обучим агента на 1 000 000 шагов; не забудьте включить GPU в Colab. Это займёт примерно 25–40 минут.
model.learn(1_000_000)# Сохраняем модель и статистики VecNormalize вместе с агентомmodel.save("a2c-PandaReachDense-v3")env.save("vec_normalize.pkl")Оцениваем агента 📈
Заголовок раздела «Оцениваем агента 📈»- Агент обучен — теперь нужно проверить его качество.
- В Stable-Baselines3 для этого есть метод
evaluate_policy.
from stable_baselines3.common.vec_env import DummyVecEnv, VecNormalize
# Загружаем сохранённые статистикиeval_env = DummyVecEnv([lambda: gym.make("PandaReachDense-v3")])eval_env = VecNormalize.load("vec_normalize.pkl", eval_env)
# Нужно переопределить render_modeeval_env.render_mode = "rgb_array"
# Во время теста статистики не обновляемeval_env.training = False# Нормализация наград при тесте не нужнаeval_env.norm_reward = False
# Загружаем агентаmodel = A2C.load("a2c-PandaReachDense-v3")
mean_reward, std_reward = evaluate_policy(model, eval_env)
print(f"Mean reward = {mean_reward:.2f} +/- {std_reward:.2f}")Публикуем обученную модель на Hub 🔥
Заголовок раздела «Публикуем обученную модель на Hub 🔥»Мы убедились, что после обучения результаты хорошие, и теперь можем одной строкой кода опубликовать модель на Hub.
📚 Документация библиотеки: huggingface_sb3.
С package_to_hub, как мы уже говорили в прошлых юнитах, вы оцениваете агента, записываете видео игры, создаёте
карточку модели и отправляете всё на Hub. Так вы можете:
- показать свою работу 🔥;
- посмотреть, как играет агент 👀;
- поделиться с сообществом агентом, которым могут пользоваться другие 💾;
- попасть на лидерборд 🏆 и сравнить агента с однокурсниками: Deep RL Leaderboard.
Чтобы поделиться моделью с сообществом, нужно сделать ещё три шага.
1️⃣ (Если ещё нет) создайте аккаунт на HF: huggingface.co/join.
2️⃣ Войдите и сохраните токен авторизации с сайта Hugging Face: создайте новый токен (huggingface.co/settings/tokens) с правом записи (write), скопируйте его, запустите ячейку ниже и вставьте токен.
notebook_login()!git config --global credential.helper storeЕсли вы не пользуетесь Google Colab или Jupyter Notebook, используйте вместо этого команду huggingface-cli login.
3️⃣ Теперь всё готово, чтобы выложить обученного агента на Hub 🤗 🔥 функцией package_to_hub(). Для этой среды
ячейка может выполняться около 10 минут.
from huggingface_sb3 import package_to_hub
package_to_hub( model=model, model_name=f"a2c-{env_id}", model_architecture="A2C", env_id=env_id, eval_env=eval_env, repo_id=f"ThomasSimonini/a2c-{env_id}", # замените имя пользователя commit_message="Initial commit",)Дополнительные задания 🏆
Заголовок раздела «Дополнительные задания 🏆»Лучший способ учиться — пробовать самому! Почему бы не попробовать PandaPickAndPlace-v3?
Если хотите взяться за более сложные задачи panda-gym, посмотрите, что сделано с TQC или SAC (алгоритмами, которые эффективнее используют данные и хорошо подходят для робототехники). В настоящей робототехнике берут алгоритмы, эффективные по данным, по простой причине: в отличие от симуляции, если слишком сильно дёргать руку робота, её можно сломать.
PandaPickAndPlace-v1 (эта модель использует версию среды v1): sb3/tqc-PandaPickAndPlace-v1.
Загляните и в документацию panda-gym.
Вот шаги, чтобы обучить ещё одного агента (по желанию):
- Задайте среду
PandaPickAndPlace-v3. - Создайте векторизованную среду.
- Добавьте обёртку, нормализующую наблюдения и награды. Загляните в документацию.
- Создайте модель A2C (не забудьте
verbose=1, чтобы видеть логи обучения). - Обучите её на 1 млн шагов.
- Сохраните модель и статистики VecNormalize вместе с агентом.
- Оцените агента.
- Опубликуйте обученную модель на Hub 🔥 с помощью
package_to_hub.
Решение (по желанию)
# 1 - 2env_id = "PandaPickAndPlace-v3"env = make_vec_env(env_id, n_envs=4)
# 3env = VecNormalize(env, norm_obs=True, norm_reward=True, clip_obs=10.)
# 4model = A2C(policy = "MultiInputPolicy", env = env, verbose=1)# 5model.learn(1_000_000)# 6model_name = "a2c-PandaPickAndPlace-v3";model.save(model_name)env.save("vec_normalize.pkl")
# 7from stable_baselines3.common.vec_env import DummyVecEnv, VecNormalize
# Загружаем сохранённые статистикиeval_env = DummyVecEnv([lambda: gym.make("PandaPickAndPlace-v3")])eval_env = VecNormalize.load("vec_normalize.pkl", eval_env)
# Во время теста статистики не обновляемeval_env.training = False# Нормализация наград при тесте не нужнаeval_env.norm_reward = False
# Загружаем агентаmodel = A2C.load(model_name)
mean_reward, std_reward = evaluate_policy(model, eval_env)
print(f"Mean reward = {mean_reward:.2f} +/- {std_reward:.2f}")
# 8package_to_hub( model=model, model_name=f"a2c-{env_id}", model_architecture="A2C", env_id=env_id, eval_env=eval_env, repo_id=f"ThomasSimonini/a2c-{env_id}", # TODO: замените имя пользователя commit_message="Initial commit",)Увидимся в юните 7! 🔥 Продолжайте учиться и оставайтесь крутыми 🤗
Лучший способ учиться и не попасть в ловушку иллюзии компетентности — проверить себя. Так вы поймёте, какие знания нужно подкрепить.
Вопрос 4. Опишите своими словами метод actor-critic (A2C).
Ответ
Идея actor-critic в том, что мы учим две аппроксимации функций:
- политику (
policy), которая управляет действиями агента (); - функцию ценности (
value), которая помогает обновлять политику, оценивая, насколько хорошее действие совершено ().
Вопрос 6. Что такое преимущество (Advantage) в методе A2C?
Ответ
Вместо того чтобы использовать функцию ценности действия критика как есть, можно взять функцию преимущества
(Advantage). Её идея — вычислить относительное преимущество действия по сравнению с другими возможными в этом
состоянии действиями, усреднив их.
Иначе говоря: насколько совершить это действие в этом состоянии лучше, чем средняя ценность состояния:
Поздравляем с окончанием теста 🥳! Если что-то упустили, перечитайте главу и подкрепите (😏) знания.
Заключение
Заголовок раздела «Заключение»Поздравляем с окончанием юнита и практического занятия. Вы только что обучили своих первых виртуальных роботов 🥳.
Не спешите и как следует разберитесь в материале, прежде чем идти дальше. Можно также заглянуть в дополнительные материалы из раздела «Дополнительное чтение».
Авторы курса будут рады узнать ваше мнение о курсе и о том, как его улучшить — для этого есть форма обратной связи.
До встречи в следующем юните! Юнит 7 (мультиагентность) описан в путеводителе, а продолжение линии actor-critic — юнит 8 о PPO.
Продолжайте учиться и оставайтесь крутыми 🤗
Дополнительное чтение
Заголовок раздела «Дополнительное чтение»Компромисс смещения и дисперсии в обучении с подкреплением
- Making Sense of the Bias / Variance Trade-off in (Deep) Reinforcement Learning.
- Bias-variance Tradeoff in Reinforcement Learning.
Функции преимущества
Actor-critic
- Foundations of Deep RL Series, L3: Policy Gradients and Advantage Estimation — Питер Аббил (видео).
- Статья об A2C: Asynchronous Methods for Deep Reinforcement Learning.
Словарик
Заголовок раздела «Словарик»| English | Русский |
|---|---|
| actor / critic | актор / критик |
| actor-critic methods | методы actor-critic (актор-критик) |
| variance / bias | дисперсия / смещение |
| bias-variance tradeoff | компромисс смещения и дисперсии |
| unbiased estimate | несмещённая оценка |
| sample efficiency | эффективность по данным |
| advantage function | функция преимущества |
| Advantage Actor-Critic (A2C) | A2C (actor-critic с преимуществом) |
| TD error as advantage estimate | TD-ошибка как оценка преимущества |
| end-effector | рабочий орган (захват) робота |
| dense / sparse reward | плотная / разреженная награда |
| end-effector displacement control / joint control | управление смещением рабочего органа / управление суставами |
observation and reward normalization (VecNormalize) | нормализация наблюдений и наград |
| vectorized environment | векторизованная среда (несколько копий параллельно) |