Диагностика Mock-интервью
Главная · Мультимодальные модели

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), который прижимает все облака к стандартному нормальному распределению:

L = ошибка реконструкции + KL( N(μ, σ) || N(0, 1) )

Итог: облака разных картинок перекрываются, всё пространство вокруг нуля покрыто «смыслом» — латент становится гладким. Теперь можно сэмплировать z ∼ N(0, 1) и получать осмысленные новые картинки, а двигаясь по прямой между двумя кодами — плавно интерполировать: улыбка постепенно превращается в удивление.

Маленькая техническая хитрость — reparameterization trick: сэмпл записывают как z = μ + σ·ε, где ε ∼ N(0, 1), — случайность вынесена в ε, и градиент спокойно течёт через μ и σ при обучении.

Цена гладкости — размытость: реконструкционный лосс (обычно попиксельный MSE) заставляет декодер усреднять все правдоподобные варианты, и вместо резкой текстуры получается «мыло».

💡 Ключевая мысль Генерация — это сэмплирование из выученного распределения. VAE делает латентное пространство гладким (сэмплируй откуда угодно), GAN делает картинки резкими (дискриминатор не прощает мыла) — а диффузия потом заберёт лучшее у обоих.

GAN: генератор против дискриминатора

GAN (generative adversarial network, генеративно-состязательная сеть) заходит с другой стороны. Две сети играют друг против друга: генератор превращает случайный шум z в картинку, дискриминатор учится отличать настоящие картинки от сгенерированных. Это минимакс-игра (minimax game): дискриминатор максимизирует точность различения, генератор минимизирует её — то есть учится обманывать. Никакого попиксельного лосса нет: «хорошая картинка» — та, которую дискриминатор принял за настоящую. Поэтому GAN-ам не выгодно усреднять — усреднённое «мыло» дискриминатор мгновенно раскусит, — и картинки получаются резкими.

За резкость платят двумя хроническими болезнями:

Наследие: где они живут сегодня

Диффузия победила обоих в чистой генерации: она обучается стабильно (простой MSE-лосс вместо хрупкой игры — см. диффузионные модели), покрывает всё распределение без mode collapse и при этом выдаёт резкие картинки. Но VAE и GAN не умерли — они сменили профессию:

⚠️ Подводный камень «VAE размытый, GAN резкий» — не магия архитектур, а следствие лоссов. Попиксельный реконструкционный лосс VAE усредняет все правдоподобные ответы — усреднение и есть размытие. Состязательный лосс GAN штрафует за «неправдоподобность», поэтому усреднять невыгодно. Меняешь лосс — меняется характер артефактов; этот принцип переносится на любые генеративные модели.
🎤 На собеседовании
  • «Чем VAE отличается от автоэнкодера?» — энкодер предсказывает распределение (μ, σ), а не точку, плюс KL-штраф прижимает латент к N(0, 1): пространство гладкое, можно сэмплировать и интерполировать. У AE между кодами — «дыры».
  • «Что такое mode collapse?» — генератор GAN выдаёт малое число похожих примеров на любые z: он нашёл, чем обмануть дискриминатора, и потерял разнообразие распределения.
  • «Зачем reparameterization trick?» — z = μ + σ·ε выносит случайность в ε, чтобы градиент проходил через μ и σ; иначе через операцию «сэмплировать» бэкпроп не работает.
  • «Где VAE и GAN используются сегодня?» — VAE — энкодер/декодер латента в Stable Diffusion; GAN — апскейлеры (ESRGAN) и состязательный лосс при дистилляции диффузии.