Диффузионная модель учит обращать не один огромный прыжок от шума к
изображению, а длинную последовательность малых поправок. Прямой процесс —
порча картинки шумом — известен точно и не требует обучения. Сеть приближает
единственную неизвестную вещь: какой именно шум был подмешан. Из этой
скромной задачи вырастает генерация.
Испортить легко, восстановить трудно — но по частям
Возьмите фотографию и подмешайте к ней немного гауссова шума. Ещё немного.
Через тысячу таких подмешиваний от снимка не останется ничего: на экране
серое зерно, неотличимое от случайных чисел. Порча — процесс тривиальный, его
можно запрограммировать за пять минут, и он не содержит ни одного обучаемого
параметра.
Теперь попробуйте пройти путь обратно. Задача «по чистому шуму выдать
фотографию» безнадёжна: правдоподобных ответов бесконечно много, и любая
модель, обученная по среднеквадратичной ошибке, выдаст их среднее — размытое
пятно. Но задача «по чуть-чуть испорченной фотографии убрать это чуть-чуть»
решается прекрасно, потому что ответ почти единственный.
Идея диффузионной модели ровно в этом разрыве: разложить невозможный прыжок на
тысячу возможных шажков. Каждый шаг — маленькое удаление шума; вся цепочка —
генерация.
Работать будем на реальных данных, где всё можно посчитать до последней цифры:
на наборе рукописных цифр load_digits из sklearn — 1797 картинок
8×8, то есть векторов из 64 чисел. Мы отложили 1400 картинок в
обучающую часть и 397 в тестовую, а яркости перевели в отрезок [−1,1].
Маленький размер — не бедность, а роскошь: он позволяет выписать точный
оптимальный шумоподавитель и увидеть механику диффузии без единой недоученной
сети.
Прямой процесс: порча по расписанию
Пусть x0 — изображение. На шаге t к нему подмешивается гауссов шум:
q(xt∣xt−1)=N(1−βtxt−1,βtI).
Множитель 1−βt поставлен не для красоты: он сжимает старый
сигнал ровно настолько, чтобы полная дисперсия не разбухала. Обозначим
αt=1−βt и αˉt=∏s=1tαs. Сумма независимых
гауссовых величин снова гауссова, поэтому тысячу шагов можно проскочить одной
формулой:
xt=αˉtx0+1−αˉtε,ε∼N(0,I).
Первое слагаемое — уцелевший сигнал, второе — шум. Квадраты коэффициентов
дают в сумме единицу, и это утверждение о дисперсиях: если x0 имеет
единичную дисперсию и не зависит от ε, то
Var(xt)=αˉt⋅1+(1−αˉt)⋅1=1.
Картинка тускнеет, но шкала не съезжает — и сеть на всех уровнях шума видит
входы одного масштаба.
Формулу легко проверить измерением. Возьмём 400 реальных цифр, зашумим их до
уровня t и посчитаем корреляцию между пикселями xt и x0. Теория даёт
ρt=αˉts2+1−αˉtαˉts,s2=Var(x0)=0,565.
Замер и формула совпадают: при t=100 — 0,976 против 0,976, при
t=300 — 0,820 против 0,822, при t=600 — 0,476 против 0,475,
при t=900 — 0,118 против 0,117. Обратите внимание: при t=600
коэффициент αˉt=0,584, а корреляция всего 0,476 —
потому что дисперсия наших картинок меньше единицы, и шум съедает сигнал
быстрее номинала. Это первое напоминание, что «уровень шума» имеет смысл
только относительно масштаба данных.
Рис. 86.1. Расписание решает, на каких задачах учится шумоподавитель
Верхняя лента — одна и та же реальная цифра при шести значениях t
косинусного расписания, подписано отношение сигнал/шум
SNRt=αˉt/(1−αˉt). Нижний график сравнивает два
расписания. У линейного SNR падает до единицы уже на шаге 260, у
косинусного — только на 497. К концу αˉ1000 равно
4,0⋅10−5 и 2,4⋅10−9 соответственно: в обоих случаях
финальное распределение практически стандартное гауссово.
Расписание — это учебный план
Каждое обучающее сравнение выбирает случайный t, поэтому кривая
αˉt определяет, какую долю бюджета сеть потратит на лёгкие,
средние и безнадёжные задачи. Считать шаги бессмысленно, считать надо
SNR.
У линейного расписания 32,6% всех шагов имеют SNR<0,01:
треть примеров — это почти чистый шум, где предсказывать нечего и градиенты
почти не несут информации. У косинусного таких шагов 6,4%. Ровно поэтому
косинусное расписание было предложено для картинок малого разрешения, где
линейное успевает уничтожить сигнал слишком рано.
Один прыжок даёт среднее, а не образец
Что вообще должен выдавать идеальный шумоподавитель? Если минимизировать
квадратичную ошибку, ответ известен из урока 20: оптимальный
прогноз — условное среднее
x0(xt)=E[x0∣xt].
Для нашей выборки это среднее выписывается точно. Если считать распределением
данных саму обучающую выборку из N=1400 картинок, то
Это не приближение и не обученная сеть, а формула. Посмотрим, сколько картинок
реально участвует в ответе. Эффективное число слагаемых удобно мерить через
энтропию весов:
neff=exp(−i∑wilogwi).
Замер вдоль расписания: при t=50 и t=200 получается
neff=1,0 — шум ещё не скрыл, какая именно это была картинка.
При t=400 уже 2,7, при t=600 — 9,3, при t=800 — 405, а при
t=1000 — все 1400.
Рис. 86.2. Оптимальный одношаговый ответ — среднее по всё большему числу картинок
Верхний ряд — вход xt, средний — точное E[x0∣xt], подписано
эффективное число участвующих картинок. Пока neff≈1, ответ
чёткий: это реставрация. Дальше ответ становится усреднением, и на t=800 в
нём смешаны сотни цифр. Нижняя панель — та же величина по всему расписанию, в
логарифмическом масштабе.
Вот и ответ на вопрос «почему нельзя убрать весь шум одним махом». Из чистого
шума условное среднее равно просто среднему по выборке: наш замер даёт
расстояние 0,0003 между «одним прыжком» из x1000 и средней картинкой
обучающего набора. Одношаговая модель, обученная по квадратичной ошибке,
честно выдаёт размытую кляксу — и это не её недоработка, а правильный ответ на
неправильно поставленный вопрос.
Что именно учит сеть
Перепишем условное среднее через шум. Из формулы прямого процесса
ε=1−αˉtxt−αˉtx0,
поэтому предсказывать x0 и предсказывать ε — одно и то же с
точностью до пересчёта. Практика выбрала второе: цель ε имеет
единичную дисперсию при любом t, и функция потерь не требует подгонки весов
по уровням шума. Обучение выглядит обезоруживающе просто: берём картинку,
берём случайный t, берём случайный ε, собираем xt и
минимизируем
Lsimple=Ex0,t,εε−εθ(xt,t)22.
Эта простота не куплена нестрогостью. Вариационная нижняя оценка правдоподобия
(та самая, что в уроке 85 обслуживала автокодировщик) для
диффузии сводится ровно к той же сумме квадратов, но с весами по времени:
Практика заменяет эти веса единицами — и получает лучшие картинки, хотя и
худшее формальное правдоподобие. Никакого противника, как у состязательных
сетей, никакого перебора по цепочке — одна регрессия. Номер шага подаётся сети отдельным вектором-эмбеддингом,
потому что одна и та же текстура при слабом и сильном шуме требует разных
поправок.
Шум, плотность и формула Тweedie
У предсказанного шума есть второй, более глубокий смысл. Плотность зашумлённых
данных qt — это свёртка распределения данных с гауссианой, и градиент её
логарифма (его называют score) связан с оптимальным предсказанием шума
жёстким тождеством:
∇xtlogqt(xt)=−1−αˉtε⋆(xt,t).
Эквивалентная запись — формула Тweedie, связывающая условное среднее с
градиентом плотности:
E[x0∣xt]=αˉtxt+(1−αˉt)∇xtlogqt(xt).
Читается это так: обученный шумоподавитель, сам того не зная, выучил векторное
поле, указывающее в сторону роста плотности данных. Генерация — движение по
этому полю против течения диффузии.
Рис. 86.3. Прямой процесс стирает моды, обратный тянет к остаткам плотности
Реальные цифры «нуль» и «единица» в проекции на две главные компоненты
(урок 38). Левая панель — сами данные, дальше — плотность qt
(темнее — выше) и поле score. Разделимость мод, измеренная как расстояние
между центрами в единицах текущего разброса, падает с 1,93 до 1,36 на
шаге 500 и до 0,30 на шаге 900: моды буквально сливаются, и вернуть их
может только выученное поле.
Обратный шаг
Обратную цепочку моделируют гауссовыми переходами
pθ(xt−1∣xt)=N(μθ(xt,t),Σt),
а при ε-параметризации среднее выписывается явно:
μθ(xt,t)=αt1(xt−1−αˉtβtεθ(xt,t)).
Дисперсию шага обычно берут равной дисперсии истинного апостериорного перехода
q(xt−1∣xt,x0):
σt2=1−αˉt1−αˉt−1βt.
Стартуем с xT∼N(0,I) и идём T,T−1,…,1; на последнем шаге
шум не добавляют.
Ошибки шагов накапливаются, но каждая из них локальна: если на шаге t сеть
чуть промахнулась, следующий шаг видит уже новую точку и честно считает
поправку для неё. Это делает цепочку самокорректирующейся — качество, которого
лишён одиночный прыжок.
Лаборатория обращения шума
Расписание, шаги и guidance: прямой и обратный процессы
График шире экрана — листайте по горизонтали →
Загружается живая иллюстрация…
В лаборатории данные — две моды на плоскости (дуга и пятно), а score не
приближённый, а точный: это score сглаженного эмпирического распределения
показанных точек. Значит, всё, что вы увидите, — свойства самой схемы, а не
недоучившейся сети.
Первое, что стоит сделать, — сравнить расписания по SNR, а не по
номеру шага. Поставьте t=400: у косинусного расписания сигнала ещё около
двух третей дисперсии, у линейного — меньше пятой части, хотя номер шага один
и тот же.
Второе — уменьшить число шагов обратной цепочки до двух. Все сорок образцов
сваливаются в одну моду, разнообразие обнуляется. При трёх шагах доля моды
«дуга» подскакивает до двух третей вместо честных 58%, и лишь начиная
примерно с пяти шагов пропорции мод приходят в норму. Это и есть цена
ускорения — не размытость, а перекос распределения.
Третье — включить условие и крутить guidance. При w=1 образцы честно
попадают в нужный класс. При w⩾4 все сорок точек стягиваются к одной
и той же обучающей точке: соответствие условию идеально, разнообразия нет
вовсе. Ползунок guidance — это не ручка «качество», а ручка компромисса.
Порядок рождения деталей предсказуем
Посмотрите на любой ролик генерации: сначала возникает общая композиция, потом
крупные формы, и только в конце — фактура. Это не метафора, а арифметика
отношения сигнал/шум по направлениям.
Разложим данные по главным компонентам с дисперсиями λj. В направлении
j прямой процесс оставляет сигнал αˉtλj при шуме
1−αˉt, то есть собственное отношение
SNRj(t)=1−αˉtαˉtλj.
Направление «просыпается» в обратном ходе там, где SNRj переходит
единицу, а это происходит тем раньше, чем больше λj:
Рис. 86.4. Крупные направления фиксируются раньше мелких
Левая панель — координаты одной обратной траектории в базисе главных компонент
реальных цифр. Правая — шаг, на котором координата перестаёт заметно меняться:
для первой компоненты (λ=2,86) замер даёт t=583 при теоретическом
658, для сорок первой (λ=0,036) — t=66 при теоретическом 112.
Порядок рождения деталей задан спектром данных, а не архитектурой сети.
Практический вывод: если правки нужны в глобальной композиции, вмешиваться
надо рано, на больших t; если в текстуре — поздно. Именно на этом устроены
приёмы редактирования, о которых пойдёт речь в уроке 87.
Сколько шагов достаточно
Число шагов можно уменьшить, если отказаться от случайности. Детерминированный
солвер DDIM использует ту же сеть, но переходит сразу на выбранный уровень
s<t:
Рис. 86.5. Ускорение стоит точности, но не линейно
Одни и те же начальные шумы, разное число шагов DDIM. Расстояние до эталона в
500 шагов: 2,13 при трёх шагах, 1,12 при пяти, 0,52 при десяти,
0,19 при двадцати пяти, 0,090 при пятидесяти, 0,040 при ста.
Переход с десяти шагов на сто уменьшает отклонение в 12,8 раза, а платить
за это приходится ровно вдесятеро большим временем (правая панель).
Отсюда правило гигиены: название «50 шагов» ничего не описывает. Нужно
указывать солвер, сетку шагов, порядок метода и параметр стохастичности —
иначе два «одинаковых» замера сравнивать нельзя. Экономика этого выбора —
продолжение разговора о стоимости инференса: пользователю важна
задержка одного запроса, серверу — пропускная способность пакета, и оптимум у
них разный.
Условие и guidance: ручка компромисса
Условие c — класс, текст или маска — подаётся в шумоподавитель наряду с t.
Обучают одну сеть на два режима, случайно заменяя часть условий пустым
символом ∅. Тогда при генерации доступны оба прогноза, и их
комбинируют:
ε=εθ(xt,t,∅)+w[εθ(xt,t,c)−εθ(xt,t,∅)].
При w=0 это безусловная генерация, при w=1 — обычная условная, при w>1 —
экстраполяция за условный прогноз. В терминах плотностей комбинация означает
выборку из
p~(x∣c)∝p(x)(p(x)p(x∣c))w∝p(x)p(c∣x)w,
то есть возведение правдоподобия условия в степень w — заострение, ровно как
температура в софтмаксе.
Рис. 86.6. Точнее по условию — беднее по разнообразию
Условная генерация цифры «три». Доля попаданий, по мнению независимого
классификатора с точностью 97,2% на отложенной выборке: 10,8% при
w=0, 95,8% при w=1, 99,2% при w=2, 97,5% при w=4 и
93,3% при w=8. Разнообразие при этом падает монотонно: 5,39,
4,34, 4,21, 3,79, 3,29. Соответствие выходит на насыщение и
затем ухудшается, а платёж продолжает расти.
Это и есть главный урок про guidance: за него всегда платят разнообразием, а
после некоторого w перестают получать даже соответствие. В нашем замере
оптимум по соответствию — w=2, но уже там разнообразие упало на пятую часть
от безусловного.
Латентная диффузия: где считать дешевле
В пикселях считать дорого: сеть должна обрабатывать десятки тысяч чисел на
каждом из полусотни шагов. Латентная диффузия переносит процесс в сжатое
пространство: автокодировщик кодирует изображение в латент z0
меньшего размера, вся цепочка идёт там, и лишь один раз декодер возвращает
пиксели. Уменьшение стороны в 8 раз сокращает число чисел в 64 раза.
Цена честная, и её надо называть вслух: детали, потерянные кодировщиком,
диффузия восстановить не может. При оценке качества нужно отдельно измерять
потолок реконструкции автокодировщика и отдельно — качество генеративной
части, иначе улучшение одной подменяется другой.
Текстовое условие обычно подаётся через перекрёстное внимание, а сами
представления текста берутся из моделей, родственных контрастивным текстовым
энкодерам.
Непрерывный предел: обратное время
Если шаги устремить к нулю, зашумление перестаёт быть цепочкой картинок и
становится непрерывным движением. Записывают его так (запись читается как «за
маленькое время dt точка сдвинулась на снос плюс случайный толчок»):
dx=f(x,t)dt+g(t)dWt,
где Wt — винеровский процесс, тот самый броуновский шум из
урока 66. Замечательный факт: у такого уравнения существует
уравнение обратного времени, и оно снова диффузионное —
dx=[f(x,t)−g(t)2∇xlogpt(x)]dt+g(t)dWˉt.
Всё, чего не хватает для обращения времени, — то самое поле score. Более того,
существует детерминированное уравнение потока вероятности
dtdx=f(x,t)−21g(t)2∇xlogpt(x),
у которого те же маргинальные распределения, что у случайного процесса. Отсюда
и берутся детерминированные солверы, и возможность оценивать правдоподобие.
Здесь уместно вспомнить советскую школу теории случайных процессов. Анатолий
Владимирович Скороход (1930–2011) вместе с Иосифом Ильичом Гихманом построил
систематическую теорию стохастических дифференциальных уравнений — того самого
объекта, который сегодня описывает прямой и обратный процессы диффузионных
моделей. Их «Стохастические дифференциальные уравнения» (Киев, 1968) стали
одной из первых монографий, где диффузионный процесс определялся как решение
уравнения со случайной правой частью, а не как набор частных примеров.
Но ещё ближе к нашему сюжету другая его теорема — о вложении, доказанная в
начале 1960-х. Она утверждает поразительное: для любой случайной величины с
нулевым средним и конечной дисперсией найдётся момент остановки τ
броуновского движения такой, что
Bτ=dX,Eτ=VarX.
Иными словами, любое распределение можно получить из чистого броуновского
шума, если правильно выбрать, когда остановиться. Диффузионная модель делает,
по сути, то же самое инженерным способом: у неё есть броуновский шум и
выученное правило, куда двигаться и когда остановиться. Скороход доказал, что
такой способ существует в принципе; глубокое обучение нашло, как строить его
по данным.
Когда модель просто помнит
Точный score эмпирического распределения — идеальный шумоподавитель для
обучающей выборки, и именно поэтому он бесполезен как генератор. Мы прогнали
цепочку с этим точным score: среднее расстояние до ближайшей обучающей
картинки оказалось 0,000 — модель воспроизвела обучающие цифры буква в
букву. У модели с ограниченной ёмкостью то же расстояние равно 3,21.
Вывод парадоксальный и важный: обобщение диффузионной модели — следствие того,
что сеть не достигает оптимума функции потерь. Она сглаживает, потому что не
может выучить 1400 дельта-функций, и это сглаживание и есть генерация нового.
Оттого и проверка на запоминание должна быть обязательной частью протокола:
редкие обучающие объекты, близкие подсказки, поиск и точные совпадения, и обрезанных фрагментов. Причины запоминания обычно лежат в
дубликатах корпуса, слишком узком условии или избыточном числе эпох — та же
тема, что и в дедупликации предобучения.
Что мерить и чему не верить
Соберём протокол честной оценки диффузионной модели.
Во-первых, ошибка предсказания шума по уровням SNR, а не в среднем:
одна и та же величина ошибки при t=100 и при t=900 означает совершенно
разные вещи для итоговой картинки. Во-вторых, генеративные метрики
распределений (расстояние Фреше в признаках замороженного классификатора,
точность и полнота) — обязательно на одинаковом числе образцов и одинаковой
статистике реальных данных, иначе числа несравнимы. В-третьих, покрытие мод:
доля классов, которые модель вообще порождает. В-четвёртых, время генерации
отдельно для пакета из одного и из шестидесяти четырёх образцов.
И главное — выбор лучшего чекпойнта делается по отложенной выборке, а не по
тестовой метрике после десятков попыток: иначе получается та же подгонка под
проверку, о которой шла речь в уроке 32.
Генерация как обращение шума
Диффузия раскладывает невозможную задачу на тысячу возможных. Прямой процесс
известен точно и бесплатен; обучение сводится к одной регрессии на
предсказание шума; предсказанный шум оказывается градиентом логарифма
плотности; обратная цепочка идёт по этому полю, а её случайность отвечает за
разнообразие. Расписание задаёт учебный план, число шагов — цену и точность,
guidance — размен соответствия и разнообразия. Всё это части модели
результата, а не «настройки по вкусу»: меняя их, вы меняете распределение, из
которого берёте образец.