VKВлад КуликовОткрытые лекции
RL для LLM5 / 13

Модуль 5. Обучение по фиксированным данным: имитация, глубокие Q-методы и офлайн-RL

Сначала попробуйте решить упражнение. Ответы, подробные решения и проектные ориентиры раскрываются отдельно и сохраняют своё состояние при переключении RU/EN.

Скачать файлы курса (.zip) 382,1 КБ

Архив содержит файлы на обоих языках и вспомогательные материалы с сохранением структуры каталогов.

Когда SFT действительно является BC

Для каждого случая укажите, можно ли буквально считать токеновый SFT поведенческим копированием. Назовите состояние, действие и маску функции потерь.

  1. Модель получает запрос и экспертный ответ; потери считаются только по токенам ответа.

  2. Потери считаются по запросу пользователя и по ответу ассистента.

  3. Один «шаг» в задаче определяется как весь ответ целиком, но оптимизируется токеновая отрицательная логарифмическая правдоподобность.

  4. Для каждого запроса есть несколько демонстраций, и модель максимизирует их совместное правдоподобие.

Объясните, почему фраза «SFT всегда тождествен BC» без указания единицы действия и маски слишком сильна.

Показать ответ и решение
  1. Да, буквально в токеновой абстракции. Состояние st=(x,y<t)s_t=(x,y_{<t}), действие at=yta_t=y_t, маска равна единице только на токенах ответа. Максимизация правдоподобия демонстрационных действий и есть BC.

  2. Это всё ещё максимум правдоподобия последовательности, но более широкий процесс. Модель копирует также токены пользователя. Называть это BC политики ассистента без оговорки нельзя, потому что часть «действий» не принадлежит ассистенту.

  3. Да, при согласованных масках и агрегировании. На уровне полного ответа состояние — xx, действие — yy. Тождество −log⁡πθ(y∣x)=−∑tlog⁡πθ(yt∣x,y<t)-\log\pi_\theta(y\mid x)=-\sum_t\log\pi_\theta(y_t\mid x,y_{<t}) делает сумму токеновых NLL точной BC-целью для этого действия, включая EOS при одной и той же конвенции. Обратное распространение через факторизацию не меняет цель. Усреднение каждого ответа по собственной длине меняет веса примеров; деление общей суммы на фиксированное число токенов лишь масштабирует цель пакета.

  4. Да. Несколько демонстраций задают эмпирическое распределение экспертных действий. Максимум их правдоподобия остаётся BC, хотя эксперт уже не детерминирован.

Фраза без условий скрывает единицу действия, способ формирования состояния и маску. Именно эти элементы определяют, какую политику мы копируем.

Два распределения состояний

Пусть ошибка политики на состояниях эксперта равна 1%. Ответьте:

  1. Почему из этого не следует 1% ошибок при развёртывании?

  2. Когда расхождение dtπEd_t^{\pi_E} и dtπθd_t^{\pi_\theta} может оказаться небольшим?

  3. Приведите пример обратимой и необратимой ошибки.

  4. Какое дополнительное измерение качества нужно помимо точности действий на демонстрациях?

Показать ответ и решение
  1. Ошибка 1% измерена при s∼dtπEs\sim d_t^{\pi_E}. После собственной ошибки политика может перейти в состояния из dtπθd_t^{\pi_\theta}, которых почти нет в демонстрациях, и там частота ошибок может быть иной.

  2. Распределения остаются близкими, если ошибки редки и обратимы, динамика устойчива, демонстрации покрывают восстановление или модель хорошо обобщает на соседние состояния.

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

  4. Нужна оценка политики в замкнутом контуре: ожидаемая накопленная награда, вероятность успеха, стоимость отказа, качество восстановления или иной показатель на траекториях самой политики.

DAgger, RLHF и формат обратной связи

Сопоставьте три протокола:

  1. эксперт сообщает правильное действие для состояния, посещённого текущей политикой;

  2. человек выбирает лучший из двух полных ответов;

  3. автоматическая проверяющая программа выдаёт скалярную награду за полный ответ.

Какие из них соответствуют DAgger, обучению по предпочтениям и RL с проверяемой наградой? Что общего у протоколов и почему их целевые функции не следует смешивать?

Показать ответ и решение
  1. Это DAgger: эксперт даёт целевое действие в конкретном состоянии.

  2. Это обучение по предпочтениям; пары могут затем использоваться в модели награды, DPO или другой цели.

  3. Это RL с проверяемой наградой: программа задаёт скалярный сигнал за результат.

Общее состоит в том, что обратная связь собирается на поведении текущей политики, а не только на статических демонстрациях. Но действие эксперта, бинарное предпочтение и скалярная награда имеют разные пространства наблюдений и приводят к разным оценивателям и функциям потерь.

Буфер опыта и фиксированный журнал

Сравните обычный DQN с буфером опыта и офлайн-RL.

  1. Почему оба алгоритма могут обновляться по данным другой политики?

  2. Почему буфер DQN не делает задачу офлайн-RL?

  3. Что происходит, если текущая политика DQN обнаруживает новую полезную область состояний?

  4. Почему в фиксированном журнале та же ошибка покрытия принципиально опаснее?

Показать ответ и решение
  1. В обоих случаях целевая политика может отличаться от политики, собравшей переходы.

  2. DQN продолжает взаимодействовать со средой и обновляет буфер. Набор данных не фиксирован на весь период обучения.

  3. Новые переходы попадают в буфер; Q-функция может переоценить прежние выводы по реальному опыту.

  4. В офлайн-RL гипотеза о ненаблюдавшемся действии не проверяется. Ошибка значения может быть выбрана политикой и усилена бутстрэппингом без корректирующего опыта.

Целевая сеть и базовая политика

Целевая сеть DQN и базовая политика в RLHF могут быть замороженными копиями предыдущей модели. Для каждой конструкции укажите:

  1. какую величину она определяет;

  2. входит ли она в бутстрэппинговую цель;

  3. как и когда обновляется;

  4. почему внешнее сходство реализации не означает равенства математических ролей.

Показать ответ и решение

Целевая сеть DQN: задаёт значение следующего состояния в цели Беллмана, непосредственно участвует в бутстрэппинге и периодически копируется или медленно обновляется из основной сети.

Базовая политика RLHF: задаёт опорное распределение для регуляризации по дивергенции Кульбака—Лейблера (KL) или отношения вероятностей. Она не является оценкой будущей накопленной награды и обычно остаётся фиксированной в пределах запуска.

Обе могут быть копиями, но первая стабилизирует движущуюся численную цель значения, а вторая определяет стоимость ухода от поведения базы.

Невозможность без покрытия

В журнале наблюдалось только действие a0a_0 с наградой 0; действие a1a_1 отсутствует.

  1. Постройте два мира, согласованных с журналом, но имеющих разные оптимальные действия.

  2. Почему ни один алгоритм не может по этому журналу гарантированно выбрать оптимальное действие в обоих мирах?

  3. Какое дополнительное предположение могло бы сделать вывод возможным?

  4. Почему большая нейросеть не устраняет неидентифицируемость?

Показать ответ и решение
  1. Мир A: r(a0)=0r(a_0)=0, r(a1)=+1r(a_1)=+1. Мир B: r(a0)=0r(a_0)=0, r(a1)=−1r(a_1)=-1.

  2. Журнал одинаков, значит алгоритм получает один и тот же вход и выдаёт один и тот же результат. Одно действие не может быть оптимальным в обоих мирах.

  3. Возможны предположения о гладкости награды по признакам, известная модель динамики, структурная связь между действиями, причинная модель или новое взаимодействие.

  4. Большая сеть может выразить больше функций, но данные не выбирают между двумя совместимыми мирами. Дополнительная ёмкость не создаёт отсутствующего наблюдения.

Четыре защиты в офлайн-RL

Сопоставьте методы с основным механизмом:

  • Q-обучение с ограничением на пакет данных (Batch-Constrained deep Q-learning, BCQ);
  • TD3+BC (Twin Delayed Deep Deterministic Policy Gradient plus BC);
  • CQL;
  • IQL.

Механизмы:

  1. ограничить кандидатов действиями, похожими на журнал;

  2. добавить поведенческий штраф к обновлению актора;

  3. занизить значения широкого множества действий относительно действий журнала;

  4. обучать ценность через действия данных и извлекать политику взвешенным BC.

Для каждого метода назовите один возможный изъян при слишком сильной консервативности.

Показать ответ и решение
  • BCQ → 1: ограничивает кандидатов действиями, похожими на журнал. Слишком сильное ограничение не позволит выбрать редкое, но полезное улучшение.
  • TD3+BC → 2: сочетает значение и близость к действию данных. Большой коэффициент BC сведёт метод к копированию поведения.
  • CQL → 3: понижает относительные значения широкого набора действий. Сильный штраф может систематически недооценивать хорошие действия.
  • IQL → 4: обучает ценность по действиям данных и извлекает политику взвешенным BC. Неудачные τ\tau, β\beta или ограничение веса могут либо не улучшить политику, либо чрезмерно сосредоточить её на малой части данных.

DT, DPO и ILQL

Для каждой постановки укажите основные объекты обучения и наличие бутстрэппинга Беллмана.

  1. Decision Transformer;

  2. прямая оптимизация предпочтений (Direct Preference Optimization, DPO);

  3. неявное языковое Q-обучение (Implicit Language Q-Learning, ILQL).

Почему все три метода могут использовать фиксированные данные, но не являются одной и той же разновидностью офлайн-RL?

Показать ответ и решение
  • DT: обучает условное распределение действий по состоянию, истории и оставшейся награде; явного бутстрэппинга Беллмана нет.
  • DPO: обучает политику по парным предпочтениям и отношению к базовой политике; Q-функция и цель Беллмана отсутствуют.
  • ILQL: обучает токеновые QQ и VV по награждённым траекториям; использует последовательную ценностную рекурсию и затем смещает политику преимуществом.

Фиксированность данных описывает режим доступа к опыту, но не определяет единственную математическую цель. Тип записи — демонстрация, предпочтение или переход с наградой — меняет доступные контрфакты и объект обучения.

Маскированная потеря BC/SFT

Даны логарифмы вероятностей демонстрационных токенов

L=(−0.1−0.2−1.0−0.3−0.7−0.4)L= \begin{pmatrix} -0.1 & -0.2 & -1.0\\ -0.3 & -0.7 & -0.4 \end{pmatrix}

и маска

M=(011001).M= \begin{pmatrix} 0 & 1 & 1\\ 0 & 0 & 1 \end{pmatrix}.

Вычислите сумму отрицательных логарифмических правдоподобий и среднее по активным токенам. Почему деление на размер всей матрицы дало бы другую целевую функцию?

Показать ответ и решение

Активны три элемента: −0.2-0.2, −1.0-1.0 и −0.4-0.4. Поэтому

∑−LijMij=0.2+1.0+0.4=1.6,\sum -L_{ij}M_{ij}=0.2+1.0+0.4=1.6, Lmean=1.63=0.533333…\mathcal L_{\mathrm{mean}}=\frac{1.6}{3}=0.533333\ldots

Деление на 6 дало бы 0.2666670.266667 и сделало масштаб градиента зависимым от числа замаскированных позиций. Обычно среднее берут по токенам, которые действительно входят в цель.

Канат без асимптотики

Для ε=0.02\varepsilon=0.02 и T=20T=20 вычислите:

  1. точный JBCJ_{\mathrm{BC}};

  2. точный регрет;

  3. приближение εT(T+1)/2\varepsilon T(T+1)/2;

  4. нормированный регрет (T−J)/(εT2)(T-J)/(\varepsilon T^2).

Объясните, почему приближение уже заметно отличается от точного ответа.

Показать ответ и решение

При q=0.98q=0.98:

J=0.98(1−0.9820)0.02≈16.287209384.J=\frac{0.98(1-0.98^{20})}{0.02} \approx16.287209384.

Точный регрет:

20−J≈3.712790616.20-J\approx3.712790616.

Первый порядок:

0.02⋅20⋅212=4.2.\frac{0.02\cdot20\cdot21}{2}=4.2.

Нормированный регрет:

3.7127906160.02⋅202≈0.464098827.\frac{3.712790616}{0.02\cdot20^2} \approx0.464098827.

Здесь εT=0.4\varepsilon T=0.4 уже не очень мало, поэтому члены порядка ε2T3\varepsilon^2T^3 заметны и линейное по ε\varepsilon приближение завышает потерю.

Цели DQN и терминальная маска

Даны

r=(1,−2,0.5),d=(0,1,0),γ=0.9,r=(1,-2,0.5),\qquad d=(0,1,0),\qquad \gamma=0.9,

и значения целевой сети в следующих состояниях:

Qθ−(s′,⋅)=(24100100−13).Q_{\theta^-}(s',\cdot)= \begin{pmatrix} 2 & 4\\ 100 & 100\\ -1 & 3 \end{pmatrix}.

Вычислите три цели DQN. Почему значение 100 не входит во вторую цель?

Показать ответ и решение

Максимумы равны (4,100,3)(4,100,3). С учётом маски:

y1=1+0.9⋅4=4.6,y_1=1+0.9\cdot4=4.6, y2=−2+0=−2,y_2=-2+0=-2, y3=0.5+0.9⋅3=3.2.y_3=0.5+0.9\cdot3=3.2.

Во втором переходе d=1d=1: продолжения задачи нет, поэтому значение следующего состояния не бутстрэппится.

DQN против Double DQN

Пусть

Qθ(s′,⋅)=(354210),Qθ−(s′,⋅)=(1012−167).Q_\theta(s',\cdot)= \begin{pmatrix} 3&5&4\\ 2&1&0 \end{pmatrix}, \qquad Q_{\theta^-}(s',\cdot)= \begin{pmatrix} 10&1&2\\ -1&6&7 \end{pmatrix}.

Награды r=(0,1)r=(0,1), оба перехода нетерминальны, γ=0.5\gamma=0.5.

  1. Вычислите обычные цели DQN.

  2. Какие действия выберет основная сеть?

  3. Вычислите цели Double DQN.

  4. Как пример иллюстрирует разделение выбора и оценивания?

Показать ответ и решение

Обычный DQN использует максимумы целевой сети: 1010 и 77:

yDQN=(0+0.5⋅10,  1+0.5⋅7)=(5,4.5).y_{\mathrm{DQN}}=(0+0.5\cdot10,\;1+0.5\cdot7)=(5,4.5).

Основная сеть выбирает действия (1,0)(1,0). Целевая сеть оценивает именно их значениями (1,−1)(1,-1):

yDouble=(0+0.5⋅1,  1+0.5⋅(−1))=(0.5,0.5).y_{\mathrm{Double}}=(0+0.5\cdot1,\;1+0.5\cdot(-1))=(0.5,0.5).

Пример намеренно создаёт сильное расхождение ранжирований. DQN выбирает и оценивает максимум одной таблицы, а Double DQN выбирает по одной и оценивает по другой.

CQL и экспектильная потеря IQL

Для одного состояния значения действий равны

Q=(2,0,−1),Q=(2,0,-1),

а в журнале наблюдалось действие 0.

  1. Вычислите дискретный штраф CQL
log⁡∑aeQ(a)−Q(0).\log\sum_a e^{Q(a)}-Q(0).
  1. Для остатка IQL u=(−2,1,3)u=(-2,1,3) и τ=0.8\tau=0.8 вычислите поэлементную экспектильную потерю
∣τ−1{u<0}∣u2\left|\tau-\mathbf 1\{u<0\}\right|u^2

и её среднее.

  1. Объясните, почему положительные остатки получают больший вес при τ>1/2\tau>1/2.
Показать ответ и решение

Штраф CQL:

log⁡(e2+e0+e−1)−2≈0.169846020.\log(e^2+e^0+e^{-1})-2 \approx0.169846020.

Для τ=0.8\tau=0.8 отрицательный остаток получает вес 1−τ=0.21-\tau=0.2, положительные — τ=0.8\tau=0.8:

L=(−2)2⋅0.2,  12⋅0.8,  32⋅0.8=(0.8,0.8,7.2).L=(-2)^2\cdot0.2,\;1^2\cdot0.8,\;3^2\cdot0.8 =(0.8,0.8,7.2).

Среднее:

0.8+0.8+7.23=2.933333…\frac{0.8+0.8+7.2}{3}=2.933333\ldots

Больший вес положительных остатков заставляет VV двигаться к верхней части распределения значений действий из данных.

Оставшаяся награда и условие DT

Для наград

r=(1,0,−2,4)r=(1,0,-2,4)
  1. вычислите недисконтированную оставшуюся награду;

  2. начиная с желаемого значения 5, обновляйте цель после каждой награды;

  3. для одного шага с Gttarget=5G_t^{\mathrm{target}}=5, rt=1r_t=1 и γ=0.5\gamma=0.5 вычислите следующую дисконтированную цель;

  4. объясните, почему большое желаемое значение не гарантирует большую фактическую накопленную награду.

Показать ответ и решение

Обратные суммы:

G=(3,2,2,4).G=(3,2,2,4).

При начальной цели 5 недисконтированное обновление даёт

5→4→4→6→2.5\to4\to4\to6\to2.

Для γ=0.5\gamma=0.5:

Gt+1target=5−10.5=8.G_{t+1}^{\mathrm{target}}=\frac{5-1}{0.5}=8.

Цель — входное условие модели. Если данных для столь высокой награды нет, модель вынуждена экстраполировать; условие не меняет динамику среды и не является гарантией результата.

Маскированная отрицательная логарифмическая правдоподобность

Реализуйте:

Python
import numpy as np

def masked_bc_nll(
    selected_log_probs: np.ndarray,
    mask: np.ndarray,
    reduction: str = "mean",
) -> float:
    """Вернуть среднюю или сумму -log pi на активных позициях."""
    ...

Требования: формы должны совпадать; маска содержит только 0 и 1; пустая маска вызывает ValueError; reduction принимает только "mean" или "sum".

Открытые проверки:

Python
logprobs = np.array([[-0.1, -0.2, -1.0], [-0.3, -0.7, -0.4]])
mask = np.array([[0, 1, 1], [0, 0, 1]])
assert abs(masked_bc_nll(logprobs, mask, reduction="sum") - 1.6) < 1e-12
assert abs(masked_bc_nll(logprobs, mask) - 1.6 / 3) < 1e-12
Показать ответ и решение
Python
import numpy as np

def masked_bc_nll(
    selected_log_probs: np.ndarray,
    mask: np.ndarray,
    reduction: str = "mean",
) -> float:
    lp = np.asarray(selected_log_probs, dtype=np.float64)
    m = np.asarray(mask)
    if lp.shape != m.shape:
        raise ValueError("shapes must match")
    if np.any((m != 0) & (m != 1)):
        raise ValueError("mask must be binary")
    active_count = int(m.sum())
    if active_count == 0:
        raise ValueError("empty active mask")
    total = float(np.where(m.astype(bool), -lp, 0.0).sum())
    if reduction == "sum":
        return total
    if reduction == "mean":
        return total / active_count
    raise ValueError("reduction must be 'mean' or 'sum'")

Точный расчёт каната

Реализуйте устойчивую замкнутую форму:

Python
def tightrope_return(epsilon: float, horizon: int) -> float:
    ...

def tightrope_regret(epsilon: float, horizon: int) -> float:
    ...

Обработайте ε=0\varepsilon=0, T=0T=0 и ошибочные входы.

Открытые проверки:

Python
assert tightrope_return(0.0, 20) == 20.0
assert tightrope_regret(0.0, 20) == 0.0
Показать ответ и решение
Python
def tightrope_return(epsilon: float, horizon: int) -> float:
    if not 0.0 <= epsilon <= 1.0 or horizon < 0:
        raise ValueError
    if horizon == 0:
        return 0.0
    if epsilon == 0.0:
        return float(horizon)
    q = 1.0 - epsilon
    return q * (1.0 - q ** horizon) / epsilon

def tightrope_regret(epsilon: float, horizon: int) -> float:
    return float(horizon) - tightrope_return(epsilon, horizon)

DQN и Double DQN

Реализуйте векторизованные функции:

Python
import numpy as np

def dqn_targets(rewards, terminated, next_q_target, gamma=0.99):
    ...

def double_dqn_targets(rewards, terminated, next_q_online, next_q_target, gamma=0.99):
    ...

Форма значений — [B, A]; терминальные переходы не бутстрэппятся.

Открытые проверки:

Python
result = dqn_targets(
    np.array([1.0, -2.0, 0.5]),
    np.array([0, 1, 0]),
    np.array([[2.0, 4.0], [100.0, 100.0], [-1.0, 3.0]]),
    gamma=0.9,
)
np.testing.assert_allclose(result, [4.6, -2.0, 3.2])
Показать ответ и решение
Python
import numpy as np

def dqn_targets(rewards, terminated, next_q_target, gamma=0.99):
    r = np.asarray(rewards, dtype=float)
    term = np.asarray(terminated, dtype=bool)
    q = np.asarray(next_q_target, dtype=float)
    return r + gamma * (~term) * q.max(axis=1)

def double_dqn_targets(rewards, terminated, next_q_online, next_q_target, gamma=0.99):
    r = np.asarray(rewards, dtype=float)
    term = np.asarray(terminated, dtype=bool)
    online = np.asarray(next_q_online, dtype=float)
    target = np.asarray(next_q_target, dtype=float)
    actions = online.argmax(axis=1)
    selected = target[np.arange(len(r)), actions]
    return r + gamma * (~term) * selected

В рабочем коде нужно дополнительно проверять формы и диапазон γ\gamma; это сделано в module_5_reference.py.

Простейший пессимистический выбор

Для оценённых средних наград μ^a\hat\mu_a и числа наблюдений nan_a реализуйте учебный нижний доверительный балл

μ^a−cna.\hat\mu_a-\frac{c}{\sqrt{n_a}}.

Действия с na=0n_a=0 должны получать −∞-\infty. Объясните, почему это лишь иллюстрация покрытия, а не универсальный алгоритм офлайн-RL.

Сигнатура:

Python
def pessimistic_values(
    empirical_means: np.ndarray,
    counts: np.ndarray,
    *,
    radius_scale: float = 1.0,
) -> np.ndarray:
    ...

Открытые проверки:

Python
values = pessimistic_values(np.array([0.8, 0.5]), np.array([4, 0]))
assert abs(values[0] - 0.3) < 1e-12
assert values[1] == -np.inf
wide = pessimistic_values(np.array([0.8]), np.array([1]))
assert wide[0] < 0.3
Показать ответ и решение
Python
import numpy as np

def pessimistic_values(
    empirical_means: np.ndarray,
    counts: np.ndarray,
    *,
    radius_scale: float = 1.0,
) -> np.ndarray:
    means = np.asarray(empirical_means, dtype=np.float64)
    n = np.asarray(counts, dtype=np.float64)
    if means.shape != n.shape or np.any(n < 0) or not np.isfinite(radius_scale) or radius_scale < 0:
        raise ValueError("invalid shapes, counts, or radius_scale")
    out = np.full_like(means, -np.inf)
    seen = n > 0
    out[seen] = means[seen] - radius_scale / np.sqrt(n[seen])
    return out

Правило использует только число наблюдений и не учитывает последовательную динамику, качество представления, систематический сдвиг данных или корректную статистическую границу. Это иллюстрация идеи, а не общий метод.

CQL, экспектиль и веса IQL

Реализуйте:

Python
def cql_penalty(q_values, data_actions):
    ...

def expectile_loss(residuals, tau):
    ...

def iql_weights(advantages, beta, max_weight=100.0):
    ...

cql_penalty должен использовать устойчивый logsumexp, а веса IQL — ограничиваться сверху.

Открытые проверки:

Python
q = np.array([2.0, 0.0, -1.0])
assert abs(cql_penalty(q, 0) - (np.log(np.exp(q).sum()) - 2.0)) < 1e-9
assert cql_penalty(q, 0) > 0.0
assert abs(cql_penalty(q, 0) - 0.1698460) < 1e-6
Показать ответ и решение
Python
import numpy as np

def _logsumexp(x, axis=-1):
    x = np.asarray(x, dtype=float)
    m = np.max(x, axis=axis, keepdims=True)
    return np.squeeze(m + np.log(np.exp(x - m).sum(axis=axis, keepdims=True)), axis=axis)

def cql_penalty(q_values, data_actions):
    q = np.asarray(q_values, dtype=float)
    if q.ndim == 1:
        q = q[None, :]
    a = np.asarray(data_actions, dtype=int)
    if a.ndim == 0:
        a = np.full(q.shape[0], int(a))
    return float(np.mean(_logsumexp(q) - q[np.arange(q.shape[0]), a]))

def expectile_loss(residuals, tau):
    u = np.asarray(residuals, dtype=float)
    if not 0 < tau < 1:
        raise ValueError
    return np.abs(tau - (u < 0)) * u ** 2

def iql_weights(advantages, beta, max_weight=100.0):
    a = np.asarray(advantages, dtype=float)
    return np.minimum(np.exp(np.minimum(beta * a, np.log(max_weight))), max_weight)

Оставшаяся награда и обновление цели

Реализуйте:

Python
def return_to_go(rewards, gamma=1.0):
    ...

def update_target_return(current_target, reward, gamma=1.0):
    ...

Вторая функция использует (Gt−rt)/γ(G_t-r_t)/\gamma и должна отклонять γ=0\gamma=0.

Открытые проверки:

Python
np.testing.assert_allclose(return_to_go([1.0, 0.0, -2.0, 4.0]), [3.0, 2.0, 2.0, 4.0])
Показать ответ и решение
Python
import numpy as np

def return_to_go(rewards, gamma=1.0):
    r = np.asarray(rewards, dtype=float)
    out = np.empty_like(r)
    running = 0.0
    for t in range(len(r) - 1, -1, -1):
        running = r[t] + gamma * running
        out[t] = running
    return out

def update_target_return(current_target, reward, gamma=1.0):
    if not 0.0 < gamma <= 1.0:
        raise ValueError("gamma must be in (0, 1]")
    return (float(current_target) - float(reward)) / gamma