Содержание курса 27 / 33

27 / 33 · Диффузионные модели

DDPM: обратный процесс и целевая функция обучения

Как DDPM учится проходить цепочку зашумления в обратном направлении. Точное правдоподобие — вычислительно неразрешимый интеграл по всем путям от шума к изображению, неравенство Йенсена превращает его в оценку из KL-членов, а сопоставление гауссовских апостериорных распределений сводит обучение к предсказанию добавленного шума на случайном шаге; одна U-Net служит всем шагам и получает шаг на вход в виде синусоидального эмбеддинга.

На этой странице 16

Прямой процесс дал нам диффузионный процесс — фиксированную цепочку, которая превращает изображение в гауссовский шум. Чтобы генерировать изображения, этот процесс нужно обратить, и это задача глубокой нейронной сети. В этой заметке мы выводим, чему обучается сеть. Путь тот же, что и для VAE: правдоподобие вычислительно неразрешимо (intractable), поэтому вместо отрицательного логарифма правдоподобия мы минимизируем его верхнюю оценку. Затем эта оценка шаг за шагом упрощается до обычной среднеквадратичной ошибки (mean squared error, MSE) на шуме. При первом чтении можно пропустить врезки (алгебру разложения на KL-члены, форму оценки 2015 года, дискретизованный декодер); сводка в конце собирает всю цепочку в шесть строк.

Обозначения. Прямой шаг добавляет шум с дисперсией βt∈(0,1)\beta_t \in (0, 1) на шаге t=1,…,Tt = 1, \dots, T. Обозначим

αt=1−βt,αˉt=∏s=1tαs,αˉ0=1,\alpha_t = 1 - \beta_t, \qquad \bar\alpha_t = \prod_{s=1}^{t} \alpha_s, \qquad \bar\alpha_0 = 1,

так что прямой шаг и переход в замкнутом виде из предыдущей заметки записываются как

q(xt∣xt−1)=N ⁣(αt xt−1,  βtI),q(xt∣x0)=N ⁣(αˉt x0,  (1−αˉt)I).\begin{gathered} q(x_t \mid x_{t-1}) = \mathcal N\!\big(\sqrt{\alpha_t}\,x_{t-1},\; \beta_t I\big), \\ q(x_t \mid x_0) = \mathcal N\!\big(\sqrt{\bar\alpha_t}\,x_0,\; (1 - \bar\alpha_t) I\big). \end{gathered}

Второй аргумент N(μ,σ2)\mathcal N(\mu, \sigma^2) — всегда дисперсия. Через qq обозначается фиксированный прямой процесс, а q(x0)q(x_0) — распределение данных, с которого он начинается; pθp_\theta — обучаемый обратный процесс, θ\theta — параметры нейронной сети, а p(xT)=N(0,I)p(x_T) = \mathcal N(0, I) — распределение шума, с которого начинается генерация.

Обратный процесс#

Изображение x0x_0 находится на одном конце цепочки, а чистый шум xTx_T — на другом. В прямом направлении шаг q(xt∣xt−1)q(x_t \mid x_{t-1}) известен. В обратном нам нужна pθ(xt−1∣xt)p_\theta(x_{t-1} \mid x_t) — плотность вероятности, которую необходимо выучить, чтобы обратить процесс.

Рисунок

Прямой шаг известен, обратный нужно выучить

Прямой и обратный шаги диффузионной цепочкиРяд из четырёх пиксельных плиток: x0 — изображение; x t минус 1; x t; и x T — чистый шум; между x0 и x t минус 1 и между x t и x T стоят многоточия. Изогнутая стрелка сверху идёт от x t минус 1 к x t и подписана q от x t при условии x t минус 1, фиксированный прямой шаг. Изогнутая синяя стрелка снизу идёт обратно от x t к x t минус 1 и подписана p тета от x t минус 1 при условии x t — плотность вероятности для обращения процесса, которая обучается с параметрами сети тета.x0изображениеxt−1xtxTшум⋯⋯q(xₜ | xₜ₋₁)фиксирован: добавляет шумpθ(xₜ₋₁ | xₜ)плотность для обращения:обучается; θ — веса сетиПрямой и обратный шаги диффузионной цепочкиСтолбец из четырёх пиксельных плиток сверху вниз: x0 — изображение; x t минус 1; x t; и x T — чистый шум; между ними вертикальные многоточия. Справа изогнутая стрелка идёт вниз от x t минус 1 к x t и подписана q от x t при условии x t минус 1, фиксированный. Слева изогнутая синяя стрелка идёт вверх от x t к x t минус 1 и подписана p тета от x t минус 1 при условии x t — обучаемая плотность вероятности для обращения процесса.x0изображениеxt−1xtxTшум⋮⋮q(xₜ | xₜ₋₁)фиксированpθ(xₜ₋₁ | xₜ)плотностьдля обращения(обучается)
Фиксированный прямой шаг q(xₜ | xₜ₋₁) добавляет шум и ведёт от изображения x₀ к чистому шуму на последнем шаге T. Обратный шаг pθ(xₜ₋₁ | xₜ) — плотность вероятности, которую нужно выучить, чтобы обратить процесс; θ — параметры нейронной сети. Плитки — настоящие сэмплы √ᾱ x₀ + √(1 − ᾱ) ε с одной общей реализацией шума (ᾱ = 1, 0.6, 0.42 и 0 от x₀ до последнего шага).

Что должны оптимизировать параметры θ\theta? Обычный ответ для генеративной модели — приписать реальным изображениям высокую вероятность. Мы минимизируем отрицательный логарифм правдоподобия, усреднённый по данным,

Ex0∼q(x0)[−log⁡pθ(x0)]  →  min⁡θ,\mathbb{E}_{x_0 \sim q(x_0)}\big[-\log p_\theta(x_0)\big] \;\to\; \min_\theta ,

что равносильно максимизации правдоподобия — плотности, которую модель приписывает реальным изображениям. Вывод ниже проводится для одного изображения x0x_0; усреднение по изображениям мы вернём в конце.

Полные прямой и обратный процессы#

Полный прямой процесс — это совместное распределение всех зашумлённых версий изображения. По формуле умножения вероятностей (chain rule)

q(x1,…,xT∣x0)=q(x1∣x0) q(x2∣x1,x0)⋯q(xT∣xT−1,…,x0).\begin{aligned} & q(x_1, \dots, x_T \mid x_0) \\ &\quad = q(x_1 \mid x_0)\, q(x_2 \mid x_1, x_0) \\ &\qquad \cdots q(x_T \mid x_{T-1}, \dots, x_0). \end{aligned}

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

q(x1,…,xT∣x0)=q(x1∣x0) q(x2∣x1)⋯q(xT∣xT−1).\begin{aligned} & q(x_1, \dots, x_T \mid x_0) \\ &\quad = q(x_1 \mid x_0)\, q(x_2 \mid x_1) \cdots q(x_T \mid x_{T-1}). \end{aligned}

С сокращённой записью xs:T=(xs,…,xT)x_{s:T} = (x_s, \dots, x_T), в которой x1:Tx_{1:T} — зашумлённые состояния, а x0:Tx_{0:T} — вся цепочка, полные прямой и обратный процессы имеют вид

q(x1:T∣x0)=∏t=1Tq(xt∣xt−1)⏟полный прямой процесс,pθ(x0:T)=p(xT)∏t=1Tpθ(xt−1∣xt)⏟полный обратный процесс.\begin{gathered} \underbrace{q(x_{1:T} \mid x_0) = \prod_{t=1}^{T} q(x_t \mid x_{t-1})}_{\text{полный прямой процесс}} , \\[4pt] \underbrace{p_\theta(x_{0:T}) = p(x_T) \prod_{t=1}^{T} p_\theta(x_{t-1} \mid x_t)}_{\text{полный обратный процесс}} . \end{gathered}

Обратный процесс начинается с p(xT)=N(0,I)p(x_T) = \mathcal N(0, I). У этого множителя нет параметров, и ему не нужны никакие знания о данных: это фиксированное стандартное нормальное распределение, одно и то же для любого набора данных. Всё обучение сосредоточено в обратных шагах pθ(xt−1∣xt)p_\theta(x_{t-1} \mid x_t).

Точный логарифм правдоподобия вычислительно неразрешим#

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

−log⁡pθ(x0)=−log⁡∫pθ(x0:T) dx1:T.-\log p_\theta(x_0) = -\log \int p_\theta(x_{0:T})\, dx_{1:T} .

Можно ли им воспользоваться? В DDPM каждый обратный шаг — гауссиана, среднее которой вычисляется по xtx_t нейронной сетью (точная форма приведена ниже). Сеть нелинейна по xtx_t, поэтому, в отличие от прямой цепочки линейных гауссовских шагов, композиция обратных шагов не гауссовская, и у интеграла нет замкнутого вида. Это то же препятствие, что и для декодера VAE. Остаётся численное интегрирование, поэтому посмотрим, что означает этот интеграл. Каждое значение x1:Tx_{1:T} — один путь от сэмпла шума xTx_T к изображению x0x_0, и интеграл складывает вероятности всех таких путей. Для изображений у каждого xtx_t столько измерений, сколько пикселей, а таких состояний TT (сотни или тысячи шагов), так что интеграл берётся по T×(число пикселей)T \times (\text{число пикселей}) измерениям. Вычислить все эти пути мы на самом деле не можем.

Рисунок

Интеграл правдоподобия суммирует по всем путям от шума к изображению

Много путей от шума к изображениюДва овала: слева изображения с точкой x0, справа шум с точкой x T и другими сэмплами шума. Много штриховых извилистых путей идут от точек в овале шума к x0. Один путь выделен синим, на нём три промежуточные точки с подписью: один путь равен одному значению x от 1 до T. Сверху интеграл от p тета от x от 0 до T по x от 1 до T. Снизу красная пометка: все эти пути на самом деле не вычислить.−log ∫ pθ(x0:T) dx1:TизображенияшумxTx0один путь = одно значение x1:Tвсе эти пути на самом деле не вычислитьМного путей от шума к изображениюДва овала: сверху изображения с точкой x0, снизу шум с точкой x T и другими сэмплами шума. Много штриховых извилистых путей идут вверх от овала шума к x0; один выделен синим, на нём три точки: один путь равен одному значению x от 1 до T. Снизу красная пометка: все эти пути на самом деле не вычислить.−log ∫ pθ(x0:T) dx1:TизображенияшумxTx0один путь =одно x1:Tвсе эти путина самом деле не вычислить
Точное правдоподобие интегрирует совместную обратную плотность по всем промежуточным состояниям, от x₁ до последнего состояния — чистого шума. Каждое значение этих состояний — один путь от сэмпла шума к изображению x₀ (по последнему состоянию мы тоже интегрируем, поэтому пути начинаются в любой точке шума). Состояния размером с изображение и сотни шагов не позволяют вычислить все эти пути. Пути — гладкие случайные мосты, построенные при фиксированном начальном значении (seed) генератора случайных чисел.

Верхняя оценка через неравенство Йенсена#

Приём тот же, что и в VAE. Умножим и разделим на полный прямой процесс q(x1:T∣x0)q(x_{1:T} \mid x_0), который мы знаем и из которого умеем сэмплировать (это произведение гауссиан, всюду положительное, поэтому деление допустимо):

−log⁡pθ(x0)=−log⁡∫q(x1:T∣x0) pθ(x0:T)q(x1:T∣x0) dx1:T=−log⁡Eq(x1:T∣x0) ⁣[pθ(x0:T)q(x1:T∣x0)].\begin{aligned} & -\log p_\theta(x_0) \\ &\quad = -\log \int q(x_{1:T} \mid x_0)\, \frac{p_\theta(x_{0:T})}{q(x_{1:T} \mid x_0)}\, dx_{1:T} \\ &\quad = -\log \mathbb{E}_{q(x_{1:T} \mid x_0)}\!\left[ \frac{p_\theta(x_{0:T})}{q(x_{1:T} \mid x_0)} \right]. \end{aligned}

Логарифм вогнут, поэтому неравенство Йенсена log⁡E[Y]≥E[log⁡Y]\log \mathbb{E}[Y] \ge \mathbb{E}[\log Y] переносит его внутрь математического ожидания и превращает равенство в оценку:

−log⁡pθ(x0)≤−Eq(x1:T∣x0) ⁣[log⁡pθ(x0:T)q(x1:T∣x0)].\begin{aligned} -\log p_\theta(x_0) &\le -\mathbb{E}_{q(x_{1:T} \mid x_0)}\!\left[ \log \frac{p_\theta(x_{0:T})}{q(x_{1:T} \mid x_0)} \right]. \end{aligned}

Правая часть — верхняя оценка отрицательного логарифма правдоподобия. Это отрицательная нижняя оценка обоснованности (evidence lower bound, ELBO); иначе говоря, ELBO — нижняя оценка логарифма правдоподобия. В оценку входят только величины, которые мы умеем сэмплировать и вычислять. Минимизируя её, мы ограничиваем отрицательный логарифм правдоподобия сверху, но сама оценка и отрицательный логарифм правдоподобия — не одно и то же. Зазор равен KL-дивергенции (KL divergence) DKL(q(x1:T∣x0) ∥ pθ(x1:T∣x0))D_{\mathrm{KL}}\big(q(x_{1:T} \mid x_0)\,\|\,p_\theta(x_{1:T} \mid x_0)\big), в точности как в VAE (насколько неточна оценка), и он тоже зависит от θ\theta. Обозначим оценку через BB, а зазор через GG. Тогда −log⁡pθ(x0)=B−G-\log p_\theta(x_0) = B - G, и шаг обучения меняет отрицательный логарифм правдоподобия на ΔB−ΔG\Delta B - \Delta G. Поэтому само по себе уменьшение оценки ничего не гарантирует: если BB падает с 10 до 9, а GG сокращается с 3 до 1, отрицательный логарифм правдоподобия растёт с 7 до 8. Минимизация оценки улучшает правдоподобие, только если оценка падает сильнее, чем сокращается зазор; если зазор не меняется или растёт, правдоподобие улучшается не меньше, чем оценка.

Разложение оценки на KL-члены#

Выкладки приведены в приложении A статьи DDPM (Ho, Jain and Abbeel, 2020, формула 5) и кратко изложены во врезке ниже. Оценка превращается в сумму членов трёх видов:

Eq[ DKL(q(xT∣x0) ∥ p(xT))⏟не зависит от θ+∑t>1DKL(q(xt−1∣xt,x0) ∥ pθ(xt−1∣xt))− log⁡pθ(x0∣x1)⏟реконструкция ].\begin{aligned} & \mathbb{E}_q\Bigg[\, \underbrace{D_{\mathrm{KL}}\big(q(x_T \mid x_0) \,\|\, p(x_T)\big)}_{\text{не зависит от }\theta} \\ & + \sum_{t > 1} D_{\mathrm{KL}}\big(q(x_{t-1} \mid x_t, x_0) \,\|\, p_\theta(x_{t-1} \mid x_t)\big) \\ & \underbrace{-\, \log p_\theta(x_0 \mid x_1)}_{\text{реконструкция}} \,\Bigg]. \end{aligned}

Здесь Eq\mathbb{E}_q — усреднение по зашумлённым состояниям x1:T∼q(x1:T∣x0)x_{1:T} \sim q(x_{1:T} \mid x_0) одного изображения. Каждому члену нужны лишь некоторые из них: tt-я KL-дивергенция зависит только от xtx_t, поэтому её среднее берётся по xt∼q(xt∣x0)x_t \sim q(x_t \mid x_0), а член реконструкции зависит только от x1x_1. При обучении мы также усредняем по изображениям x0∼q(x0)x_0 \sim q(x_0).

Разберём три члена по очереди.

  • Первый член. q(xT∣x0)q(x_T \mid x_0) — фиксированный прямой процесс, а p(xT)p(x_T) — фиксированное стандартное нормальное распределение. Ничто здесь не зависит от θ\theta, поэтому для обучения это константа. (Кроме того, при удачно выбранном расписании шума, noise schedule, он очень мал: линейное расписание DDPM доходит до αˉ1000≈4×10−5\bar\alpha_{1000} \approx 4 \times 10^{-5}, так что q(xT∣x0)≈N(0,I)q(x_T \mid x_0) \approx \mathcal N(0, I). Игрушечное расписание с T=100T = 100 шагами и βt\beta_t, растущими от 10−510^{-5} до 10−210^{-2}, заканчивается около αˉ100≈0.6\bar\alpha_{100} \approx 0.6 и до этого не доходит.)
  • Последний член. −log⁡pθ(x0∣x1)-\log p_\theta(x_0 \mid x_1) показывает, насколько вероятно, что модель восстановит изображение по чуть более зашумлённому x1x_1. В x1x_1 шума почти не осталось, поэтому в выводе мы этот член откладываем. Это упрощение: DDPM сохраняет его в виде дискретизированного декодера для 8-битных значений пикселей (Ho, Jain and Abbeel, 2020, §3.3, формула 13; врезка ниже), а в упрощённой функции потерь его приближает член регрессии шума при t=1t = 1 (§3.4).
  • Средние члены. Именно они выполняют основную работу. Каждый сравнивает «истинное апостериорное распределение» (true posterior) q(xt−1∣xt,x0)q(x_{t-1} \mid x_t, x_0) с шагом обратной диффузии модели pθ(xt−1∣xt)p_\theta(x_{t-1} \mid x_t).

После упрощения целевая функция имеет вид

Eq[∑t>1DKL(q(xt−1∣xt,x0)⏟истинное апостериорное распределение∥ pθ(xt−1∣xt)⏟обратный шаг)].\begin{aligned} \mathbb{E}_q\Bigg[ \sum_{t > 1} D_{\mathrm{KL}}\Big( & \underbrace{q(x_{t-1} \mid x_t, x_0)}_{\text{истинное апостериорное распределение}} \\ & \Big\|\, \underbrace{p_\theta(x_{t-1} \mid x_t)}_{\text{обратный шаг}} \Big) \Bigg]. \end{aligned}

Истинное апостериорное распределение#

Три состояния и три условных распределения укладываются в один небольшой граф. xt−1x_{t-1} зашумлено, xtx_t зашумлено сильнее, а x0x_0 — исходное изображение.

Рисунок

Прямой шаг, шаг модели и истинное апостериорное распределение

Граф из x t минус 1, x t и x 0 с тремя условными распределениямиТри узла в кружках: слева x t минус 1 с пометкой «с шумом»; справа x t с пометкой «больше шума»; под x t узел x 0 с пометкой «исходное изображение». Сплошная стрелка дугой сверху идёт от x t минус 1 к x t и подписана q от x t при условии x t минус 1. Штриховая синяя стрелка возвращается от x t к x t минус 1 и подписана p тета от x t минус 1 при условии x t, шаг обратной диффузии. Пунктирная линия соединяет x t и x 0, объединяя два условия истинного апостериорного распределения. Зелёная стрелка идёт от x 0 по нижней части к x t минус 1 и подписана q от x t минус 1 при условии x t и x 0, истинное апостериорное распределение.с шумомбольше шумаисходноеизображениеq(xₜ | xₜ₋₁)pθ(xₜ₋₁ | xₜ)шаг обратной диффузииq(xₜ₋₁ | xₜ, x0)«истинное апостериорное распределение»: нужен x₀xt−1xtx0Граф из x t минус 1, x t и x 0 с тремя условными распределениямиТри узла в кружках: слева x t минус 1, с шумом; справа x t, больше шума; под x t узел x 0, исходное изображение. Сплошная стрелка дугой сверху идёт от x t минус 1 к x t и подписана q от x t при условии x t минус 1. Штриховая синяя стрелка возвращается от x t к x t минус 1 и подписана p тета от x t минус 1 при условии x t. Пунктирная линия соединяет x t и x 0, объединяя два условия истинного апостериорного распределения. Зелёная стрелка идёт от x 0 к x t минус 1 и подписана q от x t минус 1 при условии x t и x 0, истинное апостериорное распределение.с шумомбольше шумаисходноеизображениеq(xₜ | xₜ₋₁)pθ(xₜ₋₁ | xₜ)q(xₜ₋₁ | xₜ, x0)«истинное апостериорноераспределение»xt−1xtx0
x₀ — исходное изображение, xₜ₋₁ зашумлено, а xₜ зашумлено сильнее. Прямой шаг q(xₜ | xₜ₋₁) добавляет шум. Шаг обратной диффузии модели pθ(xₜ₋₁ | xₜ) видит только xₜ. Истинное апостериорное распределение q(xₜ₋₁ | xₜ, x₀) тоже ведёт обратно к xₜ₋₁, но использует ещё и x₀; у него есть замкнутый вид, однако для генерации, где изображения нет, его использовать нельзя. Пунктирная линия объединяет xₜ и x₀: в истинном апостериорном распределении обе переменные стоят в условии.

Прямой шаг q(xt∣xt−1)q(x_t \mid x_{t-1}) идёт вправо. Шаг модели pθ(xt−1∣xt)p_\theta(x_{t-1} \mid x_t) идёт влево и использует только xtx_t. Истинное апостериорное распределение q(xt−1∣xt,x0)q(x_{t-1} \mid x_t, x_0) тоже идёт влево, но смотрит и на xtx_t, и на исходное изображение x0x_0.

У истинного апостериорного распределения есть выражение в замкнутом виде (выведено ниже). Зачем же тогда вообще нужна нейронная сеть? Затем, что для истинного апостериорного распределения нужно знать x0x_0. При генерации изображения у нас нет: его нужно получить, начав с одного лишь чистого шума. Поэтому сеть pθ(xt−1∣xt)p_\theta(x_{t-1} \mid x_t) должна подражать истинному апостериорному распределению, не видя x0x_0.

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

pθ(xt−1∣xt)=N ⁣(μθ(xt,t),  σθ2(xt,t) I)↕q(xt−1∣xt,x0)=N ⁣(μ~t(xt,x0),  β~tI).\begin{gathered} p_\theta(x_{t-1} \mid x_t) = \mathcal N\!\big(\mu_\theta(x_t, t),\; \sigma_\theta^2(x_t, t)\, I\big) \\ \big\updownarrow \\ q(x_{t-1} \mid x_t, x_0) = \mathcal N\!\big(\tilde\mu_t(x_t, x_0),\; \tilde\beta_t I\big). \end{gathered}

Почему гауссианы?

  1. При малых шагах обратный шаг остаётся гауссовским. Для диффузии с малыми шагами обращение гауссовской марковской цепи тоже (приближённо) гауссовское: при βt→0\beta_t \to 0 обратный шаг q(xt−1∣xt)q(x_{t-1} \mid x_t) имеет тот же гауссовский функциональный вид, что и прямой (Feller, 1949; используется у Sohl-Dickstein et al., 2015, §2.2). При конечных шагах q(xt−1∣xt)q(x_{t-1} \mid x_t) не является в точности гауссовским, потому что это смесь по всем изображениям x0x_0 из данных. Апостериорное распределение при условии x0x_0, q(xt−1∣xt,x0)q(x_{t-1} \mid x_t, x_0), в точности гауссовское при любом βt\beta_t, если t≥2t \ge 2. При t=1t = 1 оно вырождается в точечную массу в x0x_0 (β~1=0\tilde\beta_1 = 0), поэтому этот шаг учитывается членом реконструкции.
  2. Так попросту проще. У KL-дивергенций между гауссианами есть замкнутые формулы, а сэмплировать из гауссианы тривиально.

Замкнутый вид. Пусть t≥2t \ge 2. По теореме Байеса q(xt−1∣xt,x0)∝q(xt∣xt−1) q(xt−1∣x0)q(x_{t-1} \mid x_t, x_0) \propto q(x_t \mid x_{t-1})\, q(x_{t-1} \mid x_0). Оба множителя гауссовские по xt−1x_{t-1}. У первого показатель экспоненты равен −(xt−αt xt−1)2/(2βt)=−αt (xt−1−xt/αt)2/(2βt)-(x_t - \sqrt{\alpha_t}\,x_{t-1})^2/(2\beta_t) = -\alpha_t\,(x_{t-1} - x_t/\sqrt{\alpha_t})^2/(2\beta_t) (для каждой координаты), так что как функция xt−1x_{t-1} он имеет среднее xt/αtx_t/\sqrt{\alpha_t} и обратную дисперсию (precision) αt/βt\alpha_t/\beta_t. Второй равен N(αˉt−1 x0,  1−αˉt−1)\mathcal N\big(\sqrt{\bar\alpha_{t-1}}\,x_0,\; 1 - \bar\alpha_{t-1}\big). Выделяя полный квадрат в произведении, получаем, что обратные дисперсии складываются, а среднее — это среднее двух средних, взвешенное по обратным дисперсиям:

1β~t=αtβt+11−αˉt−1=αt(1−αˉt−1)+βtβt(1−αˉt−1)=1−αˉtβt(1−αˉt−1),μ~t=β~t(αtβt xt+αˉt−11−αˉt−1 x0).\begin{aligned} \frac{1}{\tilde\beta_t} &= \frac{\alpha_t}{\beta_t} + \frac{1}{1 - \bar\alpha_{t-1}} = \frac{\alpha_t (1 - \bar\alpha_{t-1}) + \beta_t}{\beta_t (1 - \bar\alpha_{t-1})} \\ &= \frac{1 - \bar\alpha_t}{\beta_t (1 - \bar\alpha_{t-1})}, \\ \tilde\mu_t &= \tilde\beta_t \left( \frac{\sqrt{\alpha_t}}{\beta_t}\, x_t + \frac{\sqrt{\bar\alpha_{t-1}}}{1 - \bar\alpha_{t-1}}\, x_0 \right). \end{aligned}

Числитель упрощается: αt(1−αˉt−1)+βt=αt−αˉt+βt=1−αˉt\alpha_t(1 - \bar\alpha_{t-1}) + \beta_t = \alpha_t - \bar\alpha_t + \beta_t = 1 - \bar\alpha_t, где использованы αˉt=αtαˉt−1\bar\alpha_t = \alpha_t \bar\alpha_{t-1} и αt+βt=1\alpha_t + \beta_t = 1. Переходя от обратной дисперсии к дисперсии и раскрывая скобки в среднем, получаем

μ~t(xt,x0)=αˉt−1 βt1−αˉt x0+αt (1−αˉt−1)1−αˉt xt,β~t=1−αˉt−11−αˉt βt.\begin{aligned} \tilde\mu_t(x_t, x_0) &= \frac{\sqrt{\bar\alpha_{t-1}}\,\beta_t}{1 - \bar\alpha_t}\, x_0 \\ &\quad + \frac{\sqrt{\alpha_t}\,(1 - \bar\alpha_{t-1})}{1 - \bar\alpha_t}\, x_t, \\ \tilde\beta_t &= \frac{1 - \bar\alpha_{t-1}}{1 - \bar\alpha_t}\, \beta_t . \end{aligned}

Среднее истинного апостериорного распределения — взвешенная смесь изображения и текущего зашумлённого состояния.

Сопоставление двух гауссиан: KL превращается в L2#

Нам по-прежнему пришлось бы предсказывать и μθ\mu_\theta, и σθ\sigma_\theta. DDPM упрощает задачу дальше: σθ\sigma_\theta фиксируется расписанием σt\sigma_t, то есть не обучается, и обучается только среднее. Ho et al. используют σt2=βt\sigma_t^2 = \beta_t или σt2=β~t\sigma_t^2 = \tilde\beta_t и сообщают, что результаты похожи (Ho, Jain and Abbeel, 2020, §3.2); позже Nichol and Dhariwal (2021), §3.1, обучают дисперсию, которая интерполирует между этими двумя вариантами.

При фиксированных дисперсиях KL-дивергенция между двумя гауссианами зависит от θ\theta только через расстояние между средними. Для q=N(μ~t,β~tI)q = \mathcal N(\tilde\mu_t, \tilde\beta_t I) и pθ=N(μθ,σt2I)p_\theta = \mathcal N(\mu_\theta, \sigma_t^2 I) в dd измерениях KL-дивергенция между двумя одномерными гауссианами, просуммированная по dd координатам, даёт

DKL(q ∥ pθ)=12σt2 ∥μ~t−μθ∥2+d2(β~tσt2−1−log⁡β~tσt2)⏟const; 0 при σt2=β~t.\begin{aligned} D_{\mathrm{KL}}(q \,\|\, p_\theta) &= \frac{1}{2\sigma_t^2}\,\big\|\tilde\mu_t - \mu_\theta\big\|^2 \\ &\quad + \underbrace{\frac d2\left(\frac{\tilde\beta_t}{\sigma_t^2} - 1 - \log\frac{\tilde\beta_t}{\sigma_t^2}\right)}_{\text{const; }0\text{ при }\sigma_t^2 = \tilde\beta_t} . \end{aligned}

Тот же результат следует из общей формулы для двух гауссиан в dd измерениях с положительно определёнными ковариационными матрицами,

DKL(N(μq,Σq) ∥ N(μp,Σp))=12[tr⁡(Σp−1Σq)−d+ln⁡det⁡Σpdet⁡Σq+(μp−μq)⊤Σp−1(μp−μq)],\begin{aligned} & D_{\mathrm{KL}}\big(\mathcal N(\mu_q, \Sigma_q) \,\|\, \mathcal N(\mu_p, \Sigma_p)\big) \\ &\quad = \tfrac12\Big[\operatorname{tr}(\Sigma_p^{-1}\Sigma_q) - d + \ln\frac{\det\Sigma_p}{\det\Sigma_q} \\ &\qquad\quad + (\mu_p - \mu_q)^\top \Sigma_p^{-1} (\mu_p - \mu_q)\Big], \end{aligned}

при Σq=β~tI\Sigma_q = \tilde\beta_t I и Σp=σt2I\Sigma_p = \sigma_t^2 I: след даёт d β~t/σt2d\,\tilde\beta_t/\sigma_t^2, логарифм отношения определителей — dln⁡(σt2/β~t)d \ln(\sigma_t^2/\tilde\beta_t), а квадратичная форма — ∥μ~t−μθ∥2/σt2\lVert\tilde\mu_t - \mu_\theta\rVert^2/\sigma_t^2.

Таким образом, KL-член на самом деле — функция потерь L2 12σt2∥μ~t−μθ∥2\frac{1}{2\sigma_t^2}\|\tilde\mu_t - \mu_\theta\|^2 плюс константа. Для одной пары (xt,x0)(x_t, x_0) L2-часть обращалась бы в ноль при μθ\mu_\theta, равном μ~t\tilde\mu_t, а весь KL-член исчез бы, только если вдобавок σt2=β~t\sigma_t^2 = \tilde\beta_t. Но μ~t\tilde\mu_t зависит от x0x_0, которого сеть не видит, а одному и тому же xtx_t соответствует много изображений. Поскольку μθ\mu_\theta видит только xtx_t, лучшее, что она может сделать, — выдать среднее μ~t\tilde\mu_t по всем изображениям x0x_0, совместимым с xtx_t, потому что условное среднее минимизирует ожидаемую квадратичную ошибку:

μθ∗(xt,t)=Eq[μ~t(xt,x0)∣xt],\mu_\theta^*(x_t, t) = \mathbb{E}_q\big[\tilde\mu_t(x_t, x_0) \mid x_t\big],

где усреднение идёт по x0∼q(x0∣xt)x_0 \sim q(x_0 \mid x_t). По формуле полного математического ожидания (tower property) это также Eq[xt−1∣xt]\mathbb{E}_q[x_{t-1} \mid x_t] — среднее истинного обратного шага q(xt−1∣xt)q(x_{t-1} \mid x_t). Поэтому в оптимуме KL-член не равен нулю: остаток отражает, насколько xtx_t не определяет изображение однозначно.

Рисунок

При равных дисперсиях KL-дивергенция — функция потерь L2 для средних

Две гауссианы с равными дисперсиями и KL-дивергенция как функция разности их среднихСлева синяя гауссиана с центром в mu тета, равном минус 1.3, и зелёная гауссиана той же ширины с центром в mu с тильдой t, равном 1.4; у обоих средних штриховые линии, а стрелки от mu тета к mu с тильдой t подписаны «обучение сдвигает mu тета». Справа вставка: KL-дивергенция в зависимости от разности средних, парабола «разность в квадрате, делённая на 2 сигма в квадрате», текущая точка при разности 2.7 и KL 3.645 и стрелка вниз по параболе к нулю.μθμ̃tобучение сдвигает μθpθqравные дисперсии: σₜ² = β̃t (здесь = 1)KL = ‖μ̃t − μθ‖² / (2σₜ²)при σₜ² = β̃t3.645KL2.70μ̃t − μθДве гауссианы с равными дисперсиями и KL-дивергенция как функция разности их среднихСверху синяя гауссиана в mu тета и зелёная гауссиана той же ширины в mu с тильдой t, со стрелками от mu тета к mu с тильдой t. Снизу KL-дивергенция в зависимости от разности средних, парабола, текущая точка при разности 2.7 и KL 3.645 и стрелка вниз по параболе к нулю.μθμ̃tобучение сдвигает μθравные дисперсии: σₜ² = β̃t (здесь = 1)KL = ‖μ̃t − μθ‖² / (2σₜ²)при σₜ² = β̃t3.645KL2.70μ̃t − μθ
Шаг модели pθ = N(μθ, σₜ²) в сравнении с истинным апостериорным распределением q для варианта, в котором σₜ² равна дисперсии истинного апостериорного распределения, поэтому оба колокола одной ширины. Тогда их KL-дивергенция зависит только от разности средних: KL = (разность)² / (2σₜ²). При другом варианте, σₜ² = βₜ, добавляется константа, не зависящая от θ. На рисунке показана одна фиксированная пара (xₜ, x₀); обучение сдвигает μθ к среднему истинного апостериорного распределения, вниз по параболе справа. Поскольку μθ не видит x₀, по всем изображениям, совместимым с xₜ, оно приходит к среднему их апостериорных средних. Здесь σₜ² = β̃ₜ = 1, а разность равна 2.7, поэтому KL = 3.645 ната.

Итак:

Eq ⁣[∑t>112σt2 ∥μ~t−μθ(xt,t)∥2]  →  min⁡θ.\mathbb{E}_q\!\left[ \sum_{t > 1} \frac{1}{2\sigma_t^2}\, \big\| \tilde\mu_t - \mu_\theta(x_t, t) \big\|^2 \right] \;\to\; \min_\theta .

От средних к шуму#

Среднее истинного апостериорного распределения всё ещё содержит x0x_0. Исключим его с помощью репараметризации (reparameterization) перехода в замкнутом виде, как в VAE:

xt=αˉt x0+1−αˉt ε,ε∼N(0,I)⟹x0=1αˉt(xt−1−αˉt ε).\begin{gathered} x_t = \sqrt{\bar\alpha_t}\, x_0 + \sqrt{1 - \bar\alpha_t}\, \varepsilon, \quad \varepsilon \sim \mathcal N(0, I) \\ \Longrightarrow\quad x_0 = \frac{1}{\sqrt{\bar\alpha_t}}\big(x_t - \sqrt{1 - \bar\alpha_t}\, \varepsilon\big). \end{gathered}

Подставим это в μ~t\tilde\mu_t. Ключевое тождество — αˉt=αtαˉt−1\bar\alpha_t = \alpha_t \bar\alpha_{t-1}, так что αˉt−1/αˉt=1/αt\sqrt{\bar\alpha_{t-1}}/\sqrt{\bar\alpha_t} = 1/\sqrt{\alpha_t}. После приведения подобных коэффициент при xtx_t равен

βtαt (1−αˉt)+αt (1−αˉt−1)1−αˉt=βt+αt−αˉtαt (1−αˉt)=1−αˉtαt (1−αˉt)=1αt,\begin{aligned} &\frac{\beta_t}{\sqrt{\alpha_t}\,(1 - \bar\alpha_t)} + \frac{\sqrt{\alpha_t}\,(1 - \bar\alpha_{t-1})}{1 - \bar\alpha_t} \\ &\quad= \frac{\beta_t + \alpha_t - \bar\alpha_t}{\sqrt{\alpha_t}\,(1 - \bar\alpha_t)} = \frac{1 - \bar\alpha_t}{\sqrt{\alpha_t}\,(1 - \bar\alpha_t)} = \frac{1}{\sqrt{\alpha_t}}, \end{aligned}

где использовано βt+αt=1\beta_t + \alpha_t = 1. Коэффициент при ε\varepsilon равен −βtαt (1−αˉt)1−αˉt=−βtαt1−αˉt-\frac{\beta_t}{\sqrt{\alpha_t}\,(1-\bar\alpha_t)}\sqrt{1 - \bar\alpha_t} = -\frac{\beta_t}{\sqrt{\alpha_t}\sqrt{1 - \bar\alpha_t}}. Следовательно,

μ~t=1αt(xt−βt1−αˉt ε).\tilde\mu_t = \frac{1}{\sqrt{\alpha_t}}\left( x_t - \frac{\beta_t}{\sqrt{1 - \bar\alpha_t}}\, \varepsilon \right).

Денойзеру (модели шумоподавления) доступны xtx_t и tt, но не ε\varepsilon. Поэтому дадим среднему модели в точности такую же форму и поручим сети предсказывать только недостающую часть — шум (Ho, Jain and Abbeel, 2020, формула 11):

μθ(xt,t)=1αt(xt−βt1−αˉt εθ(xt,t)).\mu_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}}\left( x_t - \frac{\beta_t}{\sqrt{1 - \bar\alpha_t}}\, \varepsilon_\theta(x_t, t) \right).

Теперь и μ~t\tilde\mu_t, и μθ(xt,t)\mu_\theta(x_t, t) выражены только через xtx_t и шум. В разности xtx_t сокращается, остаётся μ~t−μθ=βtαt1−αˉt(εθ−ε)\tilde\mu_t - \mu_\theta = \frac{\beta_t}{\sqrt{\alpha_t}\sqrt{1 - \bar\alpha_t}}\big(\varepsilon_\theta - \varepsilon\big), и функция потерь принимает вид

L=Eq[∑t>1βt22σt2 αt (1−αˉt)⋅∥ε−εθ(xt,t)∥2].\begin{aligned} L = \mathbb{E}_q\Bigg[ & \sum_{t > 1} \frac{\beta_t^2}{2\sigma_t^2\, \alpha_t\, (1 - \bar\alpha_t)} \\ & \cdot \big\| \varepsilon - \varepsilon_\theta(x_t, t) \big\|^2 \Bigg]. \end{aligned}

Это формула 12 из Ho, Jain and Abbeel (2020), просуммированная по tt. Здесь εθ(xt,t)\varepsilon_\theta(x_t, t) — предсказание шума сетью. Как и в случае средних, сеть не может восстановить тот конкретный ε\varepsilon, который породил xtx_t, потому что не видит x0x_0. Оптимум — εθ∗(xt,t)=E[ε∣xt]\varepsilon_\theta^*(x_t, t) = \mathbb{E}[\varepsilon \mid x_t], средний шум, согласующийся с xtx_t; это тот же оптимум, что и μθ∗\mu_\theta^*, поскольку при фиксированном xtx_t величина μ~t\tilde\mu_t — аффинная функция ε\varepsilon. Денойзер — это предсказатель шума.

Последнее упрощение: случайный шаг для каждого сэмпла#

Суммировать все T−1T - 1 членов для каждого обучающего изображения слишком дорого: это стоит T−1T - 1 вычислений сети на изображение. Вместо этого выберем случайный шаг для каждого сэмпла. Поскольку ∑t=2Tf(t)=(T−1) Et∼Uniform{2,…,T}[f(t)]\sum_{t=2}^{T} f(t) = (T - 1)\, \mathbb{E}_{t \sim \mathrm{Uniform}\{2, \dots, T\}}\big[f(t)\big], одно равномерно выбранное tt даёт несмещённую оценку суммы, делённой на T−1T - 1, а постоянный множитель не меняет точку минимума. Усредняя также по изображениям x0∼q(x0)x_0 \sim q(x_0) и шумам ε∼N(0,I)\varepsilon \sim \mathcal N(0, I) при t∼Uniform{2,…,T}t \sim \mathrm{Uniform}\{2, \dots, T\}, получаем итоговую функцию потерь

Ex0, t, ε ⁣[βt22σt2 αt (1−αˉt) ∥ε−εθ(xt,t)∥2],xt=αˉt x0+1−αˉt ε.\begin{gathered} \mathbb{E}_{x_0,\, t,\, \varepsilon}\!\left[ \frac{\beta_t^2}{2\sigma_t^2\, \alpha_t\, (1 - \bar\alpha_t)}\, \big\| \varepsilon - \varepsilon_\theta(x_t, t) \big\|^2 \right], \\ x_t = \sqrt{\bar\alpha_t}\, x_0 + \sqrt{1 - \bar\alpha_t}\, \varepsilon . \end{gathered}

Парные шаги. Оценка остаётся несмещённой, как бы ни зависели друг от друга шаги одного батча, если каждый из них по отдельности распределён равномерно. Приём снижения дисперсии из открытого кода DDIM (Song, Meng and Ermon, 2021) выбирает tt для половины батча, а второй половине даёт зеркальные шаги t′=T+1−tt' = T + 1 - t (когда tt пробегает 1,…,T1, \dots, T), тоже распределённые равномерно. Пусть f(t)f(t) — ожидаемая функция потерь на шаге tt. Зеркальная пара оценивает среднее ff с дисперсией 12[Var⁡f(t)+Cov⁡(f(t),f(t′))]\tfrac12\big[\operatorname{Var} f(t) + \operatorname{Cov}\big(f(t), f(t')\big)\big], а два независимых выбора — с дисперсией 12Var⁡f(t)\tfrac12 \operatorname{Var} f(t). Если ff монотонна по tt, то f(t)f(t) и f(T+1−t)f(T + 1 - t) меняются в противоположных направлениях, ковариация по неравенству Чебышёва для сумм (Chebyshev’s sum inequality) отрицательна, и пара выигрывает. Игрушечный пример: T=4T = 4 и f(t)=1/tf(t) = 1/t — функция потерь, наибольшая на наименее зашумлённом шаге. Два независимых выбора дают дисперсию 0.04230.0423, зеркальная пара — 0.01090.0109, примерно в 3.93.9 раза меньше. Функция потерь реальной сети на шаге монотонна по tt лишь приблизительно, поэтому выигрыш на практике проверяется только экспериментом.

Шаг обучения. Одному шагу обучения цепочка вообще не нужна: берём изображение, шаг и шум, переходим прямо к xtx_t за один скачок и решаем задачу регрессии для шума.

Рисунок

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

Поток данных в одном шаге обучения DDPMСлева три блока входов: x0 из данных, t, выбранное равномерно от 2 до T, и эпсилон из N от 0 и I. Все три подаются в блок, который вычисляет x t, равное корню из альфа с чертой t, умноженному на x0, плюс корень из 1 минус альфа с чертой t, умноженный на эпсилон. Его выход x t вместе с t поступает в синий блок сети эпсилон тета от x t и t. Предсказанный шум и истинный шум эпсилон, проведённый по нижнему краю, встречаются в блоке функции потерь: w t, умноженное на квадрат нормы эпсилон минус эпсилон тета. Функция потерь подаётся на шаг градиентного спуска по тета, который обновляет сеть. Пометка даёт w t, равное бета t в квадрате, делённому на 2 сигма t в квадрате, альфа t и 1 минус альфа с чертой t, и w t, равное 1, для L simple.x₀ ~ данныеизображениеt ~ Uniform{2, …, T}случайный шагε ~ N(0, I)гауссовский шумпрямой переход к xₜxₜ = √α̅ₜ x₀+ √(1 − α̅ₜ) εεθ(xₜ, t)сетьxₜ, twₜ ‖ε − εθ(xₜ, t)‖²предсказанный шумистинный шум εшагградиентаобновить θиз оценки: wₜ = βₜ² / (2σₜ² αₜ (1 − α̅ₜ))Lsimple и ноутбук: wₜ = 1Поток данных в одном шаге обучения DDPMСверху три блока входов: x0 из данных, t, равномерное от 2 до T, эпсилон из N от 0 и I. Они подаются в блок x t, равное корню из альфа с чертой t, умноженному на x0, плюс корень из 1 минус альфа с чертой t, умноженный на эпсилон, а он — в синий блок сети эпсилон тета от x t и t. Предсказанный шум и истинный шум эпсилон, проведённый вниз по правому краю, встречаются в блоке функции потерь: w t, умноженное на квадрат нормы эпсилон минус эпсилон тета; функция потерь подаётся на шаг градиентного спуска, который обновляет сеть. Пометки дают вес из оценки и w t, равное 1, для L simple.x₀ ~ данныеизображениеt ~ U{2…T}шагε ~ N(0, I)шумпрямой переход к xₜxₜ = √α̅ₜ x₀ + √(1 − α̅ₜ) εεθ(xₜ, t)сетьxₜ, twₜ ‖ε − εθ(xₜ, t)‖²предсказанный шумистинныйшум εшаг градиентаобновить θиз оценки: wₜ = βₜ² / (2σₜ² αₜ (1 − α̅ₜ))Lsimple и ноутбук: wₜ = 1
На каждом шаге обучения сэмплируются изображение x₀, случайный шаг t и шум ε, затем выполняется переход прямо к xₜ по формуле в замкнутом виде, сеть выдаёт свою оценку шума εθ(xₜ, t), и делается шаг градиентного спуска по взвешенной квадратичной ошибке. Целевая функция, выведенная из оценки, сохраняет вес wₜ; невзвешенная упрощённая функция потерь DDPM и ноутбук курса полагают wₜ = 1 (и сэмплируют t от 1 до T).

Отбрасывание веса — сознательное перевзвешивание, а не косметическое изменение. При линейном расписании из статьи (T=1000T = 1000, βt\beta_t от 10−410^{-4} до 0.020.02) и σt2=βt\sigma_t^2 = \beta_t вес упрощается до βt/(2αt(1−αˉt))\beta_t / (2\alpha_t(1 - \bar\alpha_t)). Он равен 0.2730.273 при t=2t = 2, падает до минимума 0.00500.0050 при t=349t = 349 и снова растёт до 0.01020.0102 при t=Tt = T. Истинная оценка придаёт шагу t=2t = 2 примерно в 5555 раз больший вес, чем шагу в минимуме. LsimpleL_{\text{simple}} взвешивает все шаги одинаково, что смещает усилия к более трудным, более зашумлённым шагам. Ho et al. обнаружили, что это даёт лучшие сэмплы ценой немного худшего правдоподобия (§3.4 и таблица 1: FID 3.17 против 13.51 для истинной оценки, но 3.753.75 против 3.703.70 бита на размерность).

Рисунок

Вес из оценки отдаёт предпочтение почти чистым шагам

Вес функции потерь в зависимости от шагаДвойной логарифмический график веса w t в зависимости от t от 1 до 1000. Синяя кривая для сигма в квадрате, равного бета t, начинается с 0.273 при t, равном 2, круто падает, достигает минимума 0.0050 при t, равном 349, и растёт до 0.0102 при t, равном 1000. Штриховая серая кривая для сигма в квадрате, равного бета с тильдой t, начинается выше, с 0.600, и сливается с синей кривой за несколько десятков шагов. Горизонтальная зелёная линия на уровне 1 обозначает упрощённую функцию потерь.0.0050.010.050.10.511251020501002005001000t (лог. шкала)вес wₜ (лог. шкала)Lsimple: wₜ = 10.273мин. 0.0050 при t = 3490.0102σₜ² = βₜσₜ² = β̃t (штриховая)Вес функции потерь в зависимости от шагаДвойной логарифмический график веса w t в зависимости от t от 1 до 1000. Синяя кривая для сигма в квадрате, равного бета t, начинается с 0.273 при t, равном 2, круто падает, достигает минимума 0.0050 при t, равном 349, и растёт до 0.0102 при t, равном 1000. Штриховая серая кривая для сигма в квадрате, равного бета с тильдой t, начинается выше, с 0.600, и сливается с синей кривой за несколько десятков шагов. Горизонтальная зелёная линия на уровне 1 обозначает упрощённую функцию потерь.0.0050.010.111101001000t (лог. шкала)вес wₜ (лог. шкала)Lsimple: wₜ = 10.273мин. 0.0050 при t = 3490.0102σₜ² = βₜσₜ² = β̃t (штриховая)
Вес wₜ = βₜ² / (2σₜ² αₜ (1 − ᾱₜ)) взвешенной функции потерь предсказания шума для линейного расписания (T = 1000, β от 10⁻⁴ до 0.02); обе оси логарифмические. При σₜ² = βₜ он равен 0.273 при t = 2, достигает минимума 0.0050 при t = 349 и заканчивается на 0.0102. Если σₜ² равна дисперсии истинного апостериорного распределения (штриховая линия), вес всегда больше: он умножается на отношение двух дисперсий (при t = 2 он равен 0.600), но разница важна только для первых нескольких десятков шагов. Упрощённая функция потерь DDPM использует wₜ = 1 для каждого шага (важна только относительная форма весов), поэтому по сравнению с оценкой она смещает вес к более зашумлённым шагам.

Сэмплирование: цепочка в обратном направлении#

При обучении цепочка не запускается, а при генерации — запускается. Начнём с чистого шума xT∼N(0,I)x_T \sim \mathcal N(0, I) и применим выученный обратный шаг TT раз. Каждый шаг сэмплирует из pθ(xt−1∣xt)=N(μθ(xt,t),σt2I)p_\theta(x_{t-1} \mid x_t) = \mathcal N(\mu_\theta(x_t, t), \sigma_t^2 I), используя выведенную выше форму среднего через шум, с новым шумом z∼N(0,I)z \sim \mathcal N(0, I) при t>1t > 1 и z=0z = 0 при t=1t = 1 (Ho, Jain and Abbeel, 2020, алгоритм 2):

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

Каждый шаг вычитает оценку шума, полученную сетью, масштабирует результат и добавляет немного нового шума; последний шаг возвращает среднее без дополнительного шума. Поэтому генерация стоит TT вычислений сети, по одному на шаг, и это главный практический недостаток DDPM. Более поздние сэмплеры, например DDIM (Song, Meng and Ermon, 2021), используют тот же обученный εθ\varepsilon_\theta с гораздо меньшим числом шагов.

Сеть шумоподавления#

В выводе εθ(xt,t)\varepsilon_\theta(x_t, t) рассматривается как функция двух аргументов. На практике это одна сеть для всех шагов — U-Net, которая получает шаг в виде эмбеддинга, прибавляемого внутри каждого блока.

Рисунок

Денойзер DDPM: U-Net, получающая на вход шаг t

U-Net денойзера DDPM с эмбеддингом шагаСлева x_t входит в энкодер из трёх блоков 32 на 32, 16 на 16 с вниманием и 8 на 8, спускающихся к среднему блоку 4 на 4; справа декодер поднимается через 8 на 8, 16 на 16 и 32 на 32 к выходу эпсилон тета. Пунктирные обходные связи соединяют блоки одного разрешения. Внизу шаг t превращается в синусоидальный код e(t), MLP даёт m(t), и жёлтая шина со стрелками ведёт его в каждый блок.xt3 × 32 × 3232 × 3216 × 16+ внимание8 × 84 × 4te(t)sin, cosMLPm(t)в каждый блок: + Aₖ m(t)32 × 3216 × 16+ внимание8 × 8обходная связьεθ3 × 32 × 32‖ε − εθ‖²12345входсостояниевеса и гейтывыходU-Net денойзера DDPM с эмбеддингом шагаЛевая колонка: x_t и энкодер из блоков 32 на 32, 16 на 16 с вниманием и 8 на 8 сверху вниз, затем средний блок 4 на 4. Правая колонка: декодер снизу вверх и выход эпсилон тета. Короткие пунктирные обходные связи соединяют колонки. Внизу t, код e(t) и MLP; жёлтая шина обходит рисунок и подводит m(t) к каждому блоку.xt32 × 3216 × 16+ внимание8 × 84 × 4te(t)sin, cosMLPm(t)+ Aₖ m(t)32 × 3216 × 16+ внимание8 × 8обходεθ‖ε − εθ‖²12345входсостояниевеса и гейтывыход
Сеть шумоподавления DDPM для изображений 32 × 32 в цветах рисунков о последовательностях: входы зелёные, внутренние состояния синие, обучаемые отображения жёлтые, выход красный. Энкодер (слева) уровень за уровнем вдвое уменьшает разрешение, от 32 × 32 до 4 × 4, декодер (справа) возвращает его; пунктирные обходные связи соединяют уровни одного размера. Шаг t входит через синусоидальный код и MLP, и его проекция прибавляется в каждом блоке. Каждый прямоугольник обозначает два остаточных блока; модель DDPM такой формы для CIFAR-10 имеет 35.7 млн параметров.
  1. Зашумлённое изображение xtx_t входит в энкодер. Каждый уровень вдвое уменьшает разрешение; на 16×1616 \times 16 DDPM добавляет self-attention.
  2. Шаг tt превращается в вектор синусов и косинусов e(t)e(t).
  3. Небольшой MLP переводит e(t)e(t) в m(t)m(t), и каждый остаточный блок прибавляет к своим каналам свою линейную проекцию Ak m(t)A_k\,m(t).
  4. Декодер уровень за уровнем вдвое увеличивает разрешение; обходные связи (skip connections) приносят признаки энкодера того же размера.
  5. Выход εθ(xt,t)\varepsilon_\theta(x_t, t) имеет форму xtx_t и сравнивается с истинным шумом ε\varepsilon.

Одна сеть для всех шагов#

Отдельная сеть для каждого шага означала бы T=1000T = 1000 сетей, каждая из которых обучалась бы на тысячной доле обновлений. Соседние шаги решают почти одну и ту же задачу: xt−1x_{t-1} и xtx_t отличаются одним малым шагом: умножением на 1−βt≥0.99\sqrt{1 - \beta_t} \ge 0.99 и шумом с дисперсией βt≤0.02\beta_t \le 0.02. Поэтому DDPM разделяет параметры между шагами и сообщает сети, на каком шаге она находится (Ho, Jain and Abbeel, 2020, §4). Шаг нужен потому, что один и тот же вход требует разных выходов при разных уровнях шума.

Пример. Для данных N(0,0.52)\mathcal N(0, 0.5^2) в одном измерении ε\varepsilon и xtx_t совместно гауссовские с ковариацией 1−αˉt\sqrt{1 - \bar\alpha_t}, поэтому оптимальное предсказание равно

E[ε∣xt]=1−αˉt0.25 αˉt+1−αˉt xt.\mathbb E[\varepsilon \mid x_t] = \frac{\sqrt{1 - \bar\alpha_t}}{0.25\,\bar\alpha_t + 1 - \bar\alpha_t}\, x_t .

При линейном расписании и xt=1x_t = 1 оно равно 0.170.17 при t=10t = 10 (αˉt=0.998\bar\alpha_t = 0.998), где xtx_t — в основном изображение, и 1.021.02 при t=500t = 500 (αˉt=0.079\bar\alpha_t = 0.079), где xtx_t — в основном шум.

U-Net#

Выход εθ(xt,t)\varepsilon_\theta(x_t, t) имеет форму входа — одно значение шума на каждый пиксель и канал, — так что сеть решает задачу плотного предсказания (dense prediction), как при сегментации. Чтобы отличить шум от детали изображения в одном пикселе, ей нужен контекст издалека и точность в самом пикселе. U-Net (Ronneberger, Fischer and Brox, 2015) даёт и то и другое. Энкодер уровень за уровнем вдвое уменьшает разрешение, так что грубые уровни видят всё изображение; декодер вдвое увеличивает его обратно; а обходные связи передают признаки энкодера на каждом разрешении уровню декодера того же размера, где они конкатенируются с признаками после повышения разрешения, так что мелкие детали доходят до выхода. Сети score, зависящие от уровня шума (noise-conditional score networks), используют вариант U-Net по той же причине (Song and Ermon, 2019, §4.1 и прил. A.3).

Сеть DDPM (Ho, Jain and Abbeel, 2020, приложение B):

  • базовая сеть (backbone) немаскированной PixelCNN++ — U-Net из остаточных блоков Wide ResNet;
  • групповая нормализация (group normalization; Wu and He, 2018) вместо нормализации весов (weight normalization): статистики считаются по группам каналов внутри одного изображения и поэтому, в отличие от батч-нормализации, не зависят от других изображений батча;
  • четыре разрешения карт признаков для изображений 32×3232 \times 32 (от 32×3232 \times 32 до 4×44 \times 4) и шесть для 256×256256 \times 256, по два остаточных блока на разрешение;
  • self-attention на разрешении 16×1616 \times 16, между свёрточными блоками;
  • шаг, который прибавляется в каждом остаточном блоке через синусоидальный эмбеддинг из трансформера;
  • 35.7 млн параметров для CIFAR-10, 114 млн для LSUN и CelebA-HQ при 256×256256 \times 256 и около 256 млн для более крупного варианта модели для LSUN Bedroom.

Как сообщить сети шаг#

DDPM кодирует tt так же, как трансформер кодирует позицию (позиционное кодирование):

e(t)2i=sin⁡(ωit),e(t)2i+1=cos⁡(ωit),ωi=10000−2i/d,i=0,…,d/2−1.\begin{gathered} e(t)_{2i} = \sin(\omega_i t), \qquad e(t)_{2i+1} = \cos(\omega_i t), \\ \omega_i = 10000^{-2i/d}, \qquad i = 0, \dots, d/2 - 1 . \end{gathered}

Небольшой MLP превращает код в вектор признаков, m(t)=W2 SiLU(W1 e(t))m(t) = W_2\,\mathrm{SiLU}(W_1\, e(t)) с SiLU(z)=z⋅sigmoid(z)\mathrm{SiLU}(z) = z \cdot \mathrm{sigmoid}(z), а у каждого остаточного блока kk есть своё линейное отображение AkA_k в его число каналов CkC_k. Результат прибавляется к картам признаков блока как одно смещение на канал, одинаковое во всех пикселях:

hk[c,i,j]  ←  hk[c,i,j]+(Ak m(t))c.h_k[c, i, j] \;\leftarrow\; h_k[c, i, j] + \big(A_k\, m(t)\big)_c .

Почему бы не подать tt просто числом? Скаляр входит в первый слой как ещё один вход, и сети приходится строить из него всю зависимость от tt. Синусоидальный код — вектор, компоненты которого вращаются со скоростями от 11 до примерно 10−410^{-4} радиана за шаг, поэтому их линейные комбинации могут следить и за быстрыми, и за медленными изменениями tt, а близкие шаги получают близкие коды. Порядок компонент — вперемешку или сначала все синусы — не важен: следующий слой линеен и может переставить свои входы.

Другие способы сообщить сети шаг или другое условие:

  • Масштаб и сдвиг. Эмбеддинг задаёт масштаб и сдвиг для каждого канала после нормализации, h←ys(t)⊙GroupNorm(h)+yb(t)h \leftarrow y_s(t) \odot \mathrm{GroupNorm}(h) + y_b(t): адаптивная групповая нормализация (adaptive group normalization; Dhariwal and Nichol, 2021, §3.1). Это диффузионный аналог адаптивной нормализации по экземпляру (adaptive instance normalization, AdaIN), с помощью которой StyleGAN вводит свой вектор стиля (Karras, Laine and Aila, 2019, формула 1). На ImageNet 128×128128 \times 128 она улучшила FID с 15.0815.08 (сложение и затем групповая нормализация, как в DDPM) до 13.0613.06 (их таблица 3). Сети score, зависящие от уровня шума, используют ту же идею с одним обучаемым масштабом и сдвигом на каждый уровень шума (заметка о score matching).
  • Дополнительный входной канал. Добавить к изображению t/Tt/T как постоянный канал. Это самый простой вариант, но шаг тогда входит только в первую свёртку, и его приходится проносить через все последующие слои.
  • Обучаемый вектор на каждый шаг. Таблица с одним обучаемым вектором на шаг, который прибавляется к скрытому слою или умножается на него, работает для небольших сетей и коротких цепочек. Но у TT векторов нет ничего общего: каждый обучается только на примерах, выпавших на его шаг.
  • Другие условия. Метку класса или усреднённый (pooled) эмбеддинг текста можно спроецировать в размерность эмбеддинга шага и прибавить к нему, как это делает Imagen (Saharia et al., 2022, §2.5); целая последовательность текстовых векторов входит через перекрёстное внимание (cross-attention; латентная диффузия).

Почему пиксели масштабируют в [−1, 1]#

DDPM линейно отображает значения пикселей 0,…,2550, \dots, 255 в [−1,1][-1, 1], чтобы обратный процесс работал со входами согласованного масштаба, начиная со стандартного нормального априорного распределения (Ho, Jain and Abbeel, 2020, §3.3). Это важно по трём причинам:

  1. Цепочка должна заканчиваться в априорном распределении. Прямой процесс убирает изображение только сжатием, xT=αˉT x0+1−αˉT εx_T = \sqrt{\bar\alpha_T}\,x_0 + \sqrt{1 - \bar\alpha_T}\,\varepsilon, и при расписании DDPM αˉT=0.0064\sqrt{\bar\alpha_T} = 0.0064. Для значений в [−1,1][-1, 1] остаток изображения не больше 0.00640.0064 — пренебрежимо мало рядом с шумом со стандартным отклонением 11. Для исходных значений в [0,255][0, 255] он доходил бы до 1.61.6: в xTx_T всё ещё было бы видно изображение, и сэмплирование из N(0,I)\mathcal N(0, I) начиналось бы не с того распределения.
  2. Каждый шаг видит входы одного размера. По рекуррентному соотношению для дисперсии Var⁡(xt)=αˉtVar⁡(x0)+1−αˉt\operatorname{Var}(x_t) = \bar\alpha_t \operatorname{Var}(x_0) + 1 - \bar\alpha_t, и эта величина лежит между Var⁡(x0)\operatorname{Var}(x_0) и 11, если Var⁡(x0)≤1\operatorname{Var}(x_0) \le 1, что гарантируют значения в [−1,1][-1, 1]. Тогда одна сеть может служить всем шагам; для исходных значений пикселей дисперсия падала бы вдоль цепочки от тысяч до 11.
  3. Данные центрированы, как и априорное распределение, а у дискретизированного декодера интервалы шириной 2/2552/255 и открытые крайние интервалы у ±1\pm 1.

Чтобы показать изображение, xx отображают обратно по формуле 255 (x+1)/2255\,(x + 1)/2 после обрезки до [−1,1][-1, 1]. Зашумлённые состояния выходят за этот интервал постоянно: пиксель с x0=0.9x_0 = 0.9 на шаге с αˉt=0.5\bar\alpha_t = 0.5 имеет xt∼N(0.64, 0.5)x_t \sim \mathcal N(0.64,\ 0.5) и выходит за [−1,1][-1, 1] с вероятностью 0.310.31. Без обрезки преобразование в 8-битные целые превращает такие значения в неправильные цвета.

Обучение на практике: усреднённые веса и обрезанные градиенты#

В циклах обучения диффузионных моделей распространены два стабилизатора.

Экспоненциальное скользящее среднее весов (exponential moving average, EMA). Будем хранить вторую копию параметров θˉ\bar\theta и обновлять её после каждого шага оптимизатора:

θˉ  ←  μ θˉ+(1−μ) θ.\bar\theta \;\leftarrow\; \mu\, \bar\theta + (1 - \mu)\, \theta .

Если развернуть это обновление на nn шагов, θˉ\bar\theta окажется взвешенным средним прошлых значений параметров с весами (1−μ) μn−k(1 - \mu)\,\mu^{n-k} плюс начальное значение с множителем μn\mu^n: примерно средним по последним 1/(1−μ)1/(1 - \mu) шагам. Обучение продолжается с θ\theta; сэмплы генерируются с θˉ\bar\theta. Причина — шум градиента: каждый пример приносит своё изображение, шаг и шум, поэтому значения θ\theta дрожат вокруг хорошей области, а их среднее лежит ближе к её центру. DDPM использует μ=0.9999\mu = 0.9999 (приложение B) — среднее примерно по 10 00010\,000 шагам. Nichol and Dhariwal (2021) перебрали этот коэффициент для модели, получающей метку класса, на ImageNet 64×6464 \times 64 и нашли лучшими 0.99990.9999 и 0.999950.99995 (их рисунок 17). Разобранный пример: начальное значение сохраняет вес μn\mu^n, равный 0.999910 000=0.370.9999^{10\,000} = 0.37 через десять тысяч шагов и 0.999950 000=0.00670.9999^{50\,000} = 0.0067 через пятьдесят тысяч. Поэтому усреднёнными весами имеет смысл пользоваться, только когда обучение длится в несколько раз дольше окна усреднения. При μ=0.9\mu = 0.9 окно — около 1010 шагов, слишком мало, чтобы что-то заметно усреднить.

Обрезка градиентов (gradient clipping). Перед каждым шагом градиент gg масштабируют, если его норма превышает порог cc: g←g⋅min⁡(1,c/∥g∥)g \leftarrow g \cdot \min(1, c/\lVert g\rVert) (заметка об обучении сетей). Направление сохраняется, а укорачиваются только редкие большие градиенты: при c=1c = 1 градиент нормы 44 делится на 44, а градиент нормы 0.50.5 остаётся как есть. Функция потерь батча зависит от того, какие шаги в него попали, и обрезка не даёт необычному батчу далеко сдвинуть веса.

Настройки DDPM (приложение B): Adam с шагом обучения 2×10−42 \times 10^{-4} (2×10−52 \times 10^{-5} при 256×256256 \times 256), размер батча 128 для CIFAR-10 и 64 для более крупных изображений, дропаут (dropout) 0.10.1 на CIFAR-10 и без дропаута на остальных наборах, случайные горизонтальные отражения, коэффициент EMA 0.99990.9999 и T=1000T = 1000. Модель для CIFAR-10 обучалась 800K шагов со скоростью 21 шаг в секунду на TPU v3-8, около 10.6 часа; сэмплирование батча из 256 изображений заняло 17 секунд.

Сводка: от правдоподобия к одному шагу обучения#

  1. Оценка. −log⁡pθ(x0)-\log p_\theta(x_0) не больше отрицательной ELBO; зазор — KL-дивергенция, поэтому уменьшение оценки само по себе не уменьшает отрицательный логарифм правдоподобия.
  2. Апостериорные цели. Оценка распадается на KL-члены, которые сравнивают каждый обратный шаг pθ(xt−1∣xt)p_\theta(x_{t-1} \mid x_t) с гауссовским истинным апостериорным распределением q(xt−1∣xt,x0)q(x_{t-1} \mid x_t, x_0), среднее которого μ~t\tilde\mu_t известно в явном виде.
  3. Взвешенная функция потерь на шуме. При фиксированных дисперсиях каждый KL-член — это L2-расстояние между средними плюс константа, а если записать μθ\mu_\theta через предсказатель шума, он становится βt22σt2 αt (1−αˉt) ∥ε−εθ(xt,t)∥2\frac{\beta_t^2}{2\sigma_t^2\, \alpha_t\, (1 - \bar\alpha_t)}\, \lVert \varepsilon - \varepsilon_\theta(x_t, t) \rVert^2.
  4. Перевзвешивание. LsimpleL_{\text{simple}} отбрасывает этот вес. Это другая цель, а не оценка: она смещает усилия к более шумным шагам и даёт лучшие сэмплы ценой немного худшего правдоподобия.
  5. Один шаг обучения. Сэмплируем x0x_0, tt и ε\varepsilon, строим xt=αˉt x0+1−αˉt εx_t = \sqrt{\bar\alpha_t}\, x_0 + \sqrt{1 - \bar\alpha_t}\, \varepsilon и делаем градиентный шаг по ∥ε−εθ(xt,t)∥2\lVert \varepsilon - \varepsilon_\theta(x_t, t) \rVert^2.
  6. Сэмплирование. Из xT∼N(0,I)x_T \sim \mathcal N(0, I) применяем xt−1=μθ(xt,t)+σtzx_{t-1} = \mu_\theta(x_t, t) + \sigma_t z для t=T,…,1t = T, \dots, 1, без шума на последнем шаге.

Ноутбук#

Ноутбук по диффузионным моделям из репозитория HSE-LAMBDA Deep Generative Models (ссылка закреплена на конкретном коммите; ячейки нумеруются с 1, считая все ячейки подряд, включая текстовые; сохранённых выходов ячеек нет) обучает две версии обратного процесса на двумерном «швейцарском рулете» (Swiss roll) из 10 000 точек с T=100T = 100 и сигмоидным расписанием от 10−510^{-5} до 10−210^{-2} (β1≈3.5×10−5\beta_1 \approx 3.5 \times 10^{-5}, β100≈1.0×10−2\beta_{100} \approx 1.0 \times 10^{-2}). Индексы в коде начинаются с 0, поэтому шаг кода t = 0 соответствует t=1t = 1 в формулах.

  • Ячейки 17–18 (повторены в ячейке 37): истинное апостериорное распределение. q_posterior_mean_variance использует коэффициенты βtαˉt−1/(1−αˉt)\beta_t\sqrt{\bar\alpha_{t-1}}/(1-\bar\alpha_t) и (1−αˉt−1)αt/(1−αˉt)(1-\bar\alpha_{t-1})\sqrt{\alpha_t}/(1-\bar\alpha_t) и дисперсию β~t\tilde\beta_t, как в выводе выше. На шаге кода t = 0 дисперсия равна β~1=0\tilde\beta_1 = 0 — это вырожденный случай замкнутого вида, и «обрезанный» (clipped) логарифм дисперсии всё равно берёт log⁡0=−∞\log 0 = -\infty. В loss_likelihood_bound (ячейка 31) из-за этого KL-дивергенция становится бесконечной всякий раз, когда в батч попадает шаг кода t = 0, так что функция потерь, которую печатает ячейка 33, может быть равна inf; градиенты остаются конечными, потому что бесконечная часть не зависит от θ\theta. Этого можно избежать, если взять β~2\tilde\beta_2 в качестве первого элемента.
  • Ячейки 19–24: исходная диффузионная модель Sohl-Dickstein et al. Одна сеть служит всем шагам и предсказывает среднее и логарифм дисперсии. Её слои ConditionalLinear умножают выход линейного слоя на обучаемый вектор своего шага, γt⊙(Wh+b)\gamma_t \odot (W h + b), где γ\gamma — nn.Embedding(n_steps, 128), инициализированный равномерно на [0,1][0, 1]: это обучаемый вектор на каждый шаг, а не синусоидальный код. p_sample и p_sample_loop запускают обратную цепочку.
  • Ячейки 25–29: оценка. Ячейка 26 записывает оценку как сумму логарифмов отношений по шагам из первой врезки. Затем ячейка 27 даёт ещё две формы, и обе не вполне верны: первая (априорный член, все TT KL-членов и одна энтропия прямого процесса) не совпадает со стандартной оценкой, а вторая берёт энтропийные члены формы 2015 года со знаками, которые у них в KK — нижней оценке логарифма правдоподобия, — и ставит их в функцию потерь, которая должна равняться −K-K, рядом с лишним априорным членом. normal_kl (ячейка 28) — KL-дивергенция между диагональными гауссианами, а entropy — энтропия гауссианы 12(1+ln⁡2π)+12ln⁡σ2\tfrac12(1 + \ln 2\pi) + \tfrac12\ln\sigma^2 на одну размерность. compute_loss (ячейка 29) берёт знаки правильно: она возвращает (T⋅KL+Hq(X1∣X0)−Hq(XT∣X0)+Hp(XT)−HN(0,1))/ln⁡2\big(T \cdot \mathrm{KL} + H_q(X_1 \mid X_0) - H_q(X_T \mid X_0) + H_p(X_T) - H_{\mathcal N(0,1)}\big)/\ln 2, усреднённое по батчу и двум координатам, — оценку −K-K по одному шагу минус энтропия стандартной гауссианы, в битах на размерность, то есть −(K−Lnull)-(K - L_{\text{null}}) у Sohl-Dickstein. Множитель TT масштабирует один случайный шаг до суммы, в которой в оценке T−1T - 1 членов (t=2,…,Tt = 2, \dots, T) и нет шага кода t = 0.
  • Ячейки 30–33: обучение на случайных шагах. Ячейка 30 объясняет зеркальные шаги на примере t=5↔94t = 5 \leftrightarrow 94 в индексах кода (t=6↔95t = 6 \leftrightarrow 95 в формулах): loss_likelihood_bound выбирает 65 шагов, добавляет к ним парные n_steps - t - 1 и оставляет 128. Цикл в ячейке 33 использует Adam с шагом обучения 10−310^{-3}, батчи по 128 (79 на один проход по 10 000 точек), 5001 проход и обрезает норму градиента на 1.01.0.
  • Ячейки 34–36: DDPM. ConditionalModelDDPM (три слоя ConditionalLinear) предсказывает шум, а p_sample_ddpm реализует описанный выше шаг сэмплирования с σt=βt\sigma_t = \sqrt{\beta_t}. Эта функция добавляет новый шум на каждом шаге, включая последний, где алгоритм 2 шума не добавляет. В тексте ячейки 34 сказано, что обычно предпочитают β~t\tilde\beta_t за лучшие результаты; Ho et al. получили с обоими вариантами похожие результаты (§3.2).
  • Ячейки 38–41: вариационная функция потерь с дискретизированным декодером на первом шаге. Ячейка 38 даёт KL-дивергенцию между гауссианами с полными ковариационными матрицами. discretized_gaussian_log_likelihood (ячейка 39) реализует формулу 13, приближая Φ\Phi функцией 12(1+tanh⁡(2/π (x+0.044715 x3)))\tfrac12\big(1 + \tanh\big(\sqrt{2/\pi}\,(x + 0.044715\,x^3)\big)\big) (наибольшая ошибка 1.8×10−41.8 \times 10^{-4}) и применяя открытые крайние интервалы при x<−0.999x < -0.999 и x>0.999x > 0.999. loss_variational (ячейка 41) усредняет KL-дивергенцию и член декодера по размерностям и делит на ln⁡2\ln 2, получая биты на размерность, а член декодера для шага кода t = 0 выбирает через torch.where. Эта функция потерь приведена для иллюстрации и никогда не обучается. В нынешнем виде она вызывает p_mean_variance с глобальной model — сетью из ячейки 33, предсказывающей среднее и дисперсию, — поскольку модель DDPM возвращает только оценку шума. Кроме того, декодер предполагает 8-битные пиксели в [−1,1][-1, 1], а «швейцарский рулет» непрерывен, и примерно у 31% его точек есть координата вне [−1,1][-1, 1], где правило для крайних интервалов приписывает им целый хвост распределения.
  • Ячейки 42–43: noise_estimation_loss, невзвешенная LsimpleL_{\text{simple}}, (noise - predicted_noise).square().mean(), с теми же зеркальными шагами. В тексте ячейки 42 LsimpleL_{\text{simple}} названа прямой минимизацией KL-членов; как показано выше, она их перевзвешивает.
  • Ячейки 44–48: скользящее среднее весов и цикл обучения DDPM (Adam 10−310^{-3}, батч 128, 1000 проходов, норма градиента обрезается на 1.01.0). По умолчанию в классе EMA μ=0.999\mu = 0.999, но цикл использует μ=0.9\mu = 0.9 — окно примерно в 10 обновлений, короче одного прохода по данным. apply_shadow скопировал бы θˉ\bar\theta в модель, но нигде не вызывается, так что сэмплирование идёт с необработанными весами. Ячейки с графиками (33 и 48) показывают x_seq[10*j] — обратную цепочку после 10j10j шагов (от x90x_{90} до итогового сэмпла), но подписывают панели как q(x100j)q(x_{100j}): неверный масштаб, неверное направление и qq вместо pθp_\theta.

Ноутбук с домашним заданием 04_hw_diffusion из того же репозитория (нумерация ячеек та же) обучает DDPM на фотографиях лиц CelebA размером 32×3232 \times 32. Большая часть его кода — шаблон с пропусками для заполнения, но в нём сохранены выходы ячеек эталонного запуска на GPU Tesla T4; числа ниже взяты из этих выходов.

  • Ячейки 9–11: данные. Батчи по 128 изображений, нормированных в [−1,1][-1, 1], как выше. Ячейка 10 печатает форму изображения 3×64×643 \times 64 \times 64, хотя image_size = 32, а сетки в ячейках 11 и 26 показывают изображения 32×3232 \times 32: сохранённые выходы получены в разных запусках.
  • Ячейки 13–14 повторяют прямой процесс, среднее через предсказание шума, два варианта σt2=βt\sigma_t^2 = \beta_t или β~t\tilde\beta_t и алгоритмы 1 и 2 и называют в качестве сети U-Net или Efficient U-Net из Imagen. Efficient U-Net была разработана для ступеней сверхразрешения (super-resolution) в Imagen: она переносит параметры в блоки низкого разрешения, масштабирует обходные связи на 1/21/\sqrt2 и меняет порядок операций понижения и повышения разрешения, чтобы ускорить прямой проход (Saharia et al., 2022, прил. B.1).
  • Ячейка 16: класс DDPM хранит расписание (n_steps, min_beta, max_beta, оставлены пустыми), forward получает xtx_t из x0x_0 за один шаг, а backward вызывает сеть, чтобы получить εθ(xt,t)\varepsilon_\theta(x_t, t).
  • Ячейки 18–19. show_forward зашумляет батч до 25, 50, 75 и 100% от TT. generate_new_images выполняет алгоритм 2, начиная с xT∼N(0,I)x_T \sim \mathcal N(0, I), добавляет шум, только пока шаг кода t > 0, то есть не на последнем шаге, как и предписывает алгоритм 2, и записывает цепочку в GIF.
  • Ячейки 20–21: U-Net. Текстовая ячейка перечисляет варианты подачи tt (AdaIN, как в StyleGAN, дополнительный канал, синусоидальное кодирование) и выбирает синусоидальное, добавляя, что так же можно прибавлять спроецированный эмбеддинг текста (здесь не используется). sinusoidal_embedding(n, d) заполняет замороженную таблицу nn.Embedding значениями d=100d = 100 синусов и косинусов для каждого из n=1000n = 1000 шагов. _make_te — MLP вида Linear–SiLU–Linear, который переводит код в число каналов блока; forward прибавляет выход te1 к входному изображению, а блоки, оставленные пустыми, могут делать то же со своими отображениями _make_te.
  • Ячейки 22–23: у эталонной модели 650 430 параметров; в это число входит замороженная таблица эмбеддингов.
  • Ячейки 26–27: сетки прямого процесса на 25–100% от TT и 16 сэмплов необученной сети, которые представляют собой шум.
  • Ячейки 29–31: обучение. training_loop реализует алгоритм 1 с nn.MSELoss, то есть LsimpleL_{\text{simple}}, и сохраняет чекпоинт с наименьшей за эпоху функцией потерь на обучении. В сохранённом журнале 1272 батча по 128 на эпоху, что согласуется со 162 770 изображениями обучающей части CelebA. Функция потерь упала с 0.0370.037 после эпохи 1 до 0.0330.033 после эпохи 16; планировалось 200 эпох, а журнал обрывается в начале эпохи 17.
  • Ячейки 33–36 загружают лучший чекпоинт и генерируют 100 лиц в GIF; сохранённых сэмплов нет.

Проблемы:

  • show_images (ячейка 7) отображает xx в 255 (x+1)/2255\,(x + 1)/2 и приводит к uint8 без обрезки. Зашумлённые изображения выходят за [−1,1][-1, 1], поэтому сетки прямого процесса в ячейке 26 уже на 25% от TT показывают насыщенные, похожие на шум цвета; перед приведением типа нужно обрезать значения до [−1,1][-1, 1]. Сколько осталось бы от лица, зависит от расписания, которое шаблон оставляет пустым; при линейном расписании DDPM αˉ250=0.52\bar\alpha_{250} = 0.52, так что на 25% остаётся больше половины дисперсии сигнала.
  • Класс набора данных в ячейке 10 возвращает изображения без меток, так что батч из загрузчика — тензор изображений, и batch[0] в show_first_batch, show_forward и training_loop выбирает первое изображение вместо батча. Шаблон взят от набора данных, который возвращает пары (изображение, метка); с этим набором нужно использовать сам батч.
  • Ячейка 33 заново создаёт модель как DDPM(UNet(), n_steps=n_steps, device=device): min_beta и max_beta не передаются, поэтому используются значения по умолчанию из класса, а UNet() берёт свои 1000 шагов по умолчанию. Расписание, отличное от значений по умолчанию, придётся снова передать вручную.
  • sinusoidal_embedding вычисляет dd частот wk=10000−2k/dw_k = 10000^{-2k/d}, k=0,…,d−1k = 0, \dots, d - 1, но заполняет только dd значений. Кодирование из трансформера использует первые d/2d/2 частот, каждую один раз в синусе и один раз в косинусе. Если же брать косинусы от второй половины частот, получаются частоты не больше 10−410^{-4}, для которых cos⁡(wkt)≥0.995\cos(w_k t) \ge 0.995 при всех t≤1000t \le 1000: эти компоненты почти не меняются.

Дальше#

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

Литература#