Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Вопросы для собеседования, набор 6: DDPM и DDIM

Попробуйте почувствовать разницу между DDPM и DDIM. Готовы? Начнём!


Шаг 1: вспомогательная база (приём репараметризации)

В диффузионных моделях чаще всего используется такой приём: если у вас есть величина, распределённая по нормальному закону (среднее , дисперсия ), её можно записать так:

Здесь — чистый стандартный нормальный шум .

Проще говоря: любое состояние = определённая базовая величина + (случайный шум сила шума). Запомните эту формулу: она лежит в основе всего вывода.


Шаг 2: базовая постановка DDPM (прямой процесс зашумления)

В исходном DDPM (денойзинговой диффузионной вероятностной модели) есть чёткий прямой процесс зашумления.

Пусть у нас есть чистое изображение (или идеальное действие робота) . Мы постепенно добавляем к нему шум, и на шаге оно превращается в .

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

Формула такая:

  • : исходные чистые данные.
  • : зашумлённые данные на шаге .
  • : коэффициент от 0 до 1. Его можно понимать как «долю сохранённого сигнала». С ростом значение уменьшается и стремится к 0.
  • : «сила шума».
  • : чистый стандартный нормальный шум.

Итог в одной фразе: данные на шаге — это «ослабленные чистые данные» плюс «постепенно усиливающийся шум».


Шаг 3: обратное рассуждение — как по угадать ?

Теперь переходим к той части, где работает большая модель: обратному денойзингу.

Большая модель (например, нейросеть U-Net) при инференсе получает зашумлённое . Её задача — предсказать шум , который содержится в этих данных.

Пусть мы обучили модель , которая точно угадывает шум в текущем .

Раз шум угадан, можно воспользоваться формулой из шага 2 и восстановить (предположить) чистое ?

Перенесём члены в формуле и выразим :

(Это всего лишь перенос членов в школьной алгебре!)

Так модель на любом шаге «представляет» итоговый чистый результат.


Шаг 4: ключевая идея DDIM — пересборка

В классическом DDPM обязательно нужно идти назад по марковской цепи шаг за шагом ().

Гениальность DDIM в том, что правило «идти строго по шагам» нарушено. Авторы предложили: если сохранить итоговое маргинальное распределение, то путь между шагами может быть любым! Поэтому DDIM строит новую формулу для получения .

DDIM считает, что можно собрать из трёх частей:

Выпишем их подробно (не пугайтесь длинной формулы, разберём по кускам):

Разберём каждую часть:

  1. Часть 1 (в сторону ): то, что стоит в скобках, — это и есть предсказанное нами с шага 3. Множитель означает, сколько сигнала мы сохраняем.
  2. Часть 2 (в сторону ): для плавного перехода мы добавляем обратно немного только что предсказанного шума . Коэффициент нужен, чтобы суммарная дисперсия совпадала.
  3. Часть 3 (случайный шум): — параметр дисперсии, который мы задаём сами, а — новый случайный шум.

Шаг 5: момент чуда — почему это ускоряет процесс?

Формула выше — обобщённая формула сэмплирования диффузионной модели. Теперь видно, где DDIM раскрывает свою силу.

Операция 1: положим (убираем случайность)

Авторы DDIM показали, что если полностью убрать случайность, то есть положить параметр дисперсии , то часть 3 исчезает!

Что это значит? Переход от к становится полностью детерминированным: при фиксированном входном шуме результат будет одним и тем же, сколько бы раз мы ни запускали генерацию. Для стабильности робота это очень важно!

Операция 2: прыжки по шагам (ускоренное сэмплирование)

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

Индекс — лишь обозначение: он не обязан быть предыдущим целым числом!

То есть можно задать подпоследовательность шагов, например перейти от сразу к и подставить вместо «» в формулу.

Так достигается большой скачок: вместо 1000 итераций можно делать шаг каждые 50 шагов и получить результат за 20 итераций. Именно это и есть основа ускорения DDIM.


Итоговое обобщение

  1. Модель предсказывает текущий шум .
  2. По этому шуму восстанавливаем чистые данные .
  3. DDIM строит новую формулу, которая комбинирует предсказанное и предсказанный шум в определённых пропорциях и напрямую вычисляет детерминированное предыдущее состояние.
  4. Поскольку формула не требует строгой непрерывности марковской цепи, можно «прыгать» по шагам и получить ускорение в несколько или даже десятки раз.

Первая расшифровка: почему можно перейти сразу от к ?

Чтобы это доказать, нужна базовая статистическая «шпаргалка» — свойство аддитивности нормальных распределений:

Теорема: если есть две независимые нормально распределённые величины с дисперсиями и , то их сумма тоже нормальна, а её дисперсия равна сумме дисперсий, то есть .

В диффузионных моделях одношаговый процесс зашумления выглядит так (каждый раз добавляется немного шума):

Здесь — чистый стандартный нормальный шум (среднее 0, дисперсия 1). Коэффициент — это уже знакомая «доля сохранённого сигнала».

Теперь попробуем выразить напрямую через .

Подставим формулу для в формулу для :

Раскроем скобки:

Момент чуда! Объединим два куска шума с помощью теоремы о сумме дисперсий:

Дисперсия первого куска:

Дисперсия второго куска:

Поскольку шумы складываются, дисперсии суммируются:

То есть два куска шума объединяются в один новый стандартный шум с дисперсией (назовём его ):

Видно, что промежуточное полностью исчезло!

Для краткости введём (произведение долей сохранённого сигнала за первые шагов).

Продолжая эту подстановку до шага , получаем основной результат:

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


Вторая расшифровка: почему формула DDIM распадается на три части?

Это не магия: авторы подобрали формулу обратным выводом (reverse-engineering), чтобы получить распределение с нужными свойствами.

1. Какова конечная цель авторов DDIM?

Идея DDIM: мне не важно, как именно идёт обратный денойзинг, но результат обязан подчиняться закону прямого процесса, выведенному в первой расшифровке.

То есть должно удовлетворять:

2. «Разложение» полного шума (ключевой принцип)

Теперь у нас есть три известных сведения:

  1. Предсказанное чистое изображение ()
  2. Текущее зашумлённое изображение ()
  3. Предсказанный модель шум, содержащийся в ()

В формуле для конечной цели «полный шум» должен иметь дисперсию (то есть силу) .

Авторы рассудили: если весь этот полный шум сделать случайным, получится обычный DDPM, и результат каждый раз будет разным. Можно ли «разрезать» полный шум на две части?

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

Как при разделе торта: общий бюджет дисперсии равен .

Если часть отдана «случайному шуму» , то на «детерминированный шум» остаётся:

3. Сборка

По логике «раздела торта» перепишем формулу для :

Подставим соответствующие коэффициенты дисперсии:

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

Вот откуда берутся «три части»!

Здесь нет никакой магии. Принцип: при неизменной суммарной дисперсии (силе шума) шум аккуратно делится на «предсказуемую часть» и «чисто случайную часть». Когда чисто случайная часть (дисперсия ) равна нулю, весь процесс превращается в детерминированный ускоренный переход по шагам.


Основное правило: квадратичное масштабирование дисперсии

В теории вероятностей, если у случайной величины есть дисперсия , и её умножить на константу , то дисперсия новой величины равна старой, умноженной на квадрат константы:


Применяем правило к нашему выводу

В диффузионных моделях все базовые шумы (будь то , или ) по определению стандартные нормальные.

У стандартного нормального распределения есть важнейшее свойство: среднее 0, дисперсия 1.

То есть .

Посмотрим на первый из двух кусков шума:

Вычислим дисперсию всего этого куска:

  1. Константа .
  2. По указанному правилу дисперсия куска = .
  3. Возводим в квадрат, корень исчезает: получаем .
  4. Поскольку .
  5. Итог: дисперсия = .

Аналогично для второго куска:

Его дисперсия: .


Последний шаг: складываем и упаковываем обратно

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

Получили, что суммарная дисперсия двух кусков шума равна .

Но в формулу нужно записать коэффициент, умноженный на стандартный шум.

По обратному рассуждению: раз дисперсия равна , то по правилу искомый коэффициент — это квадратный корень из суммарной дисперсии.

Поэтому объединённый шум записывается так:

(где обозначает новый стандартный нормальный шум).


В 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])

Три ключевых момента этого псевдокода:

  1. condition=robot_camera_image (условное управление): в этом суть воплощённого ИИ. Обычная диффузионная модель генерирует картинки по тексту, а здесь модель опирается на текущую визуальную картину, чтобы управлять предсказанием шума и генерировать действия, соответствующие окружению.
  2. Всего 10 итераций цикла (сверхбыстрый инференс): благодаря формуле прыжков DDIM (ddim_assemble_formula) цикл for, который мог бы выполняться 1000 раз, выполняется 10 или 20 раз. Задержка вычислений сокращается с нескольких секунд до десятков миллисекунд, и робот может двигаться плавно, без рывков.
  3. Скользящее исполнение (Receding Horizon): в главном цикле робот предсказывает длинную последовательность действий, но выполняет только её начало. Это похоже на вождение автомобиля: взгляд направлен вдаль (прогноз на 16 шагов), а руки крутят руль на ближайший участок (выполнение 8 шагов); процесс постоянно повторяется. Так поведение безопасно и устойчиво.