Modern Robotics и Physical AIУрок 1.4 · Диффузионные модели
1.4 Часть 1 · Обучение по демонстрациям · основы

Диффузионные модели

Регрессия выдаёт среднее из показанных ответов. Когда правильных ответов два, среднее неправильно: робот едет между двумя объездами прямо в чайник. Нужна модель, которая выдаёт один из правильных ответов. В этом уроке разбираем такую модель — диффузионную. Она учится убирать шум из данных, а генерирует наоборот: начинает с чистого шума и шаг за шагом приближается к данным. Всё показываем на точках на плоскости: две спирали, шум, сеть-денойзер и обратный путь. Если диффузия знакома, урок можно пропустить.

≈ 45 минут1 лаборатория и 5 интерактивов14 миссий с целью
ШУМНарисуй, как тает сигнал по шагам, и сравни с настоящей кривой
ДЕНОЙЗЕРПеремотай генерацию и найди, когда точки тянутся к центру, а когда выбирают виток
ЛАБОРАТОРИЯОбучи сеть в браузере, получи спирали из шума и сравни DDPM и DDIM на одной сети
GUIDANCEПострой кривую «точность — разнообразие» и подбери вес guidance
ПАМЯТЬНайди, когда маленькая сеть начинает копировать обучающие точки

Начать урок ↓

1 Генератор

Генератор вместо одного ответа

Политика, обученная по среднеквадратичной ошибке, выдаёт среднее из показанных действий. Если оператор объезжал чайник то слева, то справа, среднее из двух объездов ведёт прямо в чайник. Так устроена сама ошибка: её минимум — среднее всех правильных ответов, и больше данных этого не меняет.

В уроке 1.3 мы обходили среднее двумя способами. Смесь гауссиан выбирает один из нескольких вариантов, но их число нужно знать заранее, и каждый вариант — простое пятно. Бины делят каждую координату на интервалы, но независимые бины теряют связь между координатами, а общих бинов для многих координат нужно слишком много.

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

Разберём генератор на самых простых данных — точках на плоскости. Они лежат на двух спиралях, по 1000 точек на каждой. Спирали играют роль двух объездов: хороший генератор кладёт точки на спирали, на обе поровну, и не кладёт между витками. Опорные работы урока — DDPM (Ho, Jain, Abbeel, 2020) и DDIM (Song, Meng, Ermon, 2021).

Случайный шум получить легко: это стандартная функция любой библиотеки. Как превратить шум в точку на спирали?

2 Прямой процесс

Путь от данных к шуму

Превратить шум в точку на спирали за один шаг трудно: сеть, которую учат такому превращению по среднеквадратичной ошибке, снова выдаёт среднее. В лаборатории это будет видно на опыте.

Поэтому идут маленькими шагами и начинают с обратного направления, от данных к шуму. Оно простое: на каждом шаге точка немного сжимается к центру, и к ней добавляется немного гауссова шума. За T=1000T = 1000 шагов от спиралей остаётся гауссово облако. Этот путь фиксирован, учить его не нужно. Сколько шума добавить на шаге tt, задаёт расписание. В DDPM оно линейное: доля шума растёт от 0,0001 на первом шаге до 0,02 на последнем.

За ходом процесса удобно следить по одному числу — αˉt\bar\alpha_t, доле сигнала, которая осталась от исходной точки к шагу tt. В начале αˉ=1\bar\alpha = 1, точка чистая; к концу αˉ\bar\alpha почти ноль. Любую точку можно зашумить сразу до любого шага, не проходя промежуточные.

Сначала нарисуй, как, по-твоему, падает αˉt\bar\alpha_t на линейном расписании, а облако слева подскажет, сколько сигнала осталось на шаге tt. Потом сравни прогноз с настоящей кривой и с косинусным расписанием из Improved DDPM (Nichol, Dhariwal, 2021).

Под капотом: прямой процесс и два расписания

Шаг прямого процесса в нотации DDPM:

q(xt∣xt−1)=N(1−βt xt−1, βtI),αt=1−βt,αˉt=α1⋯αt,xt=αˉt x0+1−αˉt ε,ε∼N(0,I).\begin{aligned} q(x_t \mid x_{t-1}) &= \mathcal{N}\bigl(\sqrt{1 - \beta_t}\,x_{t-1},\ \beta_t I\bigr),\\ \alpha_t &= 1 - \beta_t, \quad \bar\alpha_t = \alpha_1 \cdots \alpha_t,\\ x_t &= \sqrt{\bar\alpha_t}\,x_0 + \sqrt{1 - \bar\alpha_t}\,\varepsilon,\\ \varepsilon &\sim \mathcal{N}(0, I). \end{aligned}

Последняя строка и позволяет зашумить точку сразу до шага tt. Линейное расписание DDPM: β\beta растёт от 10−410^{-4} до 0,02 за T=1000T = 1000 шагов. Отсюда αˉ500≈0,08\bar\alpha_{500} \approx 0{,}08 и αˉT≈4⋅10−5\bar\alpha_T \approx 4 \cdot 10^{-5} — это наш расчёт по формулам статьи. Сами авторы DDPM оценивают, что xTx_T отличается от гауссова шума на KL≈10−5\mathrm{KL} \approx 10^{-5} бит на измерение.

Косинусное расписание из Improved DDPM задают сразу через αˉ\bar\alpha:

αˉt=f(t)f(0),s=0,008,f(t)=cos⁡2(t/T+s1+s⋅π2).\begin{gathered} \bar\alpha_t = \frac{f(t)}{f(0)}, \qquad s = 0{,}008,\\ f(t) = \cos^2\Bigl(\frac{t/T + s}{1 + s}\cdot\frac{\pi}{2}\Bigr). \end{gathered}

Отсюда βt=1−αˉt/αˉt−1\beta_t = 1 - \bar\alpha_t / \bar\alpha_{t-1}, сверху её ограничивают значением 0,999. У этого расписания αˉ500≈0,49\bar\alpha_{500} \approx 0{,}49.

Как считается ошибка прогноза. Прогноз хранится в 41 точке, через каждые 25 шагов. Ошибка — среднее расстояние по вертикали между прогнозом и настоящей кривой линейного расписания в этих точках.

Итак, линейное расписание теряет сигнал быстро: к середине пути его остаётся меньше десятой, а последнюю треть пути точки почти неотличимы от шума. Путь от данных к шуму мы знаем точно. Как пройти его обратно, от шума к спиралям?

3 Денойзер

Куда сдвигать точку на обратном пути

Чтобы пройти путь обратно, на каждом шаге нужно знать, куда сдвинуть зашумлённую точку, чтобы она стала больше похожа на данные. Это трудно: зашумлённая точка могла прийти из многих мест, и чем сильнее шум, тем больше вариантов. Если на каждом шаге двигать её к среднему всех вариантов, она придёт в центр, между спиралями. Это та же ошибка, что у регрессии.

Выход — на каждом шаге спрашивать денойзер: он оценивает, откуда пришла зашумлённая точка. Если знать все обучающие точки, лучшая оценка — их среднее с весами. Чем ближе обучающая точка, тем больше её вес, а насколько быстро вес падает с расстоянием, зависит от уровня шума. Стрелка от точки к оценке показывает направление к данным. Поле таких стрелок называют score; в статье EDM (Karras et al., 2022) это «a vector field that points towards higher density of data at a given noise level».

На сцене генерация, которую ведёт идеальный денойзер: он знает все 2000 точек, сети здесь нет. Перематывай генерацию по шагам. Оранжевые точки — 300 сэмплов на этом шаге, стрелки показывают, куда денойзер тянет точки сцены. Пробную точку можно перетаскивать: крестик — её оценка, подсвечены обучающие точки, которые денойзер усредняет.

Под капотом: идеальный денойзер и score

В нотации EDM точку зашумляют так: x=y+nx = y + n, n∼N(0,σ2I)n \sim \mathcal{N}(0, \sigma^2 I). Для конечной выборки y1,…,yNy_1, \ldots, y_N оптимальный денойзер и score выражаются в замкнутой форме:

D(x;σ)=∑iN(x; yi,σ2I) yi∑iN(x; yi,σ2I),∇xlog⁡p(x;σ)=D(x;σ)−xσ2.\begin{aligned} D(x; \sigma) &= \frac{\sum_i \mathcal{N}(x;\, y_i, \sigma^2 I)\, y_i}{\sum_i \mathcal{N}(x;\, y_i, \sigma^2 I)},\\ \nabla_x \log p(x; \sigma) &= \frac{D(x; \sigma) - x}{\sigma^2}. \end{aligned}

Шаг DDPM tt соответствует уровню шума σ=(1−αˉt)/αˉt\sigma = \sqrt{(1 - \bar\alpha_t)/\bar\alpha_t}, если поделить xtx_t на αˉt\sqrt{\bar\alpha_t}. В конце пути σ=0,01\sigma = 0{,}01, в начале — около 160. Score в нотации DDPM связан с предсказанным шумом:

∇xtlog⁡qt(xt)≈−εθ(xt,t)1−αˉt.\nabla_{x_t} \log q_t(x_t) \approx -\frac{\varepsilon_\theta(x_t, t)}{\sqrt{1 - \bar\alpha_t}}.

Значит, сеть, которая предсказывает шум, заодно знает направление к данным. Score — градиент по входу xx, а не по параметрам сети.

Выход D(x;σ)D(x; \sigma) — взвешенное среднее обучающих точек, поэтому такой денойзер может только воспроизводить данные (EDM, приложение B.3, ур. 57; Gu et al.). К этому вернёмся в разделе про память.

Как устроена сцена. Генерация — DDIM на 50 шагах, 300 точек из одного и того же шума, моменты шагов ti=round⁡(1000 (i/50)2)t_i = \operatorname{round}\bigl(1000\,(i/50)^2\bigr). Стрелки стоят в узлах сетки 15 × 15 с шагом 0,3 и показывают направление от узла к оценке денойзера на текущем шаге. Стрелка смотрит в среднее, если отклоняется от направления на центр масс данных меньше чем на 15°; узлы ближе 0,3 к центру не считаем. Стрелка ведёт к ближайшей спирали, если отклоняется от направления на ближайшую точку данных меньше чем на 30°; считаем узлы внутри круга радиусом 1,75, где лежат спирали, и не ближе 0,08 к данным.

Выходит, в начале генерации денойзер тянет все точки к центру, в конце — к ближайшему витку, а между этими этапами точка выбирает спираль. Но идеальный денойзер хранит все 2000 точек и на каждом шаге перебирает их все. Можно ли получить те же стрелки от сети, которая данных не хранит?

🔬 Лаборатория

Диффузия на двух спиралях

Можно: денойзер заменяют сетью, которая учится по примерам и данных не хранит. Для картинок и действий робота иначе нельзя: примеров миллионы, перебирать их на каждом шаге слишком долго. Обучение идёт в твоём браузере и занимает секунды.

Сеть учится так: берём точку спирали, случайный шаг tt и случайный шум, зашумляем точку сразу до шага tt и просим сеть угадать добавленный шум. Ошибка — средний квадрат разницы между настоящим и предсказанным шумом. В статье DDPM её называют LsimpleL_{\text{simple}}. Предсказывать шум удобно: он всегда одного масштаба, а по шуму легко вычислить оценку чистой точки, то есть ту же стрелку, что в разделе 3.

Генерация идёт в обратную сторону: берём точку гауссова облака и идём от t=1000t = 1000 к нулю. На каждом шаге сеть предсказывает шум, мы убираем его часть, и точка становится на шаг ближе к данным. DDPM на каждом шаге добавляет ещё и немного свежего шума, поэтому путь случайный. DDIM берёт ту же обученную сеть, но шагает без свежего шума, и путь от старта до финиша детерминирован.

В лаборатории ты обучишь сеть и сравнишь её с регрессией «шум → точка». Найдёшь, сколько шагов нужно DDPM и DDIM, и границу, за которой соседние стартовые точки уходят на разные спирали.

DDPMсеть учится
Под капотом: сеть и обучение
Lsimple=E ∥ε−εθ(xt,t)∥2,xt=αˉt x0+1−αˉt ε.\begin{gathered} L_{\text{simple}} = \E\,\bigl\lVert \varepsilon - \varepsilon_\theta(x_t, t)\bigr\rVert^2,\\ x_t = \sqrt{\bar\alpha_t}\,x_0 + \sqrt{1 - \bar\alpha_t}\,\varepsilon. \end{gathered}
  • Вход. Координаты точки, 16 пар синусов и косинусов от случайных проекций координат (признаки Фурье: с ними сеть быстрее схватывает мелкие детали) и вложение номера шага: t/Tt/T и синусы-косинусы tt на пяти частотах. Всего 45 чисел.
  • Сеть. Два скрытых слоя по 64 нейрона с активацией SiLU, на выходе два числа — предсказанный шум. Около 7300 параметров. Для сравнения, у DDPM для CIFAR-10 их 35,7 млн.
  • Обучение. Adam, пакет 125 примеров, эпоха — проход по 2000 точкам, то есть 16 шагов. Шаг обучения 3⋅10−33 \cdot 10^{-3}, после 200 эпох 10−310^{-3}, после 400 — 5⋅10−45 \cdot 10^{-4}.
  • Отступление от DDPM. В DDPM номер шага tt при обучении равномерный. Мы берём tt чаще маленьким: t=1+⌊Tu2⌋t = 1 + \lfloor T u^2 \rfloor, где uu равномерно от 0 до 1. Тонкая структура спиралей видна только при малом шуме, и так сеть учится в несколько раз быстрее.
  • Кривая ошибки. Это LsimpleL_{\text{simple}} на фиксированном наборе из 4000 троек (x0,t,ε)(x_0, t, \varepsilon) с равномерным tt, как в статье. Мы усредняем ошибку по двум координатам.
  • Регрессия «шум → точка». Та же сеть без номера шага. 400 шагов Adam по MSE: на входе случайный шум, на выходе случайная точка данных.
Под капотом: шаги DDPM и DDIM

Шаг DDPM, z∼N(0,I)z \sim \mathcal{N}(0, I):

xt−1=1αt(xt−βt1−αˉt εθ(xt,t))+σtz.x_{t-1} = \frac{1}{\sqrt{\alpha_t}}\Bigl(x_t - \frac{\beta_t}{\sqrt{1 - \bar\alpha_t}}\,\varepsilon_\theta(x_t, t)\Bigr) + \sigma_t z.

Шаг DDIM с момента tt на более ранний момент t′t':

x^0=xt−1−αˉt εθαˉt,xt′=αˉt′ x^0+1−αˉt′−σ2 εθ+σε,σ=η 1−αˉt′1−αˉt 1−αˉtαˉt′.\begin{aligned} \hat x_0 &= \frac{x_t - \sqrt{1 - \bar\alpha_t}\,\varepsilon_\theta}{\sqrt{\bar\alpha_t}},\\ x_{t'} &= \sqrt{\bar\alpha_{t'}}\,\hat x_0 + \sqrt{1 - \bar\alpha_{t'} - \sigma^2}\,\varepsilon_\theta + \sigma\varepsilon,\\ \sigma &= \eta\,\sqrt{\frac{1 - \bar\alpha_{t'}}{1 - \bar\alpha_t}}\,\sqrt{1 - \frac{\bar\alpha_t}{\bar\alpha_{t'}}}. \end{aligned}

При η=0\eta = 0 шаг детерминирован, при η=1\eta = 1 сэмплер совпадает с DDPM. Осторожно с нотацией: в статье DDIM буквой α\alpha обозначено то, что в DDPM называется αˉ\bar\alpha.

Как устроены сэмплеры в лаборатории. Оба — одна формула DDIM, DDPM получается при η=1\eta = 1. Сеть всегда одна и та же, обученная на всех 1000 шагах. Если шагов генерации SS меньше 1000, берём моменты ti=round⁡(T (i/S)2)t_i = \operatorname{round}\bigl(T\,(i/S)^2\bigr): у конца пути, где шум мал, шаги чаще. Последний шаг всегда выдаёт оценку x^0\hat x_0 без шума. Оценку x^0\hat x_0 держим в квадрате от −2,2 до 2,2, как картинкам ограничивают пиксели.

Под капотом: как считаются критерии
  • Точка на спирали, если ближайшая из 2000 обучающих точек ближе 0,1. Её спираль и считается спиралью точки. Ширина спиралей в данных — шум со стандартным отклонением 0,05, расстояние между соседними витками около 0,27.
  • За окружностью. Пунктирная окружность радиусом 1,14 делит данные пополам: за ней лежит ровно половина обучающих точек. Если сэмплер стягивает облако к центру, за окружностью точек становится меньше.
  • Форма держится, если на спиралях не меньше 80% точек, а за окружностью — не меньше 25%.
  • Генерация. 1000 точек из одного и того же стартового шума; у DDIM рядом — тот же шум. Траектории рисуем для 40 точек. В миссии про бассейны — DDIM на 20 шагах.
  • Карта бассейнов. Из узлов сетки 41 × 41 запускаем DDIM на 20 шагах и красим узел по спирали, на которую пришёл финиш. Узлы, финиш которых не попал на спираль, не красим.

Итак, сеть заменила идеальный денойзер, и генерация кладёт точки на спирали, причём старт решает, на какую. DDIM на той же сети держит форму на 6–8 шагах, где DDPM уже стягивает облако к центру. Роботу же ответ нужен за десятки миллисекунд. Сколько шагов делают настоящие роботы и чем сокращают их число?

4 Шаги у роботов

Сколько шагов делают роботы

Каждый шаг генерации — полный проход сети. DDPM делает 1000 шагов: модели для CIFAR-10 нужно 17 секунд на пакет из 256 картинок, а роботу ответ нужен за десятки миллисекунд.

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

Поэтому шагают так, чтобы уже предсказанное не терялось: DDIM на той же сети, решатели вроде DPM-Solver, дистилляция в 1–3 шага или flow matching с прямыми путями. Вот сколько шагов делают модели роботов:

МодельМетодШагов при выводе
Diffusion Policy, реальные роботыDDIM, обучение на 100 шагах10; 0,1 с на RTX 3080
UMI, 2024DDIM16
Consistency Policy, 2024дистилляция1 или 3; 21 мс против 192 мс у DDIM на 15 шагах
Octo, 2024DDPM20
RDT-1B, 2025DPM-Solver++5 вместо 100
π0, 2025flow matching10; 73 мс на RTX 4090
GR00T N1, 2025flow matching4; 63,9 мс на L40
π0.7, 2026flow matching5

Осторожно: в конфигах репозитория Diffusion Policy по умолчанию стоит 100 шагов, а не 10. Для картинок порядок такой же. На CIFAR-10 DDIM за 50 шагов даёт FID 4,67 против 4,04 за 1000, DPM-Solver — 4,70 за 10 вызовов сети, EDM с условием на класс — 1,79 за 35, consistency models — 3,55 за один шаг. Чем меньше FID, тем ближе картинки к настоящим.

Flow matching при гауссовом шуме на входе эквивалентен диффузии: сэмплер DDIM совпадает с методом Эйлера для flow matching. А rectified flow учит прямые пути от шума к данным, и шагов нужно ещё меньше. Это урок 1.8.

Под капотом: мост к flow matching

Во всём курсе для flow matching время идёт от шума к данным: t=0t = 0 — шум x0x_0, t=1t = 1 — данные x1x_1, как в статье π0. Точку на пути и цель обучения записывают так:

xt=(1−t) x0+t x1,L=E ∥vθ(xt,t)−(x1−x0)∥2.\begin{aligned} x_t &= (1 - t)\,x_0 + t\,x_1,\\ L &= \E\,\bigl\lVert v_\theta(x_t, t) - (x_1 - x_0)\bigr\rVert^2. \end{aligned}

Сеть учит скорость vθv_\theta, а генерация — это движение по ней от t=0t = 0 к t=1t = 1. Обрати внимание: в DDPM время направлено наоборот, t=0t = 0 — данные, t=Tt = T — шум. В коде openpi шум тоже стоит при t=1t = 1: x_t = t * noise + (1 - t) * actions, и интегрируют с шагом dt = -1/10. Подробно — в уроке 1.8.

Генератор стал быстрым, но пока выдаёт любую правдоподобную точку. Роботу же нужно действие для конкретной ситуации. Как заставить генератор выдать то, что заказали?

5 Условие и guidance

Генерация по заказу

Генератор выдаёт любую точку данных, а роботу нужна не любая: действие должно подходить к тому, что видит камера. В нашем примере заказ — номер спирали: «дай точку на спирали 1».

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

Усилить условие без отдельного классификатора позволяет classifier-free guidance (Ho, Salimans, 2022). Одну сеть учат сразу двум задачам: при обучении условие иногда выбрасывают, с вероятностью 0,1–0,2, и сеть умеет предсказывать шум и с условием, и без. При генерации берут оба предсказания и сдвигают ответ дальше от безусловного. Насколько дальше, задаёт вес ww.

Сеть для опыта такая же, как в лаборатории, плюс вход «номер спирали». Её обучение начнётся, когда раздел появится на экране, и займёт несколько секунд. Каждая генерация ставит точку на график: по вертикали точность — доля точек на заказанной спирали, по горизонтали покрытие — доля точек этой спирали, рядом с которыми оказалась хоть одна сгенерированная.

Под капотом: classifier-free guidance
ε~=(1+w) εθ(xt,c)−w εθ(xt,∅)\tilde\varepsilon = (1 + w)\,\varepsilon_\theta(x_t, c) - w\,\varepsilon_\theta(x_t, \varnothing)

Здесь cc — условие, ∅\varnothing — пустое условие. При w=0w = 0 это обычная условная модель. В статьях вес записывают по-разному: если формулу пишут как ε(∅)+s (ε(c)−ε(∅))\varepsilon(\varnothing) + s\,\bigl(\varepsilon(c) - \varepsilon(\varnothing)\bigr), то s=1+ws = 1 + w.

В опыте: та же сеть, что в лаборатории, плюс два входа «номер спирали»; если условие выброшено, оба равны нулю. Вероятность выбросить условие 0,2 — у Ho и Salimans значения 0,1 и 0,2 работают одинаково. 3000 шагов Adam. Генерация — DDIM на 20 шагах, 500 точек из одного и того же шума. Точность — доля сгенерированных точек, у которых ближайшая обучающая точка ближе 0,1 и лежит на заказанной спирали. Покрытие — доля точек заказанной спирали, рядом с которыми, ближе 0,1, есть сгенерированная точка.

Real-Time Chunking тоже использует guidance, но другой: на каждом шаге добавляет к полю скоростей градиентный член, чтобы новый чанк согласовывался с уже исполняемым.

Получается, что guidance делает генерацию точнее, но беднее, и при большом весе точки сбиваются в немногие места спирали. Крайний случай бедности — модель, которая только повторяет обучающие примеры. Бывает ли так с диффузией?

6 Углубление

Память или обобщение

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

Почему так бывает? Идеальный денойзер из раздела 3 оценивает чистую точку как взвешенное среднее обучающих точек. Если пройти с ним генерацию до конца, каждая точка придёт ровно в одну из обучающих. А сеть мы учим приближать именно его.

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

Слева от шторки идеальный денойзер, справа маленькая сеть, обе на одних и тех же NN точках со спиралей. Копией считаем сэмпл, который ближе 0,02 к одной из обучающих точек. Двигай шторку, меняй N и шаг обучения.

Под капотом: как считается доля копий

Сеть та же, что в лаборатории, учится 8000 шагов на пакетах по 64 примера. Каждые 1000 шагов генерируем 300 точек DDIM на 50 шагах из одного и того же шума и считаем, какая доля из них ближе 0,02 к обучающей точке. Идеальный денойзер генерирует тем же сэмплером. Если взять свежие точки со спиралей, а не сэмплы, «копиями» случайно оказалось бы меньше 6% даже при N=128N = 128: так мы проверили, что порог 0,02 не путает новые точки с копиями.

Для больших моделей известно следующее. Carlini et al. нашли 109 копий обучающих картинок среди 175 млн генераций Stable Diffusion, а из моделей на CIFAR-10 извлекли 1280 картинок — 2,5% датасета. Главный фактор — дубликаты в данных, и диффузия запоминает больше, чем GAN. Kadkhodaie et al. показали, что при N≈105N \approx 10^5 две сети, обученные на непересекающихся данных, генерируют почти одинаковые картинки. Bonnaire et al.: время до обобщения не зависит от размера выборки, а время до запоминания растёт с ней линейно, поэтому остаётся окно для ранней остановки.

Итак, идеальный денойзер только копирует, а сеть копирует на малых данных и при долгом обучении. Для робота это значит, что на десятке демонстраций диффузионная политика может повторять записанные движения вместо того, чтобы обобщать. Какие ещё заблуждения о диффузии встречаются чаще всего?

7 Проверь себя

Восемь частых заблуждений

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

8 Итог

Итоги урока

  1. Прямой процесс фиксирован: шум добавляют по расписанию. К концу линейного расписания от сигнала остаётся αˉT≈4⋅10−5\bar\alpha_T \approx 4 \cdot 10^{-5}, а последнюю треть пути точки почти неотличимы от шума.
  2. Сеть учится предсказывать добавленный шум. Ошибка выходит на плато выше нуля: часть шума угадать нельзя в принципе.
  3. Денойзер указывает к данным: при сильном шуме — к среднему, при слабом — к ближайшей спирали. Поэтому сэмпл приходит в одну из мод, а не в их среднее.
  4. DDIM — та же сеть с детерминированными шагами. Поэтому у роботов 4–16 шагов вывода, а не 1000.
  5. Classifier-free guidance — одна сеть, условие при обучении иногда выбрасывают. Сильный guidance меняет разнообразие на точность.
  6. Идеальный денойзер только копирует. Сеть на малых данных и при долгом обучении начинает копировать обучающие примеры.

Осталась одна проблема. Мы генерировали отдельные точки на плоскости, и условием был номер спирали. Роботу нужно другое: пачка действий на несколько шагов вперёд, согласованная во времени, а условие — картинка с камеры. Если генерировать каждое действие отдельно, соседние действия могут выбрать разные объезды. Как превратить диффузию в политику, которая выбирает один объезд и держится его, разберём в уроке 1.5.

Открытые вопросы

Почему диффузионная политика на десятке демонстраций может вести себя как таблица поиска и чем это плохо для робота?

На малых данных денойзер близок к идеальному: оценка чистого действия — взвешенное среднее обучающих примеров, и генерация приходит в одну из записанных траекторий. В препринте 2505.05787 Diffusion Policy на малых датасетах выдавала траекторию из обучения даже на фото кошки, а простая таблица поиска работала не хуже при 0,0034 времени вывода. Для робота это значит, что новых движений он не придумает: в незнакомой сцене он повторит ближайшую демонстрацию, даже если она там не подходит.

Робот должен реагировать за 20 мс. Какие способы сократить число шагов ты знаешь и чем каждый платит?

DDIM и решатели вроде DPM-Solver берут ту же сеть с меньшим числом шагов, но на очень малом числе шагов теряют качество, как в лаборатории. Дистилляция и consistency-модели сводят вывод к 1–3 шагам (Consistency Policy — 21 мс против 192 мс у DDIM на 15 шагах), но нужна отдельная дорогая стадия обучения. Flow matching с прямыми путями даёт 4–10 шагов (урок 1.8). Можно не ждать вывода: исполнять пачку действий и считать следующую асинхронно, как Real-Time Chunking. Одношаговые головы быстрее всего, но заметно теряют в успешности: в техотчёте одного автора drifting-голова для GR00T ускорила голову с 45 до 5 мс ценой падения успешности.

Гид по статье

J. Ho, A. Jain, P. Abbeel, «Denoising Diffusion Probabilistic Models», NeurIPS 2020.

Материалы

➡️

Дальше: Diffusion Policy. Заменим точки на пачку действий, а условием сделаем наблюдение камеры. Тогда начальный шум выберет, объедет робот чайник слева или справа, а денойзинг доведёт объезд до конца — урок 1.5 «Diffusion Policy».

Урок пригодился? Скажи спасибо — так автор узнает, что курс читают.