Procgen Benchmark: почему RL-агенты до сих пор плохо обобщают
Procgen — набор из 16 процедурно генерируемых игр от OpenAI, где агент обучается на одних уровнях и проверяется на других. Именно на нём становится видно, что RL умеет запоминать, но не переносить навык.

В обучении с подкреплением есть неудобная традиция: агент играет в ту же Atari-игру, на которой учился, показывает результат уровня человека и попадает в пресс-релиз. Procgen Benchmark, представленный OpenAI в 2019 году, устроен иначе. Каждая из 16 игр процедурно генерирует уровни по сиду, обучение идёт на одном наборе сидов, а замер — на другом, которого агент никогда не видел. Разрыв между train и test здесь и есть главная метрика.
Что такое Procgen и зачем его сделали
Procgen — это open-source библиотека на C++ с Python-обёрткой под интерфейс Gym. Внутри 16 игр: CoinRun, StarPilot, CaveFlyer, Dodgeball, FruitBot, Chaser, Miner, Jumper, Leaper, Maze, BigFish, Heist, Climber, Plunder, Ninja, BossFight. Все они рендерятся в 64×64 RGB и работают на порядки быстрее Atari — на одном ядре CPU выходит около 4000–8000 шагов в секунду в зависимости от игры.
Ключевая идея — отделить умение играть от запоминания уровней. В классической ALE (Arcade Learning Environment) агент видит один и тот же Breakout миллиард раз и в итоге зазубривает траектории. В Procgen каждый эпизод — новый уровень с новой геометрией, расположением врагов и фонами. Если агент обучился на 200 уровнях CoinRun, а на новых 200 играет плохо — значит, он не научился игре, а запомнил обучающую выборку.
Два режима запуска
Бенчмарк задаёт два стандартных протокола, и путать их не стоит:
- Easy — 200 обучающих уровней, бюджет 25 млн шагов. Быстро, подходит для итераций и академических статей с ограниченным компьютом.
- Hard — 500 уровней, 200 млн шагов, увеличенные размеры карт и сложность. Здесь разрыв train/test особенно заметен.
Есть ещё режим unlimited — уровни генерируются бесконечно, обобщать нечего, потому что тест и обучение статистически совпадают. Он полезен как sanity-check: если агент и там играет плохо, дело не в обобщении, а в самом алгоритме.
Что показал бенчмарк
В оригинальной работе OpenAI гоняла PPO как базовую линию. Результат оказался неприятным для сообщества: даже после сотен миллионов шагов агент на тестовых уровнях играл ощутимо хуже, чем на обучающих. Разрыв в награде на некоторых играх — CoinRun, Jumper, Maze — доходил до 30–50%.
Procgen сделал видимым то, о чём давно подозревали: значительная часть впечатляющих RL-результатов — это переобучение под конкретные уровни, а не универсальный навык.
Как алгоритмы борются с разрывом
С 2020 года на Procgen прогнали большинство подходов, которые претендовали на улучшение обобщения. Общая картина:
| Подход | Идея | Что даёт на Procgen |
|---|---|---|
| PPO (baseline) | Стандартный policy gradient | Заметный train/test gap |
| PPO + аугментации | Random crop, color jitter на кадрах | Уменьшает разрыв на играх с однородным фоном |
| DrAC, RAD | Data augmentation прямо в RL-лоссе | Стабильный прирост на большинстве игр |
| PLR (Prioritized Level Replay) | Чаще показывать сложные уровни | Один из сильнейших методов, особенно в hard |
| PPG (Phasic Policy Gradient) | Разделение фаз обучения политики и ценности | Улучшает sample efficiency |
Ни один из подходов разрыв полностью не закрывает. Это и есть смысл живого бенчмарка: его нельзя решить один раз и забыть.
Как запустить у себя
Библиотека ставится одной командой и не требует эмуляторов вроде тех, что нужны для Atari. Минимальный пример на Python:
import gym
from procgen import ProcgenEnv
env = ProcgenEnv(
num_envs=64,
env_name="coinrun",
num_levels=200,
start_level=0,
distribution_mode="easy",
)
obs = env.reset()
for _ in range(1000):
actions = [env.action_space.sample() for _ in range(64)]
obs, rewards, dones, infos = env.step(actions)
Для замера обобщения делают вторую среду с теми же параметрами, но start_level=1000 и другим сидом — эти уровни агент никогда не видел. Разница средней награды на train и test и есть искомая метрика.
Что стоит помнить при работе с бенчмарком
- Не мешайте между собой режимы easy и hard — числа несопоставимы.
- Для честного сравнения фиксируйте num_levels и start_level: авторы часто по-разному нарезают тренировочную выборку.
- Считайте нормализованную награду — у каждой игры своя шкала, у BossFight и Maze она не совпадает даже примерно.
- Тестовая выборка должна оставаться нетронутой: если вы гоняете гиперпараметры по тест-сидам, вы просто переобучаетесь на них же.
Место Procgen сегодня
Появились более свежие среды под обобщение — MiniHack, Crafter, XLand от DeepMind. Но Procgen остаётся рабочей лошадкой: он лёгкий, воспроизводимый, у него понятный протокол и накопленная сравнимая база результатов. Для проверки нового RL-алгоритма или архитектуры энкодера это по-прежнему один из первых бенчмарков, куда его гоняют, — и один из немногих, где невозможно спрятать переобучение за красивой обучающей кривой.
Обобщение (generalization) в RL — способность агента показывать сопоставимый результат на состояниях среды, которых не было в обучающей выборке. В отличие от supervised learning, в RL это свойство долго игнорировалось из-за смешения train и test в стандартных бенчмарках.
Prompt-инженер: Идеальные запросы для Midjourney, ChatGPT и других моделей.
Спросить за 15 ₽Источники: Leveraging Procedural Generation to Benchmark Reinforcement Learning (OpenAI), Procgen на GitHub
Частые вопросы
Чем Procgen лучше Atari для проверки RL?
Сколько вычислений нужно, чтобы прогнать бенчмарк?
Какой алгоритм сейчас лучший на Procgen?
Можно ли использовать Procgen для обучения агентов с изображений с нуля?
Подходит ли Procgen для offline RL или imitation learning?
Что выбрать новичку: easy или hard?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.