Latent diffusion model

Latent Diffusion Model (LDM) — архитектура диффузионной модели, разработанная группой CompVis (Computer Vision & Learning)[1] при Мюнхенском университете Людвига Максимилиана[2]. LDM представляет собой усовершенствование стандартных диффузионных моделей (DM) за счёт обработки в латентном пространстве и поддержки механизмов самовнимания и перекрёстного внимания.

Диффузионные модели были впервые предложены в 2015 году и обучаются удалять шум, который последовательно добавляется к тренировочным изображениям (обычно гауссов). LDM отличается от классических DM тем, что моделирование проводится в латентном представлении, а также возможностью использования механизмов self-attention и cross-attention.

LDM положен в основу многих практических диффузионных моделей. Например, Stable Diffusion версий 1.1–2.1 реализованы на архитектуре LDM[3].

Общие сведения
Latent Diffusion Model
Тип
Автор CompVis
Написана на Python
Первый выпуск 20 декабря 2021
Репозиторий github.com/CompVis/laten…
Лицензия MIT

История версий

Диффузионные модели были впервые представлены в 2015 году как метод построения моделей для генерации сложных вероятностных распределений, используя методы неравновесной термодинамики и диффузии[4]. В то же время была предложена реализация на Theano[5].

В 2019 году была предложена модель noise conditional score network (NCSN) или score-matching с динамикой Ланжевена (SMLD)[6]. К статье прилагался программный пакет на PyTorch, опубликованный на GitHub[7].

В 2020 году опубликована работа[8], где была предложена Denoising Diffusion Probabilistic Model (DDPM), улучшающая прежние методы за счёт вариационного вывода. В публикации приводился программный пакет на TensorFlow, выпущенный на GitHub[9]. Впоследствии реализована на PyTorch другим автором[10][11].

20 декабря 2021 года статья о LDM появилась на arXiv[12], а репозитории Stable Diffusion[13] и LDM[14] были опубликованы на GitHub. Существенная информация по Stable Diffusion v1 была добавлена только 10 августа 2022 года[15].

Все версии Stable Diffusion (SD) с 1.1 по XL являются конкретными реализациями архитектуры LDM.

SD 1.1–1.4 выпущены CompVis в августе 2022 года (версии 1.0 не существует). SD 1.1 представляла собой LDM, обученную на датасете laion2B-en, и далее дообучалась до 1.2 на более эстетичных изображениях. Версии 1.2 была дообучена до 1.3, 1.4 и 1.5, с уменьшением текстового кондиционирования на 10 % для улучшения guidance[16][17]. Версия SD 1.5 была выпущена компанией RunwayML в октябре 2022 года[17].

Архитектура

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

LDM состоит из вариационного автокодировщика (VAE), модифицированного U-Net и текстового энкодера.

Энкодер VAE сжимает изображение из пространства пикселей в компактное латентное пространство, отражающее семантическое содержание изображения. К этому латентному представлению применяется гауссов шум в процессе прямой (forward) диффузии. Блок U-Net, построенный на базе ResNet, постепенно устраняет шум, двигаясь в обратном (reverse) направлении, чтобы восстановить скрытое представление. После этого декодер VAE восстанавливает изображение из латентного пространства в пиксельное[3].

Шаг денойзинга может быть обусловлен строкой текста, изображением или другой модальностью. Закодированные условные данные подаются в U-Net через механизм cross-attention[3]. Для текстового кондиционирования используется зафиксированный, предобученный текстовый энкодер CLIP, преобразующий запросы в эмбеддинги[2].

Вариационный автокодировщик

Вначале вариационный автокодировщик (VAE) обучается на выборе изображений. Энкодер принимает изображение на вход и выдаёт его низкоразмерное латентное представление, которое затем используется в качестве входа для U-Net. После обучения энкодер применяется для кодирования изображений в латентные представления, а декодер — для обратного преобразования латентных в изображения.

Пусть энкодер и декодер VAE обозначаются и .

Для кодирования RGB-изображения его три канала делятся на максимальное значение, образуя тензор размера с элементами . Кодировка представляет собой размером , где 0.18215 — гиперпараметр, выбранный авторами для приблизительного беления вектора (unit variance). Обратно, для латентного тензора декодированное изображение вычисляется как , обрезается по диапазону [18][19].

В исходной реализации[2] энкодер — это сверточная нейронная сеть (CNN) с единственным механизмом self-attention ближе к выходу (выдаёт тензор — объединённые матожидание и дисперсия; после обучения используется только матожидание). Декодер также CNN с self-attention и преобразует тензор в изображение .

U-Net

Базовый блок U-Net принимает:

  • Латентный массив изображения, полученный от энкодера VAE размером . Обычно — .
  • Вектор временной эмбеддинга (timestep), показывающий степень зашумления: — отсутствие шума, — сильный шум.
  • Последовательность эмбеддингов модальности, отражающих дополнительные условия (например, текстовые токены, закодированные через CLIP или последовательности Vision Transformer для генерации в определённом стиле).

Каждый проход через U-Net выдаёт предсказанный вектор шума, который масштабируется и вычитается из латентного массива, постепенно убирая шум. Процедура повторяется до конца графика шумов (noise schedule), итог обрабатывается VAE-декодером.

Структурно U-Net идентичен классической модели: сначала слои с уменьшением размерности, затем с увеличением. В SD 1.5 backbone дополнен модулями для работы с эмбеддингами. Например, слой уменьшения размерности:

  • Латентный массив и time-embedding проходят через ResBlock:
    • Массив — через свёрточный слой.
    • Time-embedding — через однослойный персептрон, затем результат прибавляется к предыдущему (широковещание на все пиксели).
    • Затем новый свёрточный слой и ещё один time-embedding.
  • Латентный массив и последовательность эмбеддингов — через SpatialTransformer (аналог decoder-а Transformer без causal masking):
    • В блоках cross-attention массив служит query–последовательностью (по 1 вектору на пиксель), эмбеддинги — и как ключи, и как значения.
    • Если нет внешней последовательности эмбеддингов, cross-attention превращается в self-attention[20].

Псевдокод:

def ResBlock(x, time, residual_channels):
    x_in = x
    time_embedding = feedforward_network(time)
    x = concatenate(x, residual_channels)
    x = conv_layer_1(activate(normalize_1(x))) + time_embedding
    x = conv_layer_2(dropout(activate(normalize_2(x))))
    return x_in + x

def SpatialTransformer(x, cond):
    x_in = x
    x = normalize(x)
    x = proj_in(x)
    x = cross_attention(x, cond)
    x = proj_out(x)
    return x_in + x

def unet(x, time, cond):
    residual_channels = []
    for resblock, spatialtransformer in downscaling_layers:
        x = resblock(x, time)
        residual_channels.append(x)
        x = spatialtransformer(x, cond)

    x = middle_layer.resblock_1(x, time)
    x = middle_layer.spatialtransformer(x, time)
    x = middle_layer.resblock_2(x, time)

    for resblock, spatialtransformer in upscaling_layers:
        residual = residual_channels.pop()
        x = resblock(concatenate(x, residual), time)
        x = spatialtransformer(x, cond)

    return x

Детальное описание есть в источниках[21].[22]

Обучение и инференс

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

  • Процесс прямой диффузии: дано изображение , к нему последовательно добавляется гауссов шум по заданному графику, образуя последовательность латентных переменных .
  • Обратный процесс: начиная с (шумовое изображение), модель учится восстанавливать/предсказывать шум на каждом шаге, чтобы обрести восстановленное .

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

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

Подробнее — см. статью диффузионная модель.

Примечания

  1. Home (англ.). Computer Vision & Learning Group. Дата обращения: 5 сентября 2024.
  2. 1 2 3 Stable Diffusion Repository on GitHub. CompVis - Machine Vision and Learning Research Group, LMU Munich (17 сентября 2022). Дата обращения: 17 сентября 2022. Архивировано 18 января 2023 года.
  3. 1 2 3 Alammar, Jay The Illustrated Stable Diffusion. jalammar.github.io. Дата обращения: 31 октября 2022. Архивировано 1 ноября 2022 года.
  4. Sohl-Dickstein, Jascha; Weiss, Eric; Maheswaranathan, Niru; Ganguli, Surya (2015-06-01). “Deep Unsupervised Learning using Nonequilibrium Thermodynamics” (PDF). Proceedings of the 32nd International Conference on Machine Learning [англ.]. PMLR. 37: 2256—2265. arXiv:1503.03585.
  5. Sohl-Dickstein, Jascha Sohl-Dickstein/Diffusion-Probabilistic-Models. GitHub (1 сентября 2024). Дата обращения: 7 сентября 2024. Архивировано 6 мая 2025 года.
  6. ermongroup/ncsn. ermongroup (2019). Дата обращения: 7 сентября 2024. Архивировано 10 сентября 2025 года.
  7. Song, Yang; Ermon, Stefano (2019). “Generative Modeling by Estimating Gradients of the Data Distribution”. Advances in Neural Information Processing Systems. Curran Associates, Inc. 32. arXiv:1907.05600.
  8. Ho, Jonathan; Jain, Ajay; Abbeel, Pieter (2020). “Denoising Diffusion Probabilistic Models”. Advances in Neural Information Processing Systems. Curran Associates, Inc. 33: 6840—6851.
  9. Ho, Jonathan hojonathanho/diffusion. GitHub (20 июня 2020). Дата обращения: 7 сентября 2024. Архивировано 17 сентября 2025 года.
  10. Wang, Phil lucidrains/denoising-diffusion-pytorch. GitHub (7 сентября 2024). Дата обращения: 7 сентября 2024. Архивировано 12 августа 2025 года.
  11. The Annotated Diffusion Model. huggingface.co. Дата обращения: 7 сентября 2024. Архивировано 20 августа 2025 года.
  12. Rombach, Robin; Blattmann, Andreas; Lorenz, Dominik; Esser, Patrick & Ommer, Björn (2021-12-20), High-Resolution Image Synthesis with Latent Diffusion Models, arΧiv:2112.10752 [cs.CV]. 
  13. Update README.md · CompVis/stable-diffusion@17e64e3 (англ.). GitHub. Дата обращения: 7 сентября 2024. Архивировано 20 января 2025 года.
  14. Update README.md · CompVis/latent-diffusion@17e64e3 (англ.). GitHub. Дата обращения: 7 сентября 2024. Архивировано 7 сентября 2024 года.
  15. stable diffusion · CompVis/stable-diffusion@2ff270f (англ.). GitHub. Дата обращения: 7 сентября 2024. Архивировано 4 апреля 2025 года.
  16. CompVis (CompVis). huggingface.co (23 августа 2023). Дата обращения: 6 марта 2024. Архивировано 7 августа 2022 года.
  17. 1 2 runwayml/stable-diffusion-v1-5 · Hugging Face. huggingface.co. Дата обращения: 17 августа 2023. Архивировано 21 сентября 2023 года.
  18. Explanation of the 0.18215 factor in textual_inversion? · Issue #437 · huggingface/diffusers (англ.). GitHub. Дата обращения: 19 сентября 2024. Архивировано 23 марта 2025 года.
  19. diffusion-nbs/Stable Diffusion Deep Dive.ipynb at master · fastai/diffusion-nbs (англ.). GitHub. Дата обращения: 19 сентября 2024. Архивировано 26 июля 2025 года.
  20. latent-diffusion/ldm/modules/attention.py at main · CompVis/latent-diffusion (англ.). GitHub. Дата обращения: 9 сентября 2024. Архивировано 10 октября 2025 года.
  21. U-Net for Stable Diffusion (англ.). U-Net for Stable Diffusion. Дата обращения: 31 августа 2024. Архивировано 18 сентября 2022 года.
  22. Transformer for Stable Diffusion U-Net (англ.). Transformer for Stable Diffusion U-Net. Дата обращения: 7 сентября 2024. Архивировано 24 сентября 2022 года.

Литература

Дополнительно по теме