Латентное пространство: сжатый смысл
Урок вводит ключевую для 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.