Диффузионная модель

Коротко

Definition

Диффузионная модель — это генеративная модель, которая учится создавать данные, начиная с шума и постепенно удаляя из него шум до получения осмысленного объекта.

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

Модель состоит из двух процессов:

  1. Прямой процесс — постепенно зашумляет реальные данные.
  2. Обратный процесс — учится постепенно убирать шум и восстанавливать данные.

Интуитивно:

а затем:

Интуиция

Диффузионную модель можно понимать как обучение «машины денойзинга».

Во время обучения мы берём реальный объект, добавляем к нему шум и просим нейросеть предсказать, какой шум был добавлен.

Если модель научилась хорошо предсказывать шум на разных уровнях зашумления, то во время генерации можно начать с чистого шума и много раз применять модель, постепенно очищая объект.

Пример для изображения:

  1. Берём настоящее изображение.
  2. Постепенно добавляем гауссовский шум, пока изображение не станет почти чистым шумом.
  3. Обучаем нейросеть предсказывать добавленный шум.
  4. Для генерации стартуем со случайного шума.
  5. Пошагово удаляем шум.
  6. Получаем новое изображение.

Формальное описание

Диффузионная модель задаёт последовательность скрытых состояний:

где:

  • — исходные реальные данные;
  • — данные после шагов зашумления;
  • — почти чистый гауссовский шум.

Прямой процесс обычно фиксирован и не обучается.

Обратный процесс параметризуется нейросетью, например U-Net:

Эта сеть получает зашумленный объект и timestep , а затем предсказывает шум, который нужно убрать.

Входы и выходы

Во время обучения вход модели:

  • зашумленный объект ;
  • timestep ;
  • иногда условие , например текстовый prompt, класс или другой conditioning signal.

Выход модели чаще всего:

  • предсказанный шум .

В conditional diffusion output может зависеть от условия:

Например, в text-to-image модели условием является текстовое описание изображения.

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

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

На каждом шаге объект превращается в более шумный объект :

где:

  • — случайный гауссовский шум;
  • — величина добавляемого шума на шаге ;
  • — объект после очередного шага зашумления.

Расписание называют noise schedule.

Note

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

Прыжок на произвольный timestep

Ключевое свойство прямого процесса: можно получить напрямую из , не вычисляя все промежуточные шаги.

Обозначим:

и:

Тогда:

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

Пример прямого процесса

Пусть исходный объект — 2D-вектор:

Пусть для первого шага:

Тогда:

и:

Сэмплируем шум:

Используем формулу прыжка:

Приближённо:

Вектор — это исходный объект с небольшим добавлением шума.

Непрерывное время и SDE

Дискретный процесс можно рассматривать как приближение непрерывного процесса.

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

где:

  • — drift, детерминированная часть движения;
  • — diffusion, стохастическая часть с гауссовским шумом;
  • — винеровский процесс, или броуновское движение.

Это непрерывное описание полезно для связи diffusion models со score-based generative models и flow matching.

Для базового понимания достаточно помнить: дискретная диффузия — это пошаговое зашумление, а SDE — его непрерывный аналог.

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

Обратный процесс должен восстановить данные из шума:

Проблема: прямой процесс известен, а обратный нужно выучить.

Модель должна понять, как из зашумленного объекта получить менее зашумленный .

На практике нейросеть часто учат предсказывать шум:

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

Score function

Для обращения процесса полезна score function:

Это градиент логарифма плотности распределения данных на timestep .

Интуитивно score function показывает, в какую сторону нужно сдвинуть зашумленную точку, чтобы она стала более похожа на данные из текущего распределения.

Можно представить плотность данных как ландшафт. Score function указывает направление подъёма к областям с большей вероятностью.

Диффузионная модель может быть понята как модель, которая учится оценивать это направление.

Почему предсказание шума связано со score matching

В прямом процессе получается из добавлением гауссовского шума:

Для гауссовского распределения score имеет удобное выражение:

То есть score пропорционален добавленному шуму .

Поэтому обучение модели предсказывать шум и обучение модели предсказывать score тесно связаны.

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

Timestep embedding

Модель должна знать, на каком уровне шума находится объект.

Поэтому timestep подают в сеть как embedding.

Часто используют sinusoidal или harmonic embeddings, похожие на positional encodings в трансформерах.

Этот embedding затем добавляется или подмешивается в блоки нейросети, например в residual blocks внутри U-Net.

Иначе одна и та же сеть не сможет отличить слегка зашумленный объект от почти полного шума.

Как обучается

Типовой training loop:

  1. Взять реальный объект .
  2. Случайно выбрать timestep .
  3. Сэмплировать шум .
  4. Получить зашумленный объект:
  1. Подать и в нейросеть.
  2. Получить предсказание шума .
  3. Посчитать MSE между настоящим и предсказанным шумом.
  4. Обновить параметры модели через Обратное распространение ошибки.

Функция потерь

Частая функция потерь в DDPM-подобных моделях — MSE между реальным шумом и предсказанным шумом:

Здесь:

  • — реальный объект;
  • — timestep;
  • — настоящий добавленный шум;
  • — шум, предсказанный моделью.

Пример:

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

MSE:

Этот loss используется для обновления весов нейросети.

Генерация

После обучения можно генерировать новые объекты.

Процедура sampling:

  1. Сэмплировать чистый гауссовский шум:
  1. Для :

    • подать и в модель;
    • получить предсказанный шум ;
    • вычислить менее зашумленный .
  2. Получить финальный объект .

Один из вариантов обратного шага:

где:

  • — дополнительный шум;
  • — уровень шума на обратном шаге.

В детерминированных сэмплерах дополнительный шум может быть равен нулю.

Пример генерации

Пусть модель уже обучена, и нужно сгенерировать новый 2D-вектор. Пусть .

Старт:

Шаг :

  • модель предсказывает шум:
  • по обратной формуле получаем менее зашумленный вектор:

Шаг :

  • модель предсказывает:
  • получаем:

Итоговый — новый сгенерированный объект, похожий на данные из обучающего распределения.

Архитектура

В диффузионных моделях для изображений часто используют U-Net.

Почему U-Net удобен:

  • encoder постепенно сжимает spatial resolution;
  • decoder восстанавливает resolution;
  • skip connections сохраняют пространственные детали;
  • residual blocks помогают обучению;
  • timestep embedding подмешивается в блоки;
  • attention blocks помогают учитывать глобальный контекст.

Связанные блоки:

В современных text-to-image моделях U-Net или transformer-like denoiser часто получает не только и , но и conditioning, например текстовый embedding.

Conditional diffusion

Диффузионная модель может быть условной.

Тогда генерация зависит от условия :

Условие может быть:

  • текстовым prompt;
  • классом;
  • изображением;
  • маской;
  • low-resolution изображением;
  • свойствами объекта.

Примеры:

  • text-to-image generation;
  • image inpainting;
  • super-resolution;
  • class-conditional generation;
  • генерация молекул или материалов с заданными свойствами.

Гиперпараметры

Основные гиперпараметры:

  • число diffusion steps ;
  • noise schedule ;
  • архитектура denoiser;
  • размер timestep embedding;
  • learning rate;
  • batch size;
  • optimizer;
  • способ conditioning;
  • sampling method;
  • classifier-free guidance scale;
  • число sampling steps;
  • loss weighting.

Количество sampling steps влияет на качество и скорость генерации. Больше шагов обычно даёт лучшее качество, но медленнее.

Когда использовать

Диффузионные модели стоит использовать, если:

  • нужна генерация сложных данных;
  • важны качество и разнообразие сэмплов;
  • есть достаточно данных и вычислений;
  • задача связана с изображениями, аудио, видео или structured generation;
  • требуется conditional generation;
  • нужна современная альтернатива GAN и VAE.

Диффузионные модели часто обучаются стабильнее, чем GAN, и лучше покрывают распределение данных.

Когда не использовать

Диффузионная модель может быть плохим выбором, если:

  • данных мало;
  • вычислительные ресурсы ограничены;
  • нужна очень быстрая генерация;
  • задача простая и решается классической моделью;
  • нет возможности долго обучать модель;
  • нет понятной метрики качества генерации.

Недостаток классических diffusion models — медленный sampling, потому что генерация требует многих последовательных шагов.

Метрики оценки

Для изображений часто используют:

  • FID;
  • Inception Score;
  • CLIP-based metrics для text-to-image;
  • human evaluation;
  • diversity metrics;
  • domain-specific metrics.

Также важно проверять:

  • разнообразие;
  • артефакты;
  • соответствие условию;
  • устойчивость генерации;
  • редкие случаи;
  • bias в данных.

Loss обучения не всегда напрямую соответствует субъективному качеству сгенерированных объектов.

Типичные ошибки понимания

Думать, что модель учится добавлять шум

Прямой процесс зашумления фиксирован и не обучается. Модель учится обратному процессу — удалять шум.

Путать и

— зашумленный объект. — шум, который был добавлен к исходному объекту.

Модель часто предсказывает именно , а не сразу чистый .

Думать, что все шаги прямого процесса нужно считать последовательно

Во время обучения можно напрямую получить из через формулу с .

Считать diffusion тем же самым, что VAE

VAE учит latent distribution и decoder. Diffusion учит обратный процесс денойзинга из шума.

Игнорировать timestep embedding

Без timestep модель не знает, сколько шума в объекте, и не может корректно денойзить разные уровни шума.

Ожидать быструю генерацию без специальных методов

Классический sampling может быть медленным. Для ускорения используют DDIM, distillation, fewer-step samplers и другие методы.

Минимальный пример

Пусть объект — число .

Добавляем шум на timestep :

Если шум:

то:

Модель получает и timestep .

Её задача — предсказать шум:

Если модель правильно предсказывает шум, можно сделать шаг в сторону менее зашумленного объекта.

Практические замечания

Хороший workflow:

  1. Начать с простой DDPM/DDIM реализации.
  2. Проверить нормализацию данных.
  3. Выбрать noise schedule.
  4. Убедиться, что timestep embedding подаётся в модель.
  5. Обучать модель предсказывать шум.
  6. Визуально проверять samples во время обучения.
  7. Сравнивать разные samplers.
  8. Проверять diversity и mode coverage.
  9. Для conditional generation проверять соответствие условию.
  10. Не оценивать качество только по training loss.

Для изображений важно смотреть реальные сэмплы на разных этапах. Для научных объектов нужно дополнительно проверять валидность сгенерированных структур предметными метриками.

Связанные понятия