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 принимает:
- Латентный массив изображения, полученный от энкодера 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
Обучение и инференс
LDM обучается с помощью марковской цепи, которая постепенно добавляет шум к исходным изображениям; задача модели — восстановить их, поэтапно убирая шум. Процесс:
- Процесс прямой диффузии: дано изображение , к нему последовательно добавляется гауссов шум по заданному графику, образуя последовательность латентных переменных .
- Обратный процесс: начиная с (шумовое изображение), модель учится восстанавливать/предсказывать шум на каждом шаге, чтобы обрести восстановленное .
Минимизируется отличие между предсказанным и реальным шумом (обычно реализовано как среднеквадратическая ошибка).
После обучения, чтобы сгенерировать новое изображение, модель начинает с случайного шума и итеративно убирает шум согласно изученному распределению, пока не получит финальный результат.
Подробнее — см. статью диффузионная модель.
Примечания
Литература
- Wang, Phil lucidrains/denoising-diffusion-pytorch. GitHub (7 сентября 2024). Дата обращения: 7 сентября 2024.
- The Annotated Diffusion Model. huggingface.co. Дата обращения: 7 сентября 2024.
- U-Net for Stable Diffusion (англ.). U-Net for Stable Diffusion. Дата обращения: 31 августа 2024.
- Transformer for Stable Diffusion U-Net (англ.). Transformer for Stable Diffusion U-Net. Дата обращения: 7 сентября 2024.


