OpenAI Baselines и DQN: как запустить и не утонуть в багах
Репозиторий OpenAI Baselines давно заморожен, а его DQN всё ещё копируют в туториалах. Разбираемся, что реально работает, где грабли и чем заменить в 2024 году.

Репозиторий OpenAI Baselines собрал больше 15 тысяч звёзд на GitHub и стал стандартной точкой входа в reinforcement learning для тысяч студентов и инженеров. При этом последний осмысленный коммит в него был сделан несколько лет назад, зависимости давно устарели, а реализация DQN в нём тянет за собой TensorFlow 1.x. Если вы сегодня открываете этот код и запускаете python -m baselines.run --alg=deepq, то с высокой вероятностью упрётесь в несовместимость версий раньше, чем увидите первую награду. Разберём, что там внутри, почему оно ломается и чем это чинить.
Что такое DQN и зачем он в Baselines
DQN (Deep Q-Network) — алгоритм, который в 2013–2015 годах научил нейросеть играть в игры Atari, получая на вход только пиксели экрана. Идея простая на словах: обучить сеть предсказывать Q-значение* — ожидаемую суммарную награду за действие в конкретном состоянии. Дальше агент выбирает действие с максимальным Q.
* Q-значение (Q-value) — оценка того, насколько выгодно совершить действие a в состоянии s, если дальше агент действует оптимально. Название идёт от функции Q(s, a) в уравнении Беллмана.
Baselines задумывался как набор эталонных, воспроизводимых реализаций RL-алгоритмов, чтобы исследователи сравнивали свои идеи с честной базовой линией, а не с недописанным кодом из чьей-то дипломной. DQN там — один из первых алгоритмов, и именно на нём чаще всего учатся. Проблема в том, что «эталон» заморозился во времени.
Ключевые приёмы, которые делают DQN рабочим
Голая идея «сеть предсказывает Q» не сходится. В Baselines-версии DQN держатся на трёх костылях, без которых обучение разваливается:
- Replay buffer — переходы (состояние, действие, награда, следующее состояние) складываются в буфер, и сеть учится на случайных выборках из него. Это разрывает корреляцию между соседними кадрами.
- Target network — вторая копия сети, которая обновляется реже основной. Она даёт стабильную цель для обучения, иначе агент гонится за собственным хвостом.
- Epsilon-greedy exploration — с вероятностью epsilon агент действует случайно, чтобы не застрять в первой найденной стратегии. Epsilon плавно снижается по ходу обучения.
В коде Baselines к базовому DQN добавлены расширения из статьи Rainbow: double Q-learning, dueling-архитектура и приоритизированный replay. Их включают флагами командной строки, и это тот случай, когда конкретные ключи важнее теории.
Как это запускается на самом деле
Штатный способ обучить DQN на Atari из README выглядит так:
python -m baselines.run \
--alg=deepq \
--env=PongNoFrameskip-v4 \
--num_timesteps=1e6 \
--dueling=True \
--prioritized_replay=True
Флаг --dueling включает dueling-архитектуру, --prioritized_replay — приоритизированный буфер, где переходы с большой ошибкой выбираются чаще. Двойной Q-learning в deepq включён по умолчанию через параметр double_q.
Обученную модель можно сохранить и прогнать заново:
python -m baselines.run \
--alg=deepq \
--env=PongNoFrameskip-v4 \
--num_timesteps=0 \
--load_path=~/models/pong_dqn \
--play
Ключевой момент — окружения с суффиксом NoFrameskip-v4. Baselines сам оборачивает их своими препроцессорами: масштабирует кадр до 84x84, переводит в оттенки серого, складывает по 4 кадра в стек, чтобы сеть видела движение. Если подставить окружение с уже встроенным frameskip, препроцессинг задвоится и агент не обучится — а сообщения об ошибке вы не получите.
Самое опасное в устаревшем RL-коде — не падение с трассировкой стека, а молчаливая неправильная работа. Агент запускается, что-то считает, награда не растёт, и вы часами ищете баг в своей логике, а он в версии gym.
Где именно всё ломается в 2024 году
Проблемы с запуском Baselines сегодня делятся на несколько типовых:
- TensorFlow 1.x. Deepq написан под TF1 со статическим графом и
tf.Session. На современных версиях TensorFlow это либо не ставится, либо работает через слой совместимости с предупреждениями. Нужен либо старый TF, либо форк. - gym против gymnasium. Библиотека gym передана сообществу и продолжается как gymnasium с изменённым API:
step()теперь возвращает пять значений вместо четырёх (добавлен флаг truncated). Baselines рассчитан на старый интерфейс. - Atari-окружения. ROM-файлы игр отделили в пакет
ale-pyс отдельной установкой. Старые названия окружений и способ их регистрации могли поменяться. - Версии Python. Сборка тянет зависимости, часть которых не имеет колёс под свежие версии Python, и пытается компилировать их из исходников.
Точные версии, на которых Baselines заводится без бубна, стоит смотреть в issues репозитория и в его requirements — не подставляйте наугад свежие, наоборот, фиксируйте старые.
Чем заменить, если цель — работающий DQN, а не археология
Если вам нужен результат, а не именно код OpenAI, есть поддерживаемые преемники. Ниже — грубое сравнение по тому, что важно на старте.
| Проект | Бэкенд | Статус | Кому подходит |
|---|---|---|---|
| OpenAI Baselines | TensorFlow 1.x | Заморожен | Чтение исходников, историческая база |
| Stable-Baselines3 | PyTorch | Активно поддерживается | Практика, прод-эксперименты, туториалы |
| CleanRL | PyTorch | Активно поддерживается | Обучение: один алгоритм — один файл |
Stable-Baselines3 — прямой идейный наследник, но переписанный под PyTorch и с нормальной документацией и тестами. CleanRL полезен, когда вы хотите понять DQN целиком: там реализация не размазана по десятку модулей, а лежит в одном читаемом скрипте, включая логику replay buffer и target network.
Стоит ли вообще открывать Baselines
Да, но с ясной целью. Как источник рабочего кода для новых проектов он себя изжил: слишком много ручной возни с версиями ради результата, который поддерживаемые библиотеки дают из коробки. Как учебный материал он всё ещё ценен — deepq показывает, как из уравнения Беллмана вырастает практическая реализация со всеми расширениями Rainbow, и это полезно прочитать глазами.
Практичный маршрут выглядит так:
- Хотите быстро обучить агента — берите Stable-Baselines3, там DQN настраивается несколькими строками.
- Хотите разобраться в устройстве — читайте CleanRL или исходники deepq из Baselines, но не запускайте их как основу проекта.
- Воспроизводите старую статью, которая ссылается на конкретную версию Baselines — тогда фиксируйте окружение целиком через Docker или старый virtualenv, иначе цифры не сойдутся.
Главный урок Baselines шире, чем DQN: в reinforcement learning воспроизводимость держится не только на алгоритме, но и на точных версиях окружения, препроцессинге кадров и сидах генератора случайных чисел. Замороженный репозиторий это демонстрирует наглядно — код тот же, а результат зависит от того, какой у вас gym.
Prompt-инженер: Идеальные запросы для Midjourney, ChatGPT и других моделей.
Спросить за 15 ₽Источники: OpenAI Baselines — репозиторий на GitHub, Stable-Baselines3 — документация
Частые вопросы
Можно ли запустить DQN из Baselines на современном TensorFlow 2?
Почему агент запускается, но награда не растёт?
В чём разница между Baselines и Stable-Baselines3?
Что означают флаги dueling и prioritized_replay?
Какие версии Python и библиотек нужны для запуска?
Нужен ли Baselines, если я только учусь RL?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.