Модуль 1. Введение: Reinforcement Learning для LLM
Сначала попробуйте решить упражнение. Ответы, подробные решения и проектные ориентиры раскрываются отдельно и сохраняют своё состояние при переключении RU/EN.
Скачать файлы курса (.zip) 382,1 КБАрхив содержит файлы на обоих языках и вспомогательные материалы с сохранением структуры каталогов.
Агент, среда, состояние, действие и награда
Рассмотрим два эпизода.
- В коридоре агент находится в клетке, выбирает «влево» или «вправо» и получает за правый терминал.
- Языковая модель видит запрос и уже сгенерированный префикс, выбирает следующий токен, а проверяющая система оценивает законченный ответ.
Сопоставьте объект и понятие.
| Объект | Понятие |
|---|---|
| A. Номер клетки или пара «запрос + префикс» | 1. Политика |
| B. Правило выбора направления или распределение следующего токена | 2. Среда |
| C. Конкретное движение или конкретный токен | 3. Состояние |
| D. Динамика коридора либо внешние инструменты и ограничения генерации | 4. Награда |
| E. за терминал либо итоговая оценка ответа | 5. Действие |
Ответ запишите как A-?, B-?, C-?, D-?, E-?.
Показать ответ и решение
Ответ: A-3, B-1, C-5, D-2, E-4.
- Состояние описывает текущую ситуацию: клетку или запрос с префиксом.
- Политика задаёт правило выбора: направление в коридоре или распределение токенов.
- Действие — один фактически сделанный выбор.
- Среда определяет переходы и внешние последствия.
- Награда — скалярная обратная связь после перехода или эпизода.
Главная граница здесь проходит между политикой и действием: распределение не равно одному выбранному из него действию.
Политика не равна выбранному действию
Выберите одно наиболее точное утверждение.
-
— это уже выбранное действие, а — вероятность этого действия.
-
— распределение над действиями, — один выбор из него, а награда оценивает последствие.
-
Политика и награда — два названия одной скалярной функции.
-
Стохастическая политика обязана выбирать все действия с одинаковой вероятностью.
Показать ответ и решение
Ответ: 2.
обозначает полное распределение вероятностей над допустимыми действиями. Конкретное выбирается из этого распределения. Награда появляется как оценка последствия и не является ни действием, ни его вероятностью.
Вариант 4 неверен: стохастичность не означает равномерность. Например, политика может назначать вероятности и двум действиям.
В каком смысле LLM является политикой
Для токеновой абстракции сопоставьте обозначение и смысл.
| Обозначение | Смысл |
|---|---|
| A. | 1. Веса трансформера |
| B. | 2. Запрос и уже сгенерированный префикс |
| C. | 3. Следующий выбранный токен |
| D. | 4. Полное распределение вероятностей следующего токена |
Ответ запишите как A-?, B-?, C-?, D-?.
Затем одним предложением объясните, почему это точное соответствие не означает, что любая предобученная LLM уже обучалась методом RL.
Показать ответ и решение
Ответ: A-2, B-3, C-4, D-1.
В токеновой постановке
Это точное соответствие на уровне математической модели выбора действия. Оно не определяет способ, которым были получены веса : предобучение по следующему токену, обучение с учителем и RL могут приводить к модели, которая в любом случае задаёт распределение токенов.
Награда и накопленная награда
Выберите два корректных утверждения. Здесь накопленная награда (return) — дисконтированная сумма будущих наград.
-
Награда относится к одному переходу, а агрегирует будущие награды от момента .
-
Накопленная награда всегда равна последней награде эпизода.
-
При величина учитывает только ближайшую награду .
-
При все конечные эпизоды имеют одинаковую накопленную награду.
Показать ответ и решение
Ответы: 1 и 3.
Награда относится к одному переходу. Накопленная награда
объединяет будущие награды с учётом дисконтирования. При остаётся только ближайший член .
Вариант 2 верен лишь в специальных задачах с единственной ненулевой терминальной наградой и . Вариант 4 неверен: при накопленная награда равна обычной сумме наград, а разные эпизоды могут иметь разные суммы.
Что создаёт цикл обратной связи в онлайн-RL
Выберите одно наиболее точное утверждение.
-
RL не использует градиентный спуск.
-
В RL никогда нет демонстраций или размеченных данных.
-
При сборе данных в онлайн-RL политика влияет на распределение следующего опыта, а награда обычно не раскрывает исходы всех невыбранных действий.
-
Любая скалярная функция потерь является наградой, поэтому любая оптимизация — RL.
Показать ответ и решение
Ответ: 3.
При сборе данных в онлайн-RL текущая политика участвует в создании следующего набора данных. После обновления меняются частоты действий, посещаемых состояний и наблюдаемых исходов. Награда обычно сообщает результат выбранного действия или траектории, но не полный набор контрфактуальных исходов для всех альтернатив.
Остальные варианты неверны: RL может использовать градиентный спуск и демонстрации, а скалярность функции потерь сама по себе не создаёт задачу принятия решений.
Разведите этапы дообучения LLM
Ниже используются четыре названия:
- обучение с учителем на демонстрациях (
supervised fine-tuning, SFT); - прямая оптимизация предпочтений (
direct preference optimization, DPO); - обучение с подкреплением на основе обратной связи от человека (
reinforcement learning from human feedback, RLHF), выполняемое с помощью проксимальной оптимизации политики (proximal policy optimization, PPO); далее — PPO-RLHF; - отбор лучшего из кандидатов (
Best-of-N).
Сопоставьте операцию и характеристику.
| Операция | Характеристика |
|---|---|
| A. SFT | 1. Генерируются кандидаты, выбирается лучший, параметры не меняются |
| B. DPO по фиксированным парам | 2. Свежие роллауты оцениваются моделью награды, политика и критик обновляются |
| C. PPO-RLHF | 3. Максимизируется правдоподобие демонстраций |
| D. Best-of-N | 4. Оптимизируется парная функция потерь относительно базовой политики |
Ответ запишите как A-?, B-?, C-?, D-?.
Показать ответ и решение
Ответ: A-3, B-4, C-2, D-1.
- Обучение с учителем на демонстрациях (
supervised fine-tuning, SFT) максимизирует правдоподобие демонстраций. - Прямая оптимизация предпочтений (
direct preference optimization, DPO) использует фиксированные пары и парную функцию потерь относительно базовой политики. - Обучение с подкреплением на основе обратной связи от человека (
reinforcement learning from human feedback, RLHF), выполняемое с помощью проксимальной оптимизации политики (proximal policy optimization, PPO), собирает роллауты и обновляет политику; типичная схема PPO-RLHF также использует модель награды и критик. - Best-of-N выбирает кандидата на этапе генерации и сам по себе не меняет параметры.
Выберите уровень абстракции
Для каждой задачи выберите наиболее естественную основную модель.
-
Один запрос, один полный ответ и одна терминальная модель награды; вклад отдельных токенов в итоговую оценку не рассматривается.
-
Нужно выписать и токеновую дивергенцию Кульбака–Лейблера (
Kullback–Leibler divergence, KL). -
Агент вызывает браузер, состояние сайта частично скрыто, а вызовы имеют разную длительность.
Варианты:
- контекстный бандит (
contextual bandit); - конечный токеновый марковский процесс принятия решений (
Markov decision process, MDP); - частично наблюдаемый марковский процесс принятия решений (
partially observable Markov decision process, POMDP) или полумарковский процесс принятия решений (semi-Markov decision process, semi-MDP) для задачи с агентом.
Показать ответ и решение
-
Контекстный бандит. Полный ответ свёрнут в одно действие, после которого приходит итоговая награда.
-
Конечный токеновый марковский процесс принятия решений (
Markov decision process, MDP). Состояние — полный префикс, действие — следующий токен. -
Частично наблюдаемый марковский процесс принятия решений (
partially observable Markov decision process, POMDP) или полумарковский процесс (semi-Markov decision process, semi-MDP). Внешнее состояние скрыто, а длительность макродействий различается.
Ни одна абстракция не является «истинной навсегда». Выбор зависит от того, какую механику нужно сделать явной в конкретном выводе.
Почему DPO не просто классический офлайн-RL
Выберите два корректных утверждения.
-
DPO использует фиксированные пары предпочтений и потому является офлайн-методом в обычном инженерном смысле.
-
DPO обязательно обучает функцию ценности через обновление Беллмана.
-
Типичная постановка DPO не использует наборы переходов и не сталкивается с ошибкой экстраполяции в той же форме, что классический офлайн-RL.
-
DPO выполняется только на этапе генерации и не обновляет параметры.
Показать ответ и решение
Ответы: 1 и 3.
DPO использует фиксированные данные, поэтому его можно назвать офлайн-методом в обычном инженерном смысле. Но типичная задача DPO не строится из переходов , не выполняет обновления Беллмана и не воспроизводит классическую проблему экстраполяции ценности в той же форме, что офлайн-RL.
Короткая точная характеристика: DPO — прямая офлайн-оптимизация предпочтений, выведенная из постановки RLHF с регуляризацией по дивергенции Кульбака–Лейблера (Kullback–Leibler divergence, KL).
Что означает работа на данных текущей политики в PPO
Выберите одно наиболее точное описание проксимальной оптимизации политики (proximal policy optimization, PPO).
-
Каждый пример используется ровно один раз.
-
Пакет данных создаётся зафиксированной версией политики, затем может использоваться в нескольких эпохах по мини-пакетам с клиппированным отношением вероятностей в суррогатной цели, без жёсткой границы для фактического отношения; допустимое отставание политики является частью протокола.
-
Данные могут быть сколь угодно старыми, потому что клиппинг полностью устраняет смещение из-за использования данных другой политики.
-
Данные текущей политики означают только отсутствие буфера повторного использования опыта.
Показать ответ и решение
Ответ: 2.
В PPO роллауты обычно создаёт зафиксированная версия политики . Затем один пакет данных можно обрабатывать в нескольких эпохах по мини-пакетам. Отношение
входит в клиппированную суррогатную цель. Клиппинг убирает стимул к некоторым дальнейшим изменениям отношения, но не задаёт жёсткой границы для фактического отношения или KL. Это протокол, использующий данные текущей или недавней политики, а не обещание применять каждый пример ровно один раз. Клиппинг снижает риск слишком большого шага, но не превращает произвольно старые данные в данные текущей политики.
Проверяемая награда и групповая оптимизация: режим и алгоритм
Ниже:
- обучение с подкреплением с проверяемыми наградами (
reinforcement learning with verifiable rewards, RLVR); - групповая относительная оптимизация политики (
group relative policy optimization, GRPO).
Выберите одно корректное утверждение.
-
RLVR — конкретная формула клиппинга, а GRPO — тип набора данных.
-
RLVR описывает режим, в котором награду можно автоматически проверить; GRPO — семейство алгоритмов обновления политики, которое может использовать такую награду.
-
GRPO по определению не использует базовую оценку.
-
Любой RLVR-эксперимент обязан использовать именно канонический GRPO.
Показать ответ и решение
Ответ: 2.
Обучение с подкреплением с проверяемыми наградами (reinforcement learning with verifiable rewards, RLVR) описывает источник обратной связи: корректность можно проверить программой, тестами, точным ответом или другой автоматической процедурой.
Групповая относительная оптимизация политики (group relative policy optimization, GRPO) описывает способ построить относительные преимущества по группе роллаутов и обновить политику. GRPO часто применяется в RLVR, но эти понятия не тождественны: один режим награды допускает разные алгоритмы, а GRPO может получать и иной скалярный сигнал.
Найдите компонент без обучения политики
Система генерирует 32 ответа LLM с фиксированными параметрами, проверяющий алгоритм на основе правил оценивает их, а затем возвращает лучший. Что это за операция?
-
PPO
-
GRPO
-
Best-of-N / отбор на этапе генерации
-
Офлайн-RL
Дополнительно одним предложением объясните, что нужно изменить, чтобы появился обучающий цикл.
Показать ответ и решение
Ответ: 3 — Best-of-N / отбор на этапе генерации.
Параметры модели зафиксированы, поэтому система выполняет поиск и отбор кандидатов, а не обучение политики. Обучающий цикл появится, если оценки или выбранные ответы будут использованы для изменения — например, через SFT, DPO или обновление по градиенту политики на собранных роллаутах.
Две границы: softmax с температурой и KL
Выберите два корректных утверждения.
-
Для фиксированного конечного вектора логитов и чистого softmax энтропия не убывает с температурой .
-
Это автоматически доказывает монотонность энтропии для любого сочетания top-p, top-k, штрафов и скрытых преобразований интерфейса программирования приложений (
application programming interface, API). -
Дивергенция Кульбака–Лейблера (
Kullback–Leibler divergence, KL) может ограничивать отклонение от базовой политики, но сама не проверяет корректность модели награды или прокси-цели. -
Малое KL-отклонение гарантирует высокую истинную награду.
Показать ответ и решение
Ответы: 1 и 3.
Для чистой температурной политики при фиксированных логитах
Это утверждение не распространяется автоматически на весь процесс декодирования с top-, top-, штрафами и скрытыми преобразованиями.
KL измеряет изменение распределения относительно базовой политики. Она может ограничить отклонение, но не доказывает, что модель награды измеряет нужное свойство или что прокси-цель совпадает с истинной целью.
Накопленная награда
Для наград и вычислите .
Показать ответ и решение
Обратная проверка рекурсией:
Где параметр входит в распределение траекторий
Для конечного MDP дано
Укажите, какой множитель зависит от в стандартной постановке без модели среды (model-free) и почему после обновления меняется распределение собираемых траекторий. Что предполагается о и ?
Показать ответ и решение
В стандартной постановке без модели среды (model-free) от зависят множители политики
Начальное распределение , динамика среды и правило награды считаются фиксированными относительно параметров политики. После обновления меняются вероятности действий. Это меняет последующие переходы, посещаемые состояния и в итоге всё распределение . Если сама среда или модель награды обновляется одновременно с политикой, её параметры нужно записать отдельно: это уже более широкая нестационарная система.
Для LLM смысл тот же: обновлённая модель генерирует другой набор ответов, а система с агентом из-за иных действий может попасть в другие состояния внешней среды.
Точное значение в коридоре
В симметричном коридоре из основного текста:
- старт ;
- терминалы и ;
- случайная политика выбирает движения влево и вправо с вероятностью ;
- награда выдаётся только при достижении состояния ;
- эпизод ограничен 20 действиями.
Каково точное ? Ответ можно дать дробью или десятичным числом.
Показать ответ и решение
За два шага из центрального состояния возможны четыре равновероятных исхода:
- два движения влево — поглощение в состоянии 0;
- два движения вправо — поглощение в состоянии 4;
- движения в разные стороны — возврат в состояние 2.
Вероятность пережить один двухшаговый блок равна . Чтобы не достичь ни одного терминала за 20 действий, нужно пережить десять таких блоков:
По симметрии вероятности закончить слева и справа одинаковы. Поэтому
Значение относится к версии без временного ограничения; оно удобно для интуитивной проверки, но не является точным опорным значением запущенного протокола.
Вероятность полного ответа
Пусть завершённый трёхтокеновый ответ имеет условные вероятности
-
Вычислите .
-
Вычислите натуральный логарифм вероятности ответа.
-
Покажите, что он равен сумме трёх логарифмов условных вероятностей токенов.
-
Одним предложением объясните, почему одна итоговая награда затрудняет оценку вклада каждого из этих токенов.
Показать ответ и решение
Авторегрессионная вероятность полного ответа равна произведению условных вероятностей:
Её натуральный логарифм:
С другой стороны,
То есть
Одна итоговая награда оценивает весь ответ, но сама не сообщает, какой из трёх токеновых выборов был полезен или ошибочен. Именно поэтому возникает задача оценки вклада отдельных действий.
Дисконтированная накопленная награда
Реализуйте:
def discounted_return(rewards: list[float], gamma: float) -> float:
"""Return G_0 for a non-empty finite reward sequence."""
...Требования:
- ;
rewards— непустая конечная одномерная последовательность;- используйте обратную рекурсию ;
- некорректный ввод должен приводить к
ValueError.
Открытые проверки:
assert abs(discounted_return([1, 0, 0, 10], 0.9) - 8.29) < 1e-12
assert discounted_return([1, 1, 1], 1.0) == 3.0
assert discounted_return([5, 100], 0.0) == 5.0Скрытые проверки включают отрицательные награды, последовательность из одного элемента, длину 1000, nan, пустой список и вне .
Показать ответ и решение
from __future__ import annotations
import math
import numpy as np
def discounted_return(rewards: list[float], gamma: float) -> float:
values = np.asarray(rewards, dtype=np.float64)
if values.ndim != 1 or values.size == 0:
raise ValueError("rewards must be a non-empty 1D sequence")
if not np.isfinite(values).all():
raise ValueError("rewards must be finite")
if not math.isfinite(gamma) or not 0.0 <= gamma <= 1.0:
raise ValueError("gamma must lie in [0, 1]")
result = 0.0
for reward in values[::-1]:
result = float(reward) + gamma * result
return float(result)Обратная рекурсия избегает явного вычисления степеней и делает один проход: времени и дополнительной памяти.
Численно устойчивый softmax с температурой
Реализуйте:
def softmax_with_temperature(
logits: np.ndarray,
temperature: float,
) -> np.ndarray:
...Требования:
- вход — непустой конечный одномерный массив;
temperatureконечна и строго положительна;- вычисление устойчиво для логитов порядка 1000;
- выход конечен, неотрицателен и суммируется в 1;
- добавление одной константы ко всем логитам не меняет ответ.
Открытые проверки:
p = softmax_with_temperature(np.array([2.0, 1.0, 0.0]), 1.0)
assert np.isfinite(p).all()
assert abs(float(p.sum()) - 1.0) < 1e-14
q = softmax_with_temperature(np.array([1002.0, 1001.0, 1000.0]), 1.0)
assert np.allclose(p, q, atol=2e-14, rtol=0)Показать ответ и решение
import math
import numpy as np
def softmax_with_temperature(
logits: np.ndarray,
temperature: float,
) -> np.ndarray:
z = np.asarray(logits, dtype=np.float64)
if z.ndim != 1 or z.size == 0:
raise ValueError("logits must be a non-empty 1D array")
if not np.isfinite(z).all():
raise ValueError("logits must be finite")
if not math.isfinite(temperature) or temperature <= 0.0:
raise ValueError("temperature must be finite and positive")
scaled = z / temperature
scaled -= scaled.max()
weights = np.exp(scaled)
return weights / weights.sum()Вычитание максимума использует инвариантность softmax к общему сдвигу и предотвращает переполнение. Общий множитель сокращается в числителе и знаменателе, поэтому вероятности не меняются.
Энтропия политики и температурная кривая
Реализуйте:
def categorical_entropy(probabilities: np.ndarray) -> float:
...
def policy_entropy(logits: np.ndarray, temperature: float) -> float:
...Требования:
- энтропия измеряется в натах;
- нулевые вероятности обрабатываются по соглашению ;
- отрицательные вероятности и сумма, отличная от 1, отклоняются;
- для
logits=[2,1,0,-1]значения на сетке из основного текста воспроизводятся с ошибкой не более ; - на
np.geomspace(0.1, 10, 100)энтропия не убывает с численной погрешностью .
Дополнительный результат: сохраните график temperature_entropy_student.png и подпишите, что монотонность относится к чистому softmax.
Открытые проверки:
p = softmax_with_temperature(np.array([2.0, 1.0, 0.0]), 1.0)
assert abs(categorical_entropy(p) - 0.8323956) < 1e-6
assert abs(categorical_entropy([0.25, 0.25, 0.25, 0.25]) - np.log(4)) < 1e-12
assert abs(categorical_entropy([1.0, 0.0, 0.0])) < 1e-12Показать ответ и решение
import math
import numpy as np
def softmax_with_temperature(logits: np.ndarray, temperature: float) -> np.ndarray:
z = np.asarray(logits, dtype=np.float64)
if z.ndim != 1 or z.size == 0 or not np.isfinite(z).all():
raise ValueError("logits must be a non-empty finite 1D array")
if not math.isfinite(temperature) or temperature <= 0.0:
raise ValueError("temperature must be finite and positive")
scaled = z / temperature
shifted = scaled - np.max(scaled)
weights = np.exp(shifted)
return weights / weights.sum()
def categorical_entropy(probabilities: np.ndarray) -> float:
p = np.asarray(probabilities, dtype=np.float64)
if p.ndim != 1 or p.size == 0 or not np.isfinite(p).all():
raise ValueError("probabilities must be a non-empty finite 1D array")
if np.any(p < 0.0):
raise ValueError("probabilities must be non-negative")
if not math.isclose(float(p.sum()), 1.0, rel_tol=1e-10, abs_tol=1e-12):
raise ValueError("probabilities must sum to 1")
positive = p > 0.0
return float(-np.sum(p[positive] * np.log(p[positive])))
def policy_entropy(logits: np.ndarray, temperature: float) -> float:
return categorical_entropy(softmax_with_temperature(logits, temperature))Для воспроизводимости таблицы:
logits = np.array([2.0, 1.0, 0.0, -1.0])
for temperature in [0.25, 0.5, 1.0, 2.0, 4.0, 10.0]:
print(temperature, f"{policy_entropy(logits, temperature):.6f}")Результат: 0.093113, 0.455429, 0.947537, 1.245050, 1.348243, 1.380071.
Монте-Карло-оценка коридора
Реализуйте:
def run_corridor_episode(
rng: np.random.Generator,
*,
max_steps: int = 20,
) -> float:
...
def estimate_corridor_value(
n_episodes: int,
*,
seed: int = 7,
max_steps: int = 20,
) -> float:
...Протокол:
- состояния
0,1,2,3,4, старт2; action=0означает движение влево,action=1— вправо;rng.integers(0, 2)выбирает действие;- при достижении состояния
0накопленная награда равна0.0, при достижении4—1.0; - при истечении лимита шагов возвращается
0.0; - создаётся ровно один
np.random.default_rng(seed)на весь эксперимент.
Открытые проверки:
assert abs(estimate_corridor_value(1000, seed=7, max_steps=20) - 0.494) < 1e-15
estimate = estimate_corridor_value(20_000, seed=23, max_steps=20)
assert abs(estimate - 0.49951171875) < 0.02Объясните, почему сравнение с 0.5 допустимо для интуитивной проверки, но точное опорное значение этого запуска равно 1023/2048.
Показать ответ и решение
import numpy as np
def run_corridor_episode(
rng: np.random.Generator,
*,
max_steps: int = 20,
) -> float:
if not isinstance(max_steps, int) or isinstance(max_steps, bool) or max_steps <= 0:
raise ValueError("max_steps must be a positive integer")
state = 2
for _ in range(max_steps):
action = int(rng.integers(0, 2))
state += -1 if action == 0 else 1
if state == 0:
return 0.0
if state == 4:
return 1.0
return 0.0
def estimate_corridor_value(
n_episodes: int,
*,
seed: int = 7,
max_steps: int = 20,
) -> float:
if not isinstance(n_episodes, int) or isinstance(n_episodes, bool) or n_episodes <= 0:
raise ValueError("n_episodes must be a positive integer")
rng = np.random.default_rng(seed)
returns = [run_corridor_episode(rng, max_steps=max_steps) for _ in range(n_episodes)]
return float(np.mean(returns))Проверенные значения:
N=1000, seed=7, max_steps=20 -> 0.494
N=20000, seed=23, max_steps=20 -> 0.4933
exact finite-horizon value -> 0.49951171875Без ограничения по числу шагов симметрия коридора даёт вероятность правого терминала 0.5. При лимите в 20 шагов часть траекторий не успевает достичь ни одной границы и получает награду 0.0. Чтобы пережить очередные два шага, процесс должен вернуться из состояния 1 или 3 в состояние 2; вероятность этого равна 1/2. Поэтому вероятность не завершить эпизод за десять таких пар шагов равна . Оставшаяся вероятность по симметрии поровну распределяется между левым и правым терминалами, и точная вероятность правого терминала равна
Случайная оценка не обязана совпадать с точным значением в каждом запуске. Она должна вести себя в соответствии с дисперсией Бернулли и уменьшать типичную ошибку примерно как .