Модуль IV·Статья II·~3 мин чтения
Вариационные автоэнкодеры и диффузионные модели
Генеративные модели
Превратить статью в подкаст
Выберите голоса, формат и длину — AI запишет аудио
Вариационные автоэнкодеры и диффузионные модели
VAE и диффузионные модели — альтернативы GAN для генерации данных с принципиально разными математическими основаниями. VAE основан на вариационном байесовском выводе; диффузионные модели — на итеративном денойзинге и связи с диффузионными уравнениями.
Вариационный автоэнкодер (VAE, Kingma & Welling, 2013)
Проблема: Хотим обучить генеративную модель p_θ(x) = ∫ p_θ(x|z) p(z) dz, где z — латентный код. Интеграл по всем z неаналитичен (высокоразмерное интегрирование).
Evidence Lower BOund (ELBO):
log p_θ(x) ≥ E_{q_φ(z|x)}[log p_θ(x|z)] − KL(q_φ(z|x) || p(z)) = ELBO(θ, φ; x)
Расшифровка двух слагаемых: (1) E[log p_θ(x|z)] — reconstruction loss: насколько хорошо декодер восстанавливает x из z — качество реконструкции. (2) −KL(q_φ(z|x)||p(z)) — KL-дивергенция между апостериором q_φ(z|x) и приором p(z)=N(0,I) — регуляризация, тянет апостериор к стандартному гауссиану.
Архитектура VAE: Encoder: x → (μ_φ(x), log σ²_φ(x)) (параметры апостериора). Sampling: z = μ_φ(x) + σ_φ(x) ⊙ ε, ε ~ N(0,I) (reparameterization trick — делает выборку дифференцируемой). Decoder: z → x̂ (реконструкция).
Reparameterization trick: Проблема: нельзя взять градиент через стохастическую выборку z ~ q_φ(z|x). Решение: z = μ + σ · ε, ε ~ N(0,I). Теперь случайность в ε (не зависит от φ), и ∂z/∂φ = ∂μ/∂φ + σ · ∂(log σ)/∂φ · ε — аналитично.
β-VAE (Higgins et al., 2017): ELBO_β = E[log p(x|z)] − β · KL. При β > 1: сильная регуляризация → «диспутанглментованные» представления (факторы вариации независимы). Например: в latent-пространстве CelebA: z₁ → освещённость, z₂ → поворот, z₃ → улыбка (интерпретируемые независимые измерения).
Диффузионные модели (Ho et al., DDPM, 2020)
Ключевая идея: Постепенно добавляем шум к данным (прямой процесс), затем обучаем нейросеть «обращать» этот процесс (обратный процесс — денойзинг).
Прямой процесс:
q(xₜ|xₜ₋₁) = N(xₜ; √(1−βₜ)xₜ₋₁, βₜI)
Напрямую к любому шагу: xₜ = √ᾱₜ x₀ + √(1−ᾱₜ) ε, ᾱₜ = Πₛ≤ₜ(1−βₛ), ε ~ N(0,I).
Расшифровка: ᾱₜ убывает от 1 (при t=0) к 0 (при t=T). √ᾱₜ x₀ — «сигнальная» компонента. √(1−ᾱₜ) ε — «шумовая». При T=1000: x_T ≈ N(0,I) (чистый шум).
Обратный процесс — цель обучения:
L = E_{x₀,ε,t}[||ε − ε_θ(xₜ, t)||²]
Обучаем ε_θ(xₜ, t) предсказывать добавленный шум ε по зашумлённой картинке xₜ и номеру шага t. Нейросеть: обычно U-Net с temporsal embedding для t.
Генерация: Начинаем с x_T ~ N(0,I). Итеративно денойзируем: xₜ₋₁ = (xₜ − √(1−ᾱₜ)ε_θ(xₜ,t))/√ᾱₜ + σₜ·ε' (по формуле). T шагов → x₀ (реальное изображение). Скорость: 1000 шагов = медленно. DDIM (Song et al., 2021): 20–50 шагов, детерминированный sampling.
Latent Diffusion и Stable Diffusion
Проблема DDPM: Работает в пространстве пикселей — медленно (512×512×3 = 786K итераций в шаге).
Latent Diffusion (Rombach et al., 2022): Сжимаем x → z = E(x) через предобученный VAE (сжатие ≈ 8× = 64×64×4). Диффузия в z (намного меньше). Декодируем x = D(z). Результат: 8× быстрее при сопоставимом качестве.
Conditioning (Stable Diffusion): Текстовый промпт → CLIP text encoder → embedding c. U-Net архитектура добавляет c через cross-attention: Q = WQ·z (из latent), K = WK·c, V = WV·c. На каждом шаге денойзинга картинка «согласуется» с текстом.
Classifier-Free Guidance: обучаем и условную ε_θ(xₜ,c) и безусловную ε_θ(xₜ,∅). При sampling: ε_guided = ε(xₜ,∅) + w·(ε(xₜ,c) − ε(xₜ,∅)). w — guidance scale: w=7 — сильное следование промпту, w=1 — разнообразие.
Численный пример
VAE для CELEBA-HQ (256×256 лица): z_dim=512. KL-loss после обучения: ≈ 30 нат (разумный баланс реконструкция/регуляризация). Интерполяция z₁ → z₂ (8 шагов): плавный «морфинг» между лицами. β-VAE (β=10): скрытые переменные интерпретируемы — z₁ коррелирует с освещённостью (r=0.83).
DDPM (FFHQ 256×256): 1000 шагов, FID = 3.17 (лучше StyleGAN2-ADA в некоторых режимах). DDIM (100 шагов): FID = 4.16 (в 10× быстрее генерации). Classifier-free guidance w=7.5: изображения чётко следуют текстовому промпту.
Задание: Реализуйте VAE для CelebA (64×64). (1) Архитектура: Conv-Encoder → (μ,σ) → z(dim=128) → ConvTranspose-Decoder. Loss = BCE + β·KL. (2) Обучите при β=1,4,10. Визуализируйте: реконструкции, случайные генерации, интерполяции. (3) β=10: используйте t-SNE для визуализации z-пространства (раскрасьте по признаку «улыбка»). Хорошо ли разделяется?
§ Акт · что дальше