Латентное пространство: сжатый смысл

Урок вводит ключевую для Stable Diffusion идею: картинку можно сжать в компактный «смысловой код».

Латентное пространство — компактное числовое пространство, где каждая точка кодирует целую картинку, а близкие точки соответствуют похожим изображениям.

Зачем сжимать картинку

Работать напрямую с 786 тысячами пикселей дорого: каждый шаг диффузии пришлось бы прогонять через всю эту массу чисел. Идея Stable Diffusion — сначала сжать картинку в маленький код (например, 64×64×4 ≈ 16 тысяч чисел вместо 786 тысяч), делать всю «тяжёлую» работу там, а в конце разжать обратно в пиксели.

Это сжатие выполняет VAE, о котором подробно поговорим в разделе про архитектуру. Сейчас важна идея: латентный код хранит смысл картинки (что нарисовано, какая композиция), отбрасывая избыточные мелочи, которые легко восстановить.

Соседи в латентном пространстве похожи

Главное свойство хорошего латентного пространства — непрерывность: если чуть-чуть изменить код, картинка изменится чуть-чуть, а не превратится в хаос. Это позволяет плавно «переходить» от одного изображения к другому, двигаясь по прямой между их кодами.

# Имитация: латентный код — короткий вектор чисел.
# Плавно смешиваем код кошки и код собаки.
cat = [0.8, 0.1, 0.5, 0.2]
dog = [0.2, 0.7, 0.4, 0.9]
for t in [0.0, 0.5, 1.0]:
    mix = [round(c * (1 - t) + d * t, 2) for c, d in zip(cat, dog)]
    print("t =", t, "->", mix)

Вывод:

t = 0.0 -> [0.8, 0.1, 0.5, 0.2]
t = 0.5 -> [0.5, 0.4, 0.45, 0.55]
t = 1.0 -> [0.2, 0.7, 0.4, 0.9]

При t=0 — «кошка», при t=1 — «собака», а посередине — нечто промежуточное. В настоящей модели вектор гораздо длиннее, но принцип тот же.

Как работает под капотом

Латентное пространство строит обучаемый кодировщик: он подбирает такое сжатие, чтобы из кода можно было максимально точно восстановить картинку. В итоге размерность падает в десятки раз, но «смысловая» информация сохраняется. Именно поэтому подход называется latent diffusion — диффузия в латентном пространстве, а не в пикселях. Это и сделало Stable Diffusion достаточно лёгким, чтобы запускаться на обычной видеокарте.

Частые ошибки

  • Думать, что латентный код — это «уменьшенная картинка». Это не миниатюра, а абстрактный код; его нельзя посмотреть глазами без декодера.
  • Считать сжатие без потерь. Часть мелких деталей теряется — это плата за компактность.
  • Смешивать латентное пространство и seed. Seed задаёт стартовый шум, а латентное пространство — это «язык», на котором модель думает о картинке.

Зачем это художнику-практику

Латентное пространство — не только теория. На нём держатся самые мощные приёмы: img2img (стартуем не с шума, а с латента готовой картинки), плавные переходы между двумя картинками (интерполяция кодов) и тонкая настройка вроде textual inversion (учим модель новому «слову» прямо в пространстве смыслов). Все они работают именно потому, что пространство непрерывно и осмысленно. Без этого свойства маленькое изменение давало бы хаос, и управлять генерацией было бы невозможно.

Полезная ментальная модель: считайте латент «языком, на котором модель думает о картинках». Пиксели — это её «речь» на выходе, а латент — внутренние мысли. Большинство интересных операций удобнее делать на уровне мыслей (латента), а не готовой речи (пикселей), потому что там информация компактна и структурирована.

Итог

  • Латентное пространство — компактное представление картинки (в десятки раз меньше пикселей).
  • Близкие коды дают похожие изображения; пространство непрерывно, по нему можно плавно двигаться.
  • Stable Diffusion работает именно в латентном пространстве — отсюда название latent diffusion.
Проверьте себя
1. Зачем Stable Diffusion работает в латентном пространстве, а не с пикселями напрямую?
AЧтобы картинки были цветными
BЧтобы резко сократить объём вычислений на каждом шаге диффузии
CЧтобы убрать необходимость в промпте
DЛатентное пространство хранит картинки без потерь
2. Какое свойство латентного пространства означает «непрерывность»?
AВсе коды одинаковы
BМаленькое изменение кода даёт маленькое изменение картинки
CКод всегда состоит из целых чисел
DКартинку нельзя восстановить