Траектория «Обучение с подкреплением» · конспект 12 из 12

Обучение по видео: RLV и APV

О чём эта тема
Как использовать видеозаписи — наблюдения без действий и наград — для обучения агента. Два подхода из исследовательских работ с открытым кодом: RLV достраивает к видео недостающие действия и награды и скармливает их off-policy алгоритму; APV предобучает на видео модель мира, которую затем дообучает под управление. По репозиториям rl_with_videos (Шмекпепер и др., CoRL 2020) и apv (Со и др., ICML 2022).
Аннотация
Конспект начинается с инвентаризации: чем видеозапись отличается от привычного опыта агента — в ней нет действий, нет наград и, как правило, другой домен (человеческая рука вместо манипулятора). Дальше два способа компенсировать недостачу. Model-free путь — RLV: обратная модель динамики учится на собственных переходах агента угадывать действие по паре соседних наблюдений, размечает ею видео, награды подменяются простой схемой «успех дорог, шаг дёшев», и псевдопереходы пополняют replay buffer off-policy алгоритма; доменный сдвиг гасится дискриминатором — прямой роднёй GAN из «Нейросетей». Мы воспроизводим идею в табличном виде на машинке — включая честно найденные грабли с подменой наград. Model-based путь — APV: модель мира и её латентная динамика вводятся аккуратно, предобучаются на видео без действий, затем поверх надстраивается action-conditional слой, а видеопамять даёт разведочный бонус за новизну. Завершается конспект сравнением путей и местом видео-RL на карте методов траектории.
Пререквизиты
Конспект 7 (DQN, память переходов, off-policy), конспект 10 (актёр-критик, непрерывные действия), конспект 11 (энтропийный бонус), конспект 2 (разведка и новизна), конспект 6 (обёртки, терминальность). Из «Нейросетей»: конспект 9 (автоэнкодеры, латентные представления), конспект 11 (GAN и дискриминатор).
Мотивация
Всю траекторию агент платил за опыт взаимодействием: миллион шагов DQN — миллион реальных касаний среды. Для игры это бесплатно, для робота — недели работы железа и сломанные детали. Между тем видеозаписей того, как задачу решают другие — люди, чужие роботы, — сколько угодно, и стоят они ничего: один YouTube хранит вечность чужого моторного опыта. Человек так и учится: сначала смотрит, как делают другие, потом пробует сам. Вопрос конспекта: что мешает агенту учиться с чужого показа — и как исследователи это обходят.

1. Чего нет в видео

Весь наш аппарат построен на переходах \((s, a, r, s')\): их складывает в память DQN, по ним считает TD-ошибку критик, из них собирает батчи PPO. Видеозапись даёт лишь усечённую версию — последовательность наблюдений \((o_0, o_1, o_2, \ldots)\), то есть пары \((s, s')\) без середины:

Заметьте: это ровно те три компонента, которых не хватало и в наших средах, пока мы их не построили в конспекте 6, — только теперь их не выдаёт даже среда. Два подхода ниже отвечают на недостачу противоположно: RLV достраивает недостающее и продолжает жить в мире model-free переходов; APV меняет постановку — учит на видео то, чему действия не нужны: как устроен мир.

2. RLV: достроить действия и награды

Метод RLV (Reinforcement Learning with Videos) держит два хранилища опыта: обычную память переходов агента (с действиями и наградами — как в DQN) и видеопул из пар \((s, s')\). Задача — сделать видеопул полноценным. Первая недостача лечится красиво.

2.1. Обратная модель динамики

Агент, взаимодействуя со средой, и так накапливает тройки \((s, a, s')\). На них можно обучить с учителем обратную модель динамики (англ. inverse dynamics model) — сеть, угадывающую действие по паре соседних наблюдений:

\[ \hat a = f_\psi(s, s'), \qquad L(\psi) = \mathbb{E}_{(s,a,s') \sim \text{агент}} \bigl\| f_\psi(s, s') - a \bigr\|^2 \;\to\; \min_\psi. \tag{12.1}\]

Это «задача-перевёртыш» к модели среды: не «что будет, если сделать \(a\)», а «что сделали, раз получилось \(s'\)». Она обычно намного проще прямой задачи — часто действие почти однозначно читается из разности состояний (в тренажёре ниже вы ощутите это на себе). Обученной моделью размечается видеопул: \(\hat a = f_\psi(s, s')\) для каждой видеопары. В коде репозитория это один вызов на объединённом батче:

# rl_with_videos/algorithms/rl_with_videos.py (сокращено)
combined_first_obs = tf.concat([action_con_obs, action_free_obs], axis=0)
combined_next_obs  = tf.concat([action_con_next_obs, action_free_next_obs], axis=0)
combined_pred_actions = self._inverse_model([combined_first_obs, combined_next_obs])

pred_seen_actions   = combined_pred_actions[:256]   # переходы агента: действия известны
pred_unseen_actions = combined_pred_actions[256:]   # видео: сюда попадут предсказания

inverse_model_loss = tf.losses.mean_squared_error(       # (12.1): учимся на своих
    labels=true_actions, predictions=pred_seen_actions)

2.2. Подмена наград — и почему она обязана быть такой

Наград в видео нет, и RLV подменяет их бинарной схемой: финальный кадр успешной демонстрации получает большую положительную награду, все остальные — маленький штраф за шаг:

\[ \hat r = \begin{cases} r_{\text{scale}}, & \text{терминальный кадр (успех),} \\ r_{\text{bottom}}, & \text{иначе,} \end{cases} \qquad \text{в опытах авторов } r_{\text{scale}} = 10,\; r_{\text{bottom}} = -1. \tag{12.2}\]

Выглядит грубо — на деле это единственная информация, которая в видео есть: «показанное ведёт к успеху, и чем короче, тем лучше». Мы убедились в необходимости этой схемы на собственных граблях (раздел 4): попытка оставить видеопереходам «честные» награды среды делает видео вредным.

2.3. Доменный сдвиг: дискриминатор

Если видео из чужого домена (человеческая рука), наблюдения агента и кадры видео нельзя подавать в одну сеть как есть. RLV выравнивает их представления состязательно — знакомым по «Нейросетям» (конспект 11) приёмом GAN: дискриминатор учится по внутреннему представлению кадра угадывать, из какого он домена, а энкодер наблюдений — представлять кадры так, чтобы дискриминатор ошибался. Дополнительно, если есть немного «парных» кадров (один момент задачи, снятый в обоих доменах), их представления притягиваются друг к другу напрямую (MSE). В итоге видеопул стал неотличим от собственного опыта: каждая видеопара несёт \((s, \hat a, \hat r, s')\) — и просто подмешивается в батчи off-policy алгоритма (в статье — SAC, актёр-критик с энтропийным бонусом из конспекта 11, живущий на памяти переходов как DQN). Никаких изменений в самом алгоритме: половина батча из жизни, половина из кино.

Типичная ошибка Обучать обратную модель на самих видеоданных или «доучивать» её на предсказанных ею же действиях. Действия из видео модель никогда не видела — supervised-потеря (12.1) считается только на переходах агента, где действие известно; на видео модель лишь применяется. Обучение на собственных предсказаниях — замкнутый круг, уверенно закрепляющий ошибку.

3. Тренажёр: сыграйте в обратную модель

Почувствуйте задачу обратной модели руками. Ниже пары соседних состояний машинки из конспекта 7 — «два кадра видео» (позиция и скорость показаны стрелкой). Угадайте, какое действие было между ними: толкали влево или вправо? Против вас играет обратная модель — логистическая регрессия, обученная по формуле (12.1) на 10 000 переходов случайной политики; её веса экспортированы прямо в страницу.

Тренажёр: человек против обратной модели динамики
каким было действие?
склон — профиль горки · две машинки: кадр t (бледная) и кадр t+1 (яркая) · стрелки — скорости · пары сгенерированы точной физикой среды

После десятка пар станет видно, где задача лёгкая, а где нет. Лёгкие пары — где скорость заметно изменилась: прирост больше «гравитации склона» выдаёт толчок вправо. Трудные — на крутом склоне и в областях, где модель мало училась: наша логрегрессия видела в основном ложбину (данные — случайная политика) и на правом склоне заметно плавает — в разделе 4 это же аукнется на разметке видео эксперта. Большую часть работы всё равно делает физика: действие почти читается из разности скоростей — потому обратная модель в RLV и остаётся маленькой сетью, а не наукой.

4. Мини-RLV на машинке: воспроизводим идею в 100 строк

Проверим конструкцию RLV в самом прозрачном исполнении — на табличном Q-обучении машинки из конспекта 7. «Видео» нам сыграет обученный там же эксперт: 200 эпизодов его езды, из которых мы сохраняем только наблюдения — пары \((s, s')\) и флаг терминальности, никаких действий и наград:

Обученная машинка раскачивается и доезжает до флага — демонстрация эксперта
Наше «видео с YouTube»: эксперт решает задачу. Какие действия он нажимал — в данных отсутствует

Дальше по рецепту RLV: обратная модель (логистическая регрессия по паре состояний) обучается на 10 000 переходов случайной политики и размечает 22 104 видеоперехода эксперта. Честная точность разметки — мы можем её измерить, потому что настоящие действия эксперта втайне записали, — 94,6%, и её география поучительна: 97% в ложбине, где случайная политика бывала, но лишь 88% в правой части склона (x > −0,2), куда случайные раскачки не забираются, — доменный сдвиг из раздела 2.3 в миниатюре: модель хуже всего там, где её не учили, а эксперт как раз ездит. Видеопул размечен; на каждый настоящий шаг среды — четыре обновления Q из видео.

Кривые обучения: Q-learning без видео остаётся на -200, с видео выходит на уровень около -110
Мини-RLV: одинаковые агенты, единственная разница — видео в батчах. Наш запуск, 10 000 эпизодов

Результат стоил трёх запусков, и каждая неудача поучительнее успеха. Запуск первый: видеопереходам оставили «честные» награды среды (−1 всюду) — агент с видео учился хуже базового. Причина: при инициализации таблицы нулём непосещённые действия выглядят привлекательнее (Q = 0) размеченного коридора, который лишние обновления с r = −1 только прижимают вниз. Запуск второй: подмена наград по RLV (+10 терминалу) — паритет: маяк +10 при γ = 0,99 перевешивает штрафы лишь на десятке шагов от флага, дальше коридор всё ещё проигрывает нулю. Запуск третий: нейтральная инициализация Q = −100 (реальная цена вечного болтания) у обоих агентов — и картина сверху: базовый агент, лишённый дармового оптимизма нуля, застревает на −200 на все 10 000 эпизодов, а агент с видео уже к 4000-му ездит на уровне эксперта (−110). Мораль двойная: видео решает задачу разведки, которую иначе решать нечем, — но встроить чужой опыт в обучение сложнее, чем кажется: схема наград и инициализация не мелочи, а условия работоспособности.

Полный код для проектов: мини-RLV на MountainCar (numpy, один файл)
# mini_rlv_mcar.py — идея RLV в табличном исполнении на MountainCar-v0.
# 1) "Видео" эксперта: пары (s, s') БЕЗ действий (эксперт - Q-таблица из конспекта 7).
# 2) Обратная модель динамики учится на переходах СЛУЧАЙНОЙ политики (действия известны).
# 3) Видео размечается обратной моделью -> псевдопереходы пополняют обучение Q-learning.
import numpy as np
import gymnasium as gym

env = gym.make("MountainCar-v0")
BINS = (101, 101)
low, high = np.array([-1.2, -0.07]), np.array([0.6, 0.07])
ACTIONS = [0, 2]

def index(s):
    ix = ((s - low) / (high - low) * (np.array(BINS) - 1)).astype(int)
    return tuple(np.clip(ix, 0, np.array(BINS) - 1))

# --- 1. видео эксперта: только наблюдения ---
Q_expert = np.load(r"C:\Users\Evgenie\AppData\Local\Temp\mcar_Q2.npy")
rng = np.random.default_rng(0)
video = []                                   # (s, s2, terminal) - и всё!
for ep in range(200):
    s, _ = env.reset(seed=int(rng.integers(1e9)))
    for t in range(200):
        a = int(np.argmax(Q_expert[index(s)]))
        s2, r, term, trunc, _ = env.step(ACTIONS[a])
        video.append((s.copy(), s2.copy(), term))
        s = s2
        if term or trunc: break
video = [(np.array(v[0]), np.array(v[1]), v[2]) for v in video]
print(f"видео: {len(video)} переходов, действий в данных НЕТ")

# --- 2. обратная модель: softmax-регрессия a = f(s, s') на своих переходах ---
inter = []                                   # переходы случайной политики: действия известны
for ep in range(50):
    s, _ = env.reset(seed=int(rng.integers(1e9)))
    for t in range(200):
        a = int(rng.integers(2))
        s2, r, term, trunc, _ = env.step(ACTIONS[a])
        inter.append((s.copy(), a, s2.copy()))
        s = s2
        if term or trunc: break
X = np.array([[s[0], s[1], s2[0], s2[1], s2[1] - s[1]] for s, a, s2 in inter])
y = np.array([a for s, a, s2 in inter])
mu, sd = X.mean(0), X.std(0) + 1e-8
Xn = (X - mu) / sd
W = np.zeros(X.shape[1] + 1)                 # логистическая регрессия, град. спуск
Xb = np.hstack([Xn, np.ones((len(Xn), 1))])
for it in range(3000):
    p = 1 / (1 + np.exp(-Xb @ W))
    W -= 0.5 * Xb.T @ (p - y) / len(y)
acc = ((Xb @ W > 0).astype(int) == y).mean()
print(f"обратная модель обучена на {len(inter)} переходах, точность на них: {acc:.3f}")

def inverse(s, s2):
    x = (np.array([s[0], s[1], s2[0], s2[1], s2[1] - s[1]]) - mu) / sd
    return int(np.append(x, 1.0) @ W > 0)

# --- 3. разметка видео и сравнение обучения ---
# подмена наград по RLV (replace_rewards_scale=10, bottom=-1):
# успех на видео награждается ПОЛОЖИТЕЛЬНО - иначе видео-опыт только вредит (см. конспект)
pseudo = [(index(s), inverse(s, s2), 10.0 if term else -1.0, index(s2), term)
          for s, s2, term in video]
# точность разметки проверим на выборке interaction-переходов (истинные действия знаем)
val = inter[::7]
val_acc = np.mean([inverse(s, s2) == a for s, a, s2 in val])
print(f"точность обратной модели на отложенных переходах: {val_acc:.3f}")

def train(use_video, episodes=10000, seed=1):
    rng = np.random.default_rng(seed)
    # нейтральная инициализация: "болтаться стоит -100" (сумма -1 при gamma=0.99).
    # ноль был бы ОПТИМИЗМОМ: непосещённые клетки казались бы лучше коридора эксперта
    Q = np.full(BINS + (2,), -100.0)
    gamma, lm = 0.99, 0.1
    eps1, eps2, decays = 1.0, 0.001, 5000
    epsilon, decay = eps1, np.exp(np.log(eps2 / eps1) / decays)
    rews = []
    for ep in range(episodes):
        s, _ = env.reset(seed=int(rng.integers(1e9)))
        si, total = index(s), 0.0
        for t in range(200):
            a = int(rng.integers(2)) if rng.random() < epsilon else int(np.argmax(Q[si]))
            s2, r, term, trunc, _ = env.step(ACTIONS[a])
            s2i = index(s2)
            target = r + gamma * np.max(Q[s2i]) * (0.0 if term else 1.0)
            Q[si + (a,)] += lm * (target - Q[si + (a,)])
            if use_video:                     # RLV-добавка: 4 псевдоперехода на шаг
                for k in rng.integers(len(pseudo), size=4):
                    ps, pa, pr, ps2, pterm = pseudo[k]
                    ptarget = pr + gamma * np.max(Q[ps2]) * (0.0 if pterm else 1.0)
                    Q[ps + (pa,)] += lm * (ptarget - Q[ps + (pa,)])
            si, total = s2i, total + r
            if term or trunc: break
        rews.append(total)
        epsilon = 0.0 if epsilon < eps2 else epsilon * decay
        if (ep + 1) % 2000 == 0:
            print(f"  {'RLV' if use_video else 'base'} эпизод {ep+1}: mean500 = {np.mean(rews[-500:]):.1f}", flush=True)
    return np.array(rews)

print("обучение БЕЗ видео:")
base = train(False)
print("обучение С видео (RLV-добавка):")
rlv = train(True)
np.save(r"C:\Users\Evgenie\AppData\Local\Temp\rlv_base.npy", base)
np.save(r"C:\Users\Evgenie\AppData\Local\Temp\rlv_video.npy", rlv)
np.save(r"C:\Users\Evgenie\AppData\Local\Temp\rlv_inverse_W.npy", np.concatenate([W, mu, sd]))
print("итог mean1000: base", np.mean(base[-1000:]).round(1), "| RLV", np.mean(rlv[-1000:]).round(1))

5. APV: предобучить модель мира

Второй путь отвечает на недостачу иначе. Действий в видео нет — но действия и не нужны, чтобы выучить из видео главное: как выглядит мир и как он меняется. Эта мысль приводит в model-based ветку карты методов из конспекта 1, до которой мы пока не добирались, — так что введём её минимум.

5.1. Модель мира в двух словах

Модель мира (англ. world model) — обучаемая замена среды: энкодер сжимает кадр в компактное латентное состояние \(z\) (знакомая по автоэнкодерам из «Нейросетей» идея), рекуррентная динамика предсказывает следующее латентное состояние, декодер при необходимости разворачивает его обратно в кадр. Обучается она предсказанием: минимизируется ошибка реконструкции наблюдений плюс KL-расхождение между «предсказанным заранее» распределением латента (prior — динамика без подглядывания) и «уточнённым по факту» (posterior — после просмотра кадра):

\[ L(\phi) = \mathbb{E} \Bigl[ \sum_t \underbrace{-\log p_\phi(o_t \,|\, z_t)}_{\text{реконструкция}} + \beta\, \underbrace{\mathrm{KL}\bigl( q_\phi(z_t | o_t, z_{t-1}) \,\|\, p_\phi(z_t | z_{t-1}) \bigr)}_{\text{динамика должна предсказывать}} \Bigr]. \tag{12.3}\]

Выучив такую модель, агент может воображать траектории в латентном пространстве и обучать актёра-критика на воображаемых, бесплатных переходах — так устроен Dreamer, на котором основан APV. Ключевое наблюдение авторов APV: в формуле (12.3) нет ни действий, ни наград — обычно динамика обусловлена действием \(p(z_t | z_{t-1}, a_{t-1})\), но можно обучать и безусловную версию. А значит, модель мира можно предобучать на чистом видео.

5.2. Предобучение и достройка

Схема APV: видео из разных доменов обучают безусловную видеомодель, затем она достраивается action-conditional моделью мира и обучением поведения
APV: предобучение видеомодели без действий → достройка action-conditional модели → обучение поведения. Из статьи Seo et al., 2022

Схема двухэтапная, как перенос обучения в «Нейросетях» (конспект 7 — предобученные свёрточные сети):

  1. Предобучение: безусловная латентная видеомодель — формула (12.3) дословно — обучается на видео из разных доменов (в статье: видео манипуляторов из RLBench для задач Meta-world, даже видео вождения помогают управлению роботом — модель выучивает универсальное «как меняются кадры»).
  2. Достройка: в целевой среде поверх предобученной безусловной динамики надстраивается вторая, обусловленная действиями рекуррентная модель (в коде — два RSSM в стеке: замороженно-медленный action-free и обучаемый action-conditional), добавляется голова награды — и дальше обычный Dreamer: воображение, актёр, критик.

И ещё одна изящная деталь: видеопамять используется для разведочного бонуса. Латентные представления окон видео складываются в очередь; за наблюдение, далёкое от всего виденного (большое расстояние до \(k\) ближайших соседей в этой очереди), агент получает добавку к награде:

\[ r^{\text{int}}_t \propto \bigl\| z_t - \text{kNN}_{\text{очередь}}(z_t) \bigr\|, \qquad r_t \leftarrow r_t + \beta\, r^{\text{int}}_t. \tag{12.4}\]

Это старый знакомый — оптимизм к неизведанному из конспекта 2, только «неизведанное» теперь измеряется относительно чужого видеоопыта: агент тянется туда, чего не видел даже в кино. По результатам статьи предобучение на видео почти удваивает эффективность Dreamer-агента на роботических задачах — при том, что видео были из других сред.

6. Два пути рядом

RLV (model-free)APV (model-based)
что берёт из видеоготовые переходы \((s, s')\) — превращает в опыт общее знание «как меняется мир» — превращает в представления
недостающие действиядостраивает обратной моделью (12.1) не нужны: динамика предобучается безусловной
недостающие наградыподменяет схемой (12.2) не нужны на предобучении; голова награды учится при достройке
чужой домендискриминатор + парные кадры терпим по построению: видеомодель учится на смеси доменов
куда идёт видеов replay buffer off-policy алгоритма (SAC) в веса модели мира (Dreamer) + разведочный бонус (12.4)
родня в траекторииDQN-память (к. 7), SAC ≈ актёр-критик + энтропия (к. 10–11), GAN («Нейросети», к. 11) автоэнкодеры («Нейросети», к. 9), перенос обучения (к. 7), новизна (к. 2)

Общий вывод пары статей повторяет интуицию, с которой конспект начинался: чужой опыт без действий и наград — не мусор, а полуфабрикат. Вопрос лишь в том, на каком уровне его встраивать: на уровне переходов (RLV) или на уровне понимания мира (APV). Современные системы — от роботов до игровых агентов — всё чаще выбирают второе и предобучаются на видео интернет-масштаба; аппарат, которым это делается, у вас теперь есть.

Контрольные вопросы

Источники

  1. Schmeckpeper, K. Reinforcement Learning with Videos: Combining Offline Observations with Interaction / K. Schmeckpeper, O. Rybkin, K. Daniilidis [et al.] // Conference on Robot Learning (CoRL). — 2020. — URL: https://arxiv.org/abs/2011.06507 (дата обращения: 09.07.2026).
  2. Seo, Y. Reinforcement Learning with Action-Free Pre-Training from Videos / Y. Seo, K. Lee, S. James, P. Abbeel // International Conference on Machine Learning (ICML). — 2022. — URL: https://arxiv.org/abs/2203.13880 (дата обращения: 09.07.2026).
  3. Hafner, D. Mastering Atari with Discrete World Models / D. Hafner, T. Lillicrap, M. Norouzi, J. Ba // arXiv. — 2020. — URL: https://arxiv.org/abs/2010.02193 (дата обращения: 09.07.2026).