VAE и GAN: генерация до диффузии
До диффузии картинки генерировали VAE и GAN: вариационный автоэнкодер учит гладкое латентное пространство, из которого можно сэмплировать, а GAN устраивает состязание генератора с дискриминатором. Оба живы: VAE — внутри Stable Diffusion, GAN — в апскейлерах.
Интуиция: что значит «генерировать»
Классификатор отвечает на вопрос «что это?». Генеративная модель (generative model) решает задачу посложнее: выучить распределение данных p(x) и уметь из него сэмплировать — выдавать новые примеры, которых не было в обучающей выборке, но которые выглядят так, будто были. Не «запомнить все лица», а «понять, какими бывают лица», — и нарисовать ещё одно.
Первый кандидат — автоэнкодер (autoencoder, AE): энкодер сжимает картинку в короткий латентный вектор (latent vector) z, декодер восстанавливает картинку обратно, лосс — ошибка реконструкции. Сжатие работает отлично (это почти снижение размерности, только нелинейное), но для генерации AE непригоден: его латентное пространство «дырявое». Коды обучающих картинок — отдельные островки, а что декодер выдаст в точке между ними — никто не обещал. Возьмёшь случайный z — получишь мусор.
VAE: предсказываем распределение, а не точку
Вариационный автоэнкодер (VAE, variational autoencoder) чинит это двумя приёмами. Во-первых, энкодер выдаёт не точку, а распределение: для каждой картинки — среднее μ и разброс σ, и в декодер идёт случайный сэмпл из этого облака. Во-вторых, к лоссу добавляется KL-штраф (KL divergence), который прижимает все облака к стандартному нормальному распределению:
Итог: облака разных картинок перекрываются, всё пространство вокруг нуля покрыто «смыслом» — латент становится гладким. Теперь можно сэмплировать z ∼ N(0, 1) и получать осмысленные новые картинки, а двигаясь по прямой между двумя кодами — плавно интерполировать: улыбка постепенно превращается в удивление.
Маленькая техническая хитрость — reparameterization trick: сэмпл записывают как z = μ + σ·ε, где ε ∼ N(0, 1), — случайность вынесена в ε, и градиент спокойно течёт через μ и σ при обучении.
Цена гладкости — размытость: реконструкционный лосс (обычно попиксельный MSE) заставляет декодер усреднять все правдоподобные варианты, и вместо резкой текстуры получается «мыло».
GAN: генератор против дискриминатора
GAN (generative adversarial network, генеративно-состязательная сеть) заходит с другой стороны. Две сети играют друг против друга: генератор превращает случайный шум z в картинку, дискриминатор учится отличать настоящие картинки от сгенерированных. Это минимакс-игра (minimax game): дискриминатор максимизирует точность различения, генератор минимизирует её — то есть учится обманывать. Никакого попиксельного лосса нет: «хорошая картинка» — та, которую дискриминатор принял за настоящую. Поэтому GAN-ам не выгодно усреднять — усреднённое «мыло» дискриминатор мгновенно раскусит, — и картинки получаются резкими.
За резкость платят двумя хроническими болезнями:
- Mode collapse (коллапс мод) — генератор находит пару примеров, которые стабильно обманывают дискриминатора, и застревает на них: какие бы z ни подавали, на выходе почти одно и то же. Разнообразие распределения потеряно, хотя каждая отдельная картинка выглядит прилично.
- Нестабильность обучения — равновесие двух соревнующихся сетей хрупкое: если дискриминатор слишком силён, генератор не получает полезного градиента; если слаб — генератору не у кого учиться. Обучение GAN — это ручная балансировка learning rate, архитектур и трюков.
Наследие: где они живут сегодня
Диффузия победила обоих в чистой генерации: она обучается стабильно (простой MSE-лосс вместо хрупкой игры — см. диффузионные модели), покрывает всё распределение без mode collapse и при этом выдаёт резкие картинки. Но VAE и GAN не умерли — они сменили профессию:
- VAE — сердце latent diffusion. В Stable Diffusion именно VAE сжимает картинку 512×512 в компактный латент 64×64, где и работает диффузия, а его декодер разворачивает результат обратно в пиксели. Гладкий латент из этой темы — буквально рабочее пространство современных генераторов.
- GAN — в апскейлерах и дистилляции. Real-ESRGAN и его родня повышают разрешение фото и видео; состязательный лосс добавляют при дистилляции диффузии в 1–4 шага, чтобы вернуть резкость, потерянную при ускорении.
- «Чем VAE отличается от автоэнкодера?» — энкодер предсказывает распределение (μ, σ), а не точку, плюс KL-штраф прижимает латент к N(0, 1): пространство гладкое, можно сэмплировать и интерполировать. У AE между кодами — «дыры».
- «Что такое mode collapse?» — генератор GAN выдаёт малое число похожих примеров на любые z: он нашёл, чем обмануть дискриминатора, и потерял разнообразие распределения.
- «Зачем reparameterization trick?» — z = μ + σ·ε выносит случайность в ε, чтобы градиент проходил через μ и σ; иначе через операцию «сэмплировать» бэкпроп не работает.
- «Где VAE и GAN используются сегодня?» — VAE — энкодер/декодер латента в Stable Diffusion; GAN — апскейлеры (ESRGAN) и состязательный лосс при дистилляции диффузии.