Эпоха 6 · Генеративка и системы · 2022

47 Stable Diffusion (LDM)

High-Resolution Image Synthesis with Latent Diffusion Models · Rombach, Blattmann и др. · LMU/Runway · CVPR
🟧 оригинал выборочно~1.5–2 чоригинал ↗
Суть за 20 секунд. Переносит диффузию в латентное пространство предобученного автоэнкодера + conditioning через cross-attention, срезав compute на порядки. Архитектура, ставшая Stable Diffusion — text-to-image на потребительских GPU.

Контекст

DDPM (#46) работает в пространстве ПИКСЕЛЕЙ → дорого: для 512×512 каждый из сотен шагов денойзинга идёт на полном разрешении. Ромбах и др. делают диффузию дешёвой.

Идея и механизм

Перенести диффузию в КОМПАКТНОЕ латентное пространство. (1) Обучаем перцептивный автоэнкодер, сжимающий картинку в маленький латент и обратно. (2) Диффузию делаем уже в латенте — на порядки меньше вычислений. (3) Декодер восстанавливает пиксели. Conditioning (текст, маска) подаётся через cross-attention в U-Net денойзера.

теория вероятностей Латентная диффузия + cross-attention conditioning

Двухэтапно. Сначала автоэнкодер: z = E(x) сжимает картинку 512×512×3 в латент, например 64×64×4 — в ~48 раз меньше элементов. Диффузия (тот же ε-prediction, что в DDPM) идёт в z, а не в пикселях:

L = E ‖ ε − εθ(zt, t, c) ‖²,   затем x = D(z0)

Conditioning. Текстовый промпт кодируется в эмбеддинги c, которые входят в денойзер через cross-attention: латентные признаки дают Query, текст — Key/Value:

Attention(Qлатент, Kтекст, Vтекст)

Так каждый участок генерируемой картинки «смотрит» на релевантные слова промпта. Перенос в латент даёт основной выигрыш (на порядки дешевле), cross-attention — управляемость текстом.

PyTorch Латентная диффузия (схема)
z0 = encoder(x)                      # сжать картинку в латент
zt = a.sqrt()*z0 + (1-a).sqrt()*eps  # зашумить в латенте
pred = unet(zt, t, cond=text_emb)    # денойзер + cross-attention к тексту
loss = ((eps - pred)**2).mean()
# генерация: из шума в латенте → денойз → decoder(z0) → пиксели
пиксели латент диффузияв латенте (дёшево) латент пиксели ED (decoder)
Автоэнкодер сжимает в латент, диффузия работает там (на порядки дешевле), декодер возвращает пиксели. Текст управляет через cross-attention.
Аналогия. Зачем рисовать черновик в натуральную величину на огромном холсте, если можно набросать его на маленьком эскизе, а потом увеличить? Латент — это эскиз: вся творческая работа (диффузия) идёт на компактной версии, а финальный «принтер» (декодер) разворачивает её до полного разрешения. Дёшево там, где дорого не нужно.

Почему это важно

Эта работа — research-основа Stable Diffusion (open-weights релиз августа 2022): генерация по тексту поехала на ПОТРЕБИТЕЛЬСКИХ GPU и стала массовой; открытость породила огромную экосистему (LoRA для SD, ControlNet и пр.).

Связи

← опирается на46. DDPM (Diffusion)

Математика диффузии (ε-prediction, MSE-лосс) взята из DDPM без изменений — LDM лишь переносит её в латентное пространство. Это инженерная оптимизация поверх теоретического фундамента DDPM.

← управляется через40. CLIP

Текстовый conditioning опирается на эмбеддинги в духе CLIP — общее пространство язык↔зрение. Cross-attention к этим эмбеддингам и есть механизм, которым промпт «направляет» генерацию.

→ использует32. Transformer

Cross-attention — это attention из Transformer, применённое между латентом и текстом. Тот же механизм «извлечения по релевантности» (#22, #32) теперь связывает картинку и слова промпта.

Вопросы пытливого ума

Не теряется ли качество при работе в сжатом латенте?

Почти нет — и в этом фокус. Автоэнкодер обучают с перцептивным лоссом, чтобы он сохранял семантически важные детали и выбрасывал лишь перцептивно незаметную избыточность пикселей. Диффузия работает с тем, что для восприятия значимо. Слишком агрессивное сжатие всё же вредит, поэтому коэффициент компрессии — важный гиперпараметр баланса «дёшево / качество».

Почему именно открытый релиз Stable Diffusion стал таким событием?

DALL·E 2 (закрытый) показал, что text-to-image возможен; Stable Diffusion сделал его доступным — веса открыты, модель влезает на одну потребительскую GPU. Это сместило власть от лабораторий к сообществу: тысячи fine-tune, инструментов (ControlNet), бизнесов. Открытость + дешевизна латентной диффузии = массовость, которой не было у закрытых аналогов.

Conditioning через cross-attention — единственный способ управлять генерацией?

Нет, это база, но экосистема добавила много: classifier-free guidance (усиливает влияние промпта), ControlNet (управление позой/контурами), inpainting-маски, img2img. Cross-attention к тексту — основной канал, но «как заставить модель рисовать именно то, что нужно» выросло в отдельную инженерную область поверх него.

Что читать в оригинале

Читать ключевое — идея латента (двухфазное обучение) и cross-attention conditioning.