Обучение по видео: 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')\) без середины:
- нет действий — камера не видит, какие моменты сил приложены, какие кнопки нажаты; а без \(a\) переход нельзя даже положить в память DQN;
- нет наград — видео не размечено числами \(r\); в лучшем случае известно, что демонстрация закончилась успехом;
- чужой домен — на видео задачу может решать человеческая рука на другой кухне при другом свете; наблюдения агента выглядят иначе, хотя суть задачи та же.
Заметьте: это ровно те три компонента, которых не хватало и в наших средах, пока мы их не построили в конспекте 6, — только теперь их не выдаёт даже среда. Два подхода ниже отвечают на недостачу противоположно: RLV достраивает недостающее и продолжает жить в мире model-free переходов; APV меняет постановку — учит на видео то, чему действия не нужны: как устроен мир.
2. RLV: достроить действия и награды
Метод RLV (Reinforcement Learning with Videos) держит два хранилища опыта: обычную память переходов агента (с действиями и наградами — как в DQN) и видеопул из пар \((s, s')\). Задача — сделать видеопул полноценным. Первая недостача лечится красиво.
2.1. Обратная модель динамики
Агент, взаимодействуя со средой, и так накапливает тройки \((s, a, s')\). На них можно обучить с учителем обратную модель динамики (англ. inverse dynamics model) — сеть, угадывающую действие по паре соседних наблюдений:
Это «задача-перевёртыш» к модели среды: не «что будет, если сделать \(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 подменяет их бинарной схемой: финальный кадр успешной демонстрации получает большую положительную награду, все остальные — маленький штраф за шаг:
Выглядит грубо — на деле это единственная информация, которая в видео есть: «показанное ведёт к успеху, и чем короче, тем лучше». Мы убедились в необходимости этой схемы на собственных граблях (раздел 4): попытка оставить видеопереходам «честные» награды среды делает видео вредным.
2.3. Доменный сдвиг: дискриминатор
Если видео из чужого домена (человеческая рука), наблюдения агента и кадры видео нельзя подавать в одну сеть как есть. RLV выравнивает их представления состязательно — знакомым по «Нейросетям» (конспект 11) приёмом GAN: дискриминатор учится по внутреннему представлению кадра угадывать, из какого он домена, а энкодер наблюдений — представлять кадры так, чтобы дискриминатор ошибался. Дополнительно, если есть немного «парных» кадров (один момент задачи, снятый в обоих доменах), их представления притягиваются друг к другу напрямую (MSE). В итоге видеопул стал неотличим от собственного опыта: каждая видеопара несёт \((s, \hat a, \hat r, s')\) — и просто подмешивается в батчи off-policy алгоритма (в статье — SAC, актёр-критик с энтропийным бонусом из конспекта 11, живущий на памяти переходов как DQN). Никаких изменений в самом алгоритме: половина батча из жизни, половина из кино.
3. Тренажёр: сыграйте в обратную модель
Почувствуйте задачу обратной модели руками. Ниже пары соседних состояний машинки из конспекта 7 — «два кадра видео» (позиция и скорость показаны стрелкой). Угадайте, какое действие было между ними: толкали влево или вправо? Против вас играет обратная модель — логистическая регрессия, обученная по формуле (12.1) на 10 000 переходов случайной политики; её веса экспортированы прямо в страницу.
После десятка пар станет видно, где задача лёгкая, а где нет. Лёгкие пары — где скорость заметно изменилась: прирост больше «гравитации склона» выдаёт толчок вправо. Трудные — на крутом склоне и в областях, где модель мало училась: наша логрегрессия видела в основном ложбину (данные — случайная политика) и на правом склоне заметно плавает — в разделе 4 это же аукнется на разметке видео эксперта. Большую часть работы всё равно делает физика: действие почти читается из разности скоростей — потому обратная модель в RLV и остаётся маленькой сетью, а не наукой.
4. Мини-RLV на машинке: воспроизводим идею в 100 строк
Проверим конструкцию RLV в самом прозрачном исполнении — на табличном Q-обучении машинки из конспекта 7. «Видео» нам сыграет обученный там же эксперт: 200 эпизодов его езды, из которых мы сохраняем только наблюдения — пары \((s, s')\) и флаг терминальности, никаких действий и наград:
Дальше по рецепту RLV: обратная модель (логистическая регрессия по паре состояний) обучается на 10 000 переходов случайной политики и размечает 22 104 видеоперехода эксперта. Честная точность разметки — мы можем её измерить, потому что настоящие действия эксперта втайне записали, — 94,6%, и её география поучительна: 97% в ложбине, где случайная политика бывала, но лишь 88% в правой части склона (x > −0,2), куда случайные раскачки не забираются, — доменный сдвиг из раздела 2.3 в миниатюре: модель хуже всего там, где её не учили, а эксперт как раз ездит. Видеопул размечен; на каждый настоящий шаг среды — четыре обновления Q из видео.
Результат стоил трёх запусков, и каждая неудача поучительнее успеха. Запуск первый: видеопереходам оставили «честные» награды среды (−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 — после просмотра кадра):
Выучив такую модель, агент может воображать траектории в латентном пространстве и обучать актёра-критика на воображаемых, бесплатных переходах — так устроен Dreamer, на котором основан APV. Ключевое наблюдение авторов APV: в формуле (12.3) нет ни действий, ни наград — обычно динамика обусловлена действием \(p(z_t | z_{t-1}, a_{t-1})\), но можно обучать и безусловную версию. А значит, модель мира можно предобучать на чистом видео.
5.2. Предобучение и достройка
Схема двухэтапная, как перенос обучения в «Нейросетях» (конспект 7 — предобученные свёрточные сети):
- Предобучение: безусловная латентная видеомодель — формула (12.3) дословно — обучается на видео из разных доменов (в статье: видео манипуляторов из RLBench для задач Meta-world, даже видео вождения помогают управлению роботом — модель выучивает универсальное «как меняются кадры»).
- Достройка: в целевой среде поверх предобученной безусловной динамики надстраивается вторая, обусловленная действиями рекуррентная модель (в коде — два RSSM в стеке: замороженно-медленный action-free и обучаемый action-conditional), добавляется голова награды — и дальше обычный Dreamer: воображение, актёр, критик.
И ещё одна изящная деталь: видеопамять используется для разведочного бонуса. Латентные представления окон видео складываются в очередь; за наблюдение, далёкое от всего виденного (большое расстояние до \(k\) ближайших соседей в этой очереди), агент получает добавку к награде:
Это старый знакомый — оптимизм к неизведанному из конспекта 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). Современные системы — от роботов до игровых агентов — всё чаще выбирают второе и предобучаются на видео интернет-масштаба; аппарат, которым это делается, у вас теперь есть.
Контрольные вопросы
-
Действий, наград и (часто) своего домена наблюдений. Весь аппарат построен на переходах (s, a, r, s′): без a переход нельзя положить в память DQN или посчитать Q(s,a); без r нечего максимизировать; чужой домен ломает энкодер наблюдений.
-
Сеть â = f(s, s′), угадывающая действие по паре соседних наблюдений (12.1). Обучается с учителем ТОЛЬКО на переходах самого агента, где действие известно; применяется к видеопарам, где его нет. Задача обычно проще прямой модели: действие почти однозначно читается из разности состояний.
-
При инициализации Q нулём все непосещённые действия выглядят лучше (Q=0), чем размеченный видеокоридор, который лишние обновления с r=−1 прижимают вниз, — видео делает путь эксперта менее привлекательным. Схема RLV (12.2) даёт терминалу успеха большой плюс (+10), превращая коридор эксперта в маяк, к которому ценности тянутся.
-
Состязательно, как GAN: дискриминатор учится угадывать домен по внутреннему представлению кадра, энкодер — делать представления неразличимыми; плюс, если есть парные кадры одного момента из двух доменов, их представления стягиваются MSE напрямую.
-
Безусловную латентную видеомодель: энкодер, рекуррентную динамику латента и декодер, обучаемые реконструкцией + KL между prior и posterior (12.3). В этой потере действия и награды не участвуют — модель учится только тому, «как меняются кадры», а это видео содержит целиком.
-
Поверх action-free динамики надстраивается вторая рекуррентная модель, обусловленная действиями (два RSSM в стеке), и голова награды; дальше — обычный Dreamer: воображаемые латентные траектории обучают актёра и критика. Это перенос обучения в духе предобученных CNN из «Нейросетей».
-
Латентные окна видео лежат в очереди; внутренняя награда пропорциональна расстоянию наблюдения до k ближайших соседей в ней (12.4) — бонус за состояния, не похожие даже на чужой видеоопыт. Это оптимизм к неизведанному из конспекта 2 с «неизведанностью относительно кино».
-
В RLV — в данные: каждая видеопара достраивается до (s, â, r̂, s′) и подмешивается в replay buffer off-policy алгоритма. В APV — в веса: видео формирует представления и динамику модели мира до всякого взаимодействия, плюс питает kNN-бонус разведки. Уровень переходов против уровня понимания мира.
Источники
- 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).
- 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).
- 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).