Вопросы для собеседования, набор 6: DDPM и DDIM
Попробуйте почувствовать разницу между DDPM и DDIM. Готовы? Начнём!
Шаг 1: вспомогательная база (приём репараметризации)
В диффузионных моделях чаще всего используется такой приём: если у вас есть величина, распределённая по нормальному закону (среднее , дисперсия ), её можно записать так:
Здесь — чистый стандартный нормальный шум .
Проще говоря: любое состояние = определённая базовая величина + (случайный шум сила шума). Запомните эту формулу: она лежит в основе всего вывода.
Шаг 2: базовая постановка DDPM (прямой процесс зашумления)
В исходном DDPM (денойзинговой диффузионной вероятностной модели) есть чёткий прямой процесс зашумления.
Пусть у нас есть чистое изображение (или идеальное действие робота) . Мы постепенно добавляем к нему шум, и на шаге оно превращается в .
DDPM доказала очень важный результат: не нужно добавлять шум шаг за шагом, можно перейти от сразу к .
Формула такая:
- : исходные чистые данные.
- : зашумлённые данные на шаге .
- : коэффициент от 0 до 1. Его можно понимать как «долю сохранённого сигнала». С ростом значение уменьшается и стремится к 0.
- : «сила шума».
- : чистый стандартный нормальный шум.
Итог в одной фразе: данные на шаге — это «ослабленные чистые данные» плюс «постепенно усиливающийся шум».
Шаг 3: обратное рассуждение — как по угадать ?
Теперь переходим к той части, где работает большая модель: обратному денойзингу.
Большая модель (например, нейросеть U-Net) при инференсе получает зашумлённое . Её задача — предсказать шум , который содержится в этих данных.
Пусть мы обучили модель , которая точно угадывает шум в текущем .
Раз шум угадан, можно воспользоваться формулой из шага 2 и восстановить (предположить) чистое ?
Перенесём члены в формуле и выразим :
(Это всего лишь перенос членов в школьной алгебре!)
Так модель на любом шаге «представляет» итоговый чистый результат.
Шаг 4: ключевая идея DDIM — пересборка
В классическом DDPM обязательно нужно идти назад по марковской цепи шаг за шагом ().
Гениальность DDIM в том, что правило «идти строго по шагам» нарушено. Авторы предложили: если сохранить итоговое маргинальное распределение, то путь между шагами может быть любым! Поэтому DDIM строит новую формулу для получения .
DDIM считает, что можно собрать из трёх частей:
Выпишем их подробно (не пугайтесь длинной формулы, разберём по кускам):
Разберём каждую часть:
- Часть 1 (в сторону ): то, что стоит в скобках, — это и есть предсказанное нами с шага 3. Множитель означает, сколько сигнала мы сохраняем.
- Часть 2 (в сторону ): для плавного перехода мы добавляем обратно немного только что предсказанного шума . Коэффициент нужен, чтобы суммарная дисперсия совпадала.
- Часть 3 (случайный шум): — параметр дисперсии, который мы задаём сами, а — новый случайный шум.
Шаг 5: момент чуда — почему это ускоряет процесс?
Формула выше — обобщённая формула сэмплирования диффузионной модели. Теперь видно, где DDIM раскрывает свою силу.
Операция 1: положим (убираем случайность)
Авторы DDIM показали, что если полностью убрать случайность, то есть положить параметр дисперсии , то часть 3 исчезает!
Что это значит? Переход от к становится полностью детерминированным: при фиксированном входном шуме результат будет одним и тем же, сколько бы раз мы ни запускали генерацию. Для стабильности робота это очень важно!
Операция 2: прыжки по шагам (ускоренное сэмплирование)
Посмотрите на упрощённую формулу: для вычисления нужны только , предсказание модели и .
Индекс — лишь обозначение: он не обязан быть предыдущим целым числом!
То есть можно задать подпоследовательность шагов, например перейти от сразу к и подставить вместо «» в формулу.
Так достигается большой скачок: вместо 1000 итераций можно делать шаг каждые 50 шагов и получить результат за 20 итераций. Именно это и есть основа ускорения DDIM.
Итоговое обобщение
- Модель предсказывает текущий шум .
- По этому шуму восстанавливаем чистые данные .
- DDIM строит новую формулу, которая комбинирует предсказанное и предсказанный шум в определённых пропорциях и напрямую вычисляет детерминированное предыдущее состояние.
- Поскольку формула не требует строгой непрерывности марковской цепи, можно «прыгать» по шагам и получить ускорение в несколько или даже десятки раз.
Первая расшифровка: почему можно перейти сразу от к ?
Чтобы это доказать, нужна базовая статистическая «шпаргалка» — свойство аддитивности нормальных распределений:
Теорема: если есть две независимые нормально распределённые величины с дисперсиями и , то их сумма тоже нормальна, а её дисперсия равна сумме дисперсий, то есть .
В диффузионных моделях одношаговый процесс зашумления выглядит так (каждый раз добавляется немного шума):
Здесь — чистый стандартный нормальный шум (среднее 0, дисперсия 1). Коэффициент — это уже знакомая «доля сохранённого сигнала».
Теперь попробуем выразить напрямую через .
Подставим формулу для в формулу для :
Раскроем скобки:
Момент чуда! Объединим два куска шума с помощью теоремы о сумме дисперсий:
Дисперсия первого куска:
Дисперсия второго куска:
Поскольку шумы складываются, дисперсии суммируются:
То есть два куска шума объединяются в один новый стандартный шум с дисперсией (назовём его ):
Видно, что промежуточное полностью исчезло!
Для краткости введём (произведение долей сохранённого сигнала за первые шагов).
Продолжая эту подстановку до шага , получаем основной результат:
Вывод: благодаря свойству сложения нормальных шумов можно не проходить через промежуточные и сразу вычислить зашумлённое состояние на шаге .
Вторая расшифровка: почему формула DDIM распадается на три части?
Это не магия: авторы подобрали формулу обратным выводом (reverse-engineering), чтобы получить распределение с нужными свойствами.
1. Какова конечная цель авторов DDIM?
Идея DDIM: мне не важно, как именно идёт обратный денойзинг, но результат обязан подчиняться закону прямого процесса, выведенному в первой расшифровке.
То есть должно удовлетворять:
2. «Разложение» полного шума (ключевой принцип)
Теперь у нас есть три известных сведения:
- Предсказанное чистое изображение ()
- Текущее зашумлённое изображение ()
- Предсказанный модель шум, содержащийся в ()
В формуле для конечной цели «полный шум» должен иметь дисперсию (то есть силу) .
Авторы рассудили: если весь этот полный шум сделать случайным, получится обычный DDPM, и результат каждый раз будет разным. Можно ли «разрезать» полный шум на две части?
- Одна часть — детерминированная (Deterministic): используем уже предсказанный моделью шум . У него есть определённое направление (к ).
- Другая часть — стохастическая (Stochastic): добавляем немного совершенно нового случайного шума , дисперсию которого задаём сами.
Как при разделе торта: общий бюджет дисперсии равен .
Если часть отдана «случайному шуму» , то на «детерминированный шум» остаётся:
3. Сборка
По логике «раздела торта» перепишем формулу для :
Подставим соответствующие коэффициенты дисперсии:
Наконец, поскольку истинное нам неизвестно, в формуле вместо него подставляется предсказание модели (то самое, полученное переносом членов из школьной алгебры).
Вот откуда берутся «три части»!
Здесь нет никакой магии. Принцип: при неизменной суммарной дисперсии (силе шума) шум аккуратно делится на «предсказуемую часть» и «чисто случайную часть». Когда чисто случайная часть (дисперсия ) равна нулю, весь процесс превращается в детерминированный ускоренный переход по шагам.
Основное правило: квадратичное масштабирование дисперсии
В теории вероятностей, если у случайной величины есть дисперсия , и её умножить на константу , то дисперсия новой величины равна старой, умноженной на квадрат константы:
Применяем правило к нашему выводу
В диффузионных моделях все базовые шумы (будь то , или ) по определению стандартные нормальные.
У стандартного нормального распределения есть важнейшее свойство: среднее 0, дисперсия 1.
То есть .
Посмотрим на первый из двух кусков шума:
Вычислим дисперсию всего этого куска:
- Константа .
- По указанному правилу дисперсия куска = .
- Возводим в квадрат, корень исчезает: получаем .
- Поскольку .
- Итог: дисперсия = .
Аналогично для второго куска:
Его дисперсия: .
Последний шаг: складываем и упаковываем обратно
Поскольку и — два независимых «розыгрыша» (независимые одинаково распределённые величины), их суммарная дисперсия равна сумме их дисперсий (это и есть «теорема о сумме» из первой расшифровки):
Получили, что суммарная дисперсия двух кусков шума равна .
Но в формулу нужно записать коэффициент, умноженный на стандартный шум.
По обратному рассуждению: раз дисперсия равна , то по правилу искомый коэффициент — это квадратный корень из суммарной дисперсии.
Поэтому объединённый шум записывается так:
(где обозначает новый стандартный нормальный шум).
В embodied AI (например, в задаче управления манипулятором, который берёт чашку) Diffusion Policy выдаёт не картинку, а последовательность действий робота (например, углы суставов на следующие 16 шагов).
Ниже упрощённый псевдокод, который показывает, как описанная формула DDIM работает в «мозге» робота:
# Предположим, что обучена диффузионная большая модель (U-Net), которая по увиденной картинке предсказывает шум в действиях
# robot_camera_image: текущий кадр робота (служит условием генерации действий)
def ddim_fast_sample(robot_camera_image, unet_model, total_train_steps=1000, jump_steps=10):
"""
Генерация траектории действий робота с ускорением DDIM.
Вместо 1000 шагов вычисляем лишь 10 прыжков (сильно повышает скорость, нужную для управления в реальном времени).
"""
# 1. Инициализация: создаём совершенно случайную траекторию действий (чистый шум)
# Например, случайные команды для суставов на 16 шагов вперёд; сейчас движения полностью хаотичны
action_t = generate_random_noise(shape=(16, joint_dim))
# 2. Маршрут прыжков: например, 1000 -> 900 -> 800 ... -> 0
timesteps = get_jump_sequence(total_train_steps, jump_steps)
# 3. Основной цикл обратного денойзинга (здесь работает DDIM)
for i in range(len(timesteps)):
t = timesteps[i] # текущий шаг времени
t_prev = timesteps[i+1] if i < len(timesteps)-1 else 0 # следующий шаг, к которому прыгаем
# [соответствует выводу]: вызываем большую модель, которая по текущим зашумлённым действиям и кадру предсказывает шум
predicted_noise = unet_model(action_t, t, condition=robot_camera_image)
# [формула переноса членов]: по зашумлённым действиям и предсказанному шуму восстанавливаем чистые действия (x_0)
predicted_x0 = calculate_clean_x0(action_t, predicted_noise, t)
# [сборка из трёх частей]: детерминированная формула DDIM
# Случайная часть обнулена (sigma_t = 0), для шага t_prev строим действия только из x_0 и предсказанного шума
action_t = ddim_assemble_formula(predicted_x0, predicted_noise, t_prev)
# После цикла action_t превращается из хаотичного набора чисел в плавную и точную траекторию захвата!
return action_t
# ==========================================
# Реальный цикл управления робота (например, 10 раз в секунду)
# ==========================================
while robot_is_turned_on:
# A. Смотрим на окружение
current_image = get_camera_frame()
# B. Мозг быстро работает: вызываем DDIM и за 10 шагов получаем действия на 16 шагов вперёд
action_trajectory = ddim_fast_sample(current_image, my_diffusion_model)
# C. Приём воплощённого ИИ: Receding Horizon Control (управление со скользящим горизонтом)
# Модель предсказывает 16 шагов вперёд, но выполняется только первые 8. Затем снова смотрим и пересчитываем!
execute_on_physical_robot(action_trajectory[0:8])
Три ключевых момента этого псевдокода:
condition=robot_camera_image(условное управление): в этом суть воплощённого ИИ. Обычная диффузионная модель генерирует картинки по тексту, а здесь модель опирается на текущую визуальную картину, чтобы управлять предсказанием шума и генерировать действия, соответствующие окружению.- Всего 10 итераций цикла (сверхбыстрый инференс): благодаря формуле прыжков DDIM (
ddim_assemble_formula) циклfor, который мог бы выполняться 1000 раз, выполняется 10 или 20 раз. Задержка вычислений сокращается с нескольких секунд до десятков миллисекунд, и робот может двигаться плавно, без рывков. - Скользящее исполнение (Receding Horizon): в главном цикле робот предсказывает длинную последовательность действий, но выполняет только её начало. Это похоже на вождение автомобиля: взгляд направлен вдаль (прогноз на 16 шагов), а руки крутят руль на ближайший участок (выполнение 8 шагов); процесс постоянно повторяется. Так поведение безопасно и устойчиво.