Обучение с подкреплением и выравнивание

Практика: от gridworld до DPO

Value iteration, REINFORCE, PPO и DPO своими руками — и проверки, которые ловят настоящие ошибки

Шаг 117 из 117 · ~50 мин

Ветка в двух формулах

V(s)=maxa[r+γEV(s)]J=E[Alogπθ]\htmlData{k=value}{V^*(s) = \max_a\big[r + \gamma\,\mathbb{E}V^*(s')\big]} \qquad \htmlData{k=policy}{\nabla J = \mathbb{E}\big[A\,\nabla\log\pi_\theta\big]}

Слева уроки 010–050, справа 060–110. Уроки 120–140 показывают, что вторая формула с KL-регуляризацией и есть выравнивание, а 150 возвращает модель среды в первую.

Что реализовать

1. Gridworld и динамическое программирование

Начните с того, где есть точный ответ.

  • реализуйте value iteration и policy iteration на сетке 4×44\times4 из урока 010;
  • сверьте значения с виджетом: при γ=0.9\gamma = 0.9 и цене шага 0.04-0.04 клетка рядом с целью обязана давать 0.860.86, следующая — 0.7340.734;
  • посчитайте число итераций обоих алгоритмов и сравните с уроком 040.
0.620.730.8610.520.73-10.430.520.620.520.340.520.43

терминал стена

дисконт γ 0.9
проходов 20
цена шага -0.04
горизонт 1/(1−γ)
10
значение старта
0.344
изменение за проход
0.0e+0
проходов до сходимости
7
Держите эту картинку открытой, пока пишете код: любое расхождение больше 10⁻⁶ — ошибка в вашей реализации, а не в округлении. Особенно проверьте клетки рядом со стенами: удар в стену обязан оставлять агента на месте, а не отменять ход.

Эталонные значения. Ваш value iteration обязан сойтись сюда, а policy iteration — за меньшее число итераций.

2. Табличный Q-learning

Та же сетка, но без модели.

  • ε\varepsilon-жадное поведение, убывающий шаг;
  • сравните выученную QQ с точным ответом из пункта 1;
  • сделайте то же для SARSA и найдите состояния, где политики различаются.

Ожидание из урока 050: у обрыва SARSA обходит с запасом, Q-learning идёт по краю. Если различий нет вовсе — вероятно, ε\varepsilon слишком мало, и обе схемы фактически совпали.

3. REINFORCE на бандите

Самая маленькая задача, где виден весь механизм градиента политики.

  • три руки, награды 11, 00, 22;
  • посчитайте точный градиент в замкнутой форме и сравните с выборочным;
  • измерьте дисперсию оценки с базовой линией и без;
  • прибавьте ко всем наградам 100100 и повторите измерение.

Ожидание из урока 070: градиент не изменится, дисперсия без базовой линии вырастет примерно в тридцать тысяч раз. Это самая убедительная демонстрация во всей ветке, и стоит увидеть её своими глазами.

Дальше тот же REINFORCE переносится на CartPole — классическую следующую ступень, и переносится почти без изменений в коде. Меняется одно, зато существенное: в бандите награда приходит сразу за действие, а в CartPole эпизод длится сотни шагов, и приходится решать, какому из них приписать падение шеста. Это и есть назначение вклада (credit assignment) — задача, которой у бандита просто нет.

CartPole ценен ещё и тем, что последний пункт предыдущего эксперимента встроен в него по условию: награда там +1+1 за каждый шаг, поэтому все возвраты положительны и без базовой линии каждое действие в каждом эпизоде получает толчок в свою сторону. Ровно тот же сдвиг на 100100, только его нельзя убрать из задачи — его можно убрать лишь базовой линией. Возьмите скользящее среднее возврата, сравните с запуском без него, и посмотрите на дисперсию градиента: это тот же замер, что на бандите, но теперь на задаче, где он влияет на результат.

4. PPO на чём-нибудь непрерывном

Маятник или что-то подобное. Обязательные детали, каждая из уроков 080–110:

  • GAE с λ=0.95\lambda = 0.95;
  • нормализация преимуществ по батчу;
  • обрезка с ε=0.2\varepsilon = 0.2 и ранний выход по измеренной KL;
  • энтропийный бонус;
  • отдельная сеть критика или общий ствол — но с разными скоростями обучения.

Логируйте четыре величины: среднюю награду, KL от старой политики, долю обрезанных примеров (clip fraction) и энтропию политики. Каждая ловит свой класс ошибок.

5. DPO на игрушечной модели

Здесь можно обойтись без языковой модели вовсе. Возьмите распределение над пятью-десятью «ответами», задайте синтетическую награду, сгенерируйте пары предпочтений по Брэдли–Терри и обучите политику функцией потерь DPO.

abcd

ответ вероятность

опорная оптимум
коэффициент β 0.5
средняя награда
1.6966
KL от опорной
0.6693
значение цели
1.362
β·log Z
1.362
Это точный оптимум KL-регуляризованной задачи при данной награде. Ваша реализация DPO, обученная на достаточном числе пар из той же награды, обязана прийти сюда — с точностью до шума выборки. Проверка сильная: она сверяет не потери, а само распределение.

6. Пять измерений

Измерение 1: оба алгоритма ДП дают одно и то же. Value iteration и policy iteration обязаны сойтись к одинаковым значениям с точностью 10610^{-6}. Если нет — ошибка в одном из них, и найти её проще, чем разбираться с обучением.

Измерение 2: базовая линия не смещает. Сравните выборочный градиент с точным при включённой и выключенной базовой линии. Ожидание: оба несмещены, дисперсии различаются на порядки.

Измерение 3: преимущество в среднем нулевое. Посчитайте Eπ[A]\mathbb{E}_\pi[A] по вашей оценке. По определению это нуль; заметное отклонение означает ошибку в критике или в весах.

Измерение 4: обрезка PPO односторонняя. Подайте в вашу функцию потерь r=1.5r = 1.5 при A>0A > 0 и при A<0A < 0. Ожидание из урока 110: в первом случае градиент нулевой, во втором — нет.

Измерение 5: DPO сходится к правильному распределению. Обучите на парах и сравните итоговую политику с πrefer/β\pi_{\text{ref}}e^{r/\beta}, нормированной. Это проверяет весь вывод урока 140 разом.

Куда смотреть, если не работает

симптомчто проверять первым
значения ДП не сходятсясинхронность обновления, обработку удара в стену
Q-learning сходится не тудаубывание шага, покрытие всех пар состояние–действие
REINFORCE не учится, награды крупныебазовую линию (урок 070)
PPO обучается и внезапно ломаетсяKL за эпоху — вероятно, нужен ранний выход
clip fraction около нуляшаг слишком мал, ограничение не работает
clip fraction больше третишаг слишком велик, большая часть батча без градиента
энтропия падает почти до нулядобавить бонус, иначе исследование прекратилось
DPO: потери падают, качество нетлогировать обе неявные награды по отдельности

Последняя строка — специфичная для DPO и разобранная в уроке 140: функция потерь не различает «поднять предпочтённое» и «опустить оба». Единственный способ увидеть разницу — смотреть на βlog(π/πref)\beta\log(\pi/\pi_{\text{ref}}) для победителя и проигравшего отдельно.

Чем закончить

Прогоните все пять измерений. Особенно третье и пятое: первое проверяет, что ваша оценка преимущества согласована сама с собой, второе — что вся цепочка от предпочтений до политики приводит туда, куда обещает теория. Обучение, которое «выглядит нормально», проходит и с ошибками; эти тождества — нет.

Источники

Проверки

0 из 2
  1. Отладка агента

    Отметьте все верные утверждения об отладке алгоритмов этой ветки.

  2. Аудит гиперпараметров

    Перед запуском обучения полезно перевести гиперпараметры в величины, у которых есть смысл. Реализуйте audit(gamma, lam, epsilon, beta) — верните [task_horizon, gae_horizon, clip_kl, horizon_ratio]:

    • task_horizon = 11γ\dfrac{1}{1-\gamma} — на сколько шагов смотрит задача;
    • gae_horizon = 11γλ\dfrac{1}{1-\gamma\lambda} — на сколько шагов доверяет наблюдениям оценка преимущества;
    • clip_kl = (r1)logr(r - 1) - \log r при r=1+εr = 1 + \varepsilon — оценка k3k_3 расхождения, которое соответствует границе обрезки PPO (урок 110);
    • horizon_ratio = gae_horizon / task_horizon.

    Аргумент beta в вычислениях не участвует — он передаётся, потому что в настоящем аудите проверяют и его, и полезно видеть, что он не влияет ни на одну из этих четырёх величин. KL-регуляризация и оценка преимущества — независимые части конфигурации.

    функция audit

    Загрузка редактора…

    Ctrl/⌘ + Enter