47 Stable Diffusion (LDM)
Контекст
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, а не в пикселях:
Conditioning. Текстовый промпт кодируется в эмбеддинги c, которые входят в денойзер через cross-attention: латентные признаки дают Query, текст — Key/Value:
Так каждый участок генерируемой картинки «смотрит» на релевантные слова промпта. Перенос в латент даёт основной выигрыш (на порядки дешевле), 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) → пиксели
Почему это важно
Эта работа — research-основа Stable Diffusion (open-weights релиз августа 2022): генерация по тексту поехала на ПОТРЕБИТЕЛЬСКИХ GPU и стала массовой; открытость породила огромную экосистему (LoRA для SD, ControlNet и пр.).
Связи
Математика диффузии (ε-prediction, MSE-лосс) взята из DDPM без изменений — LDM лишь переносит её в латентное пространство. Это инженерная оптимизация поверх теоретического фундамента DDPM.
Текстовый conditioning опирается на эмбеддинги в духе CLIP — общее пространство язык↔зрение. Cross-attention к этим эмбеддингам и есть механизм, которым промпт «направляет» генерацию.
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.