Модуль 4. Градиенты политики: от REINFORCE к PPO
Выберите ответы и нажмите «Проверить». Для чисел подходят точка, запятая и простые дроби. Ответы и черновики сохраняются в этом браузере и общие для RU/EN.
Открытые вопросы и задания с кодом проверяются самостоятельно по авторскому разбору. Код на сайте не запускается.
Проверено: 0 / 8 · Верно: 0
Вопрос P01 · Цена тождества логарифмической производной
один ответ
Тождество позволяет не дифференцировать . Что мы получаем взамен?
Вопрос P02 · Накопленная награда от текущего шага
код-задача
Спецификация: — награда от текущего шага до конца эпизода. Считать обратным проходом: , .
Формат ввода: строка 1 — награды через пробел; строка 2 — . Формат вывода: одна строка — через пробел (6 знаков).
Стартовый код:
import numpy as np
def reward_to_go(rewards, gamma=1.0):
# ВАШ КОД ЗДЕСЬ
raise NotImplementedError
if __name__ == "__main__":
rewards = [float(x) for x in input().split()]
gamma = float(input())
print(" ".join(f"{x:.6f}" for x in reward_to_go(rewards, gamma)))
Открытые тесты:
| stdin | stdout |
|---|---|
1 0 2 3 ⏎ 0.9 | 4.807000 4.230000 4.700000 3.000000 |
1 0 2 3 ⏎ 1.0 | 6.000000 5.000000 5.000000 3.000000 |
0 0 1 ⏎ 0.5 | 0.250000 0.500000 1.000000 |
Вопрос P03 · Что можно вычесть без поправки
один ответ
Из вычитают опорный уровень. Какое условие делает эту замену безопасной для ожидаемого градиента?
Вопрос P04 · Масштаб группового центрирования
числовой ответ · допуск ±0.005
Награды группы центрируются по общему среднему: , размер группы , ответы условно независимы.
На какой множитель отличается ожидание получаемой оценки градиента от ?
Вопрос P05 · RLOO и групповое среднее: коллинеарность и масштаб
код-задача
Спецификация: , где — среднее всей группы; . Требуется .
Формат ввода: строка 1 — размер группы ; строка 2 — награды через пробел.
Формат вывода: строка 1 — преимущества по общему среднему (6 знаков); строка 2 — преимущества RLOO (6 знаков); строка 3 — отношение (6 знаков) или undefined, если знаменатель равен нулю.
Стартовый код:
import numpy as np
def group_and_loo(rewards):
"""Верните (mean_advantages, loo_advantages)."""
# ВАШ КОД ЗДЕСЬ
raise NotImplementedError
if __name__ == "__main__":
g = int(input())
rewards = [float(x) for x in input().split()]
mean_adv, loo_adv = group_and_loo(rewards)
print(" ".join(f"{x:.6f}" for x in mean_adv))
print(" ".join(f"{x:.6f}" for x in loo_adv))
print(f"{loo_adv[0] / mean_adv[0]:.6f}" if abs(mean_adv[0]) > 1e-12 else "undefined")
Открытые тесты:
| stdin | stdout |
|---|---|
4 ⏎ 1 0 1 0 | 0.500000 -0.500000 0.500000 -0.500000 ⏎ 0.666667 -0.666667 0.666667 -0.666667 ⏎ 1.333333 |
3 ⏎ 2 2 2 | 0.000000 0.000000 0.000000 ⏎ 0.000000 0.000000 0.000000 ⏎ undefined |
Вопрос P06 · Обобщённое оценивание преимущества
код-задача
Спецификация: эпизод завершается терминально на последнем шаге. , где ; , . Цель критика: .
Формат ввода: строка 1 — награды; строка 2 — оценки ценности ; строка 3 — и . Формат вывода: строка 1 — через пробел (6 знаков); строка 2 — цели критика (6 знаков).
Стартовый код:
import numpy as np
def gae(rewards, values, gamma, lam):
"""Верните (advantages, value_targets)."""
# ВАШ КОД ЗДЕСЬ
raise NotImplementedError
if __name__ == "__main__":
rewards = [float(x) for x in input().split()]
values = [float(x) for x in input().split()]
gamma, lam = (float(x) for x in input().split())
adv, targets = gae(rewards, values, gamma, lam)
print(" ".join(f"{x:.6f}" for x in adv))
print(" ".join(f"{x:.6f}" for x in targets))
Открытые тесты:
| stdin | stdout |
|---|---|
0 0 1 ⏎ 0.4 0.5 0.6 ⏎ 1.0 0.5 | 0.250000 0.300000 0.400000 ⏎ 0.650000 0.800000 1.000000 |
0 0 1 ⏎ 0.4 0.5 0.6 ⏎ 1.0 0.0 | 0.100000 0.100000 0.400000 ⏎ 0.500000 0.600000 1.000000 |
Вопрос P07 · Бутстрэп на границе эпизода
один ответ
Пакет собирали с лимитом длины, и часть эпизодов оборвалась по этому лимиту, а часть закончилась настоящим терминалом. Что происходит с оценкой преимущества, если обе группы обработать одинаково — как терминальные?
Вопрос P08 · Когда плато клиппирования активно
несколько ответов
Для каких сочетаний знака преимущества и изменения отношения клиппированная ветвь действительно ограничивает цель? Отметьте все верные.
Вопрос P09 · Диагностика PPO: снаружи интервала и активный клип
код-задача
Спецификация: для каждого примера даны отношение и преимущество . Вычислите три показателя при заданном :
- доля ;
- доля примеров, где пессимистическая ветвь строго меньше неклиппированной, то есть ;
- неотрицательная выборочная оценка .
Формат ввода: строка 1 — число примеров и ; далее строк ratio advantage.
Формат вывода: три строки — показатели 1, 2 и 3 (6 знаков).
Стартовый код:
import numpy as np
def ppo_diagnostics(ratio, advantage, clip_epsilon):
"""Верните (outside_fraction, active_clip_fraction, approx_kl)."""
# ВАШ КОД ЗДЕСЬ
raise NotImplementedError
if __name__ == "__main__":
n, eps = input().split()
rows = [tuple(float(x) for x in input().split()) for _ in range(int(n))]
r = np.array([row[0] for row in rows])
a = np.array([row[1] for row in rows])
for value in ppo_diagnostics(r, a, float(eps)):
print(f"{value:.6f}")
Открытые тесты:
| stdin | stdout |
|---|---|
5 0.2 ⏎ 0.75 1.0 ⏎ 1.00 1.0 ⏎ 1.30 1.0 ⏎ 1.10 -1.0 ⏎ 0.85 -1.0 | 0.400000 ⏎ 0.200000 ⏎ 0.018505 |
Вопрос P10 · Неотрицательная выборочная оценка KL
числовой ответ · допуск ±0.001
Отношения вероятностей на трёх примерах: .
Чему равна оценка ?
Вопрос P11 · RLOO и GRPO: общая идея и различия
один ответ
RLOO и GRPO генерируют несколько ответов на один запрос и строят относительный сигнал. Что различает их в каноническом виде?
Вопрос P12 · Что не решает один вес на все токены
один ответ
Преимущество ответа размножено по всем токенам и умножено на маску. Что эта конструкция делает корректно, а что нет?