Глубокое обучение
Autoencoders и VAE
2013 год. Дидерик Кингма публикует статью 'Auto-Encoding Variational Bayes' с математикой на 14 страницах и кодом на 50 строк. Через год VAE генерируют лица людей, которых никогда не существовало, через два года - интерполяции между лицами знаменитостей в Hollywood. К 2023 году те же принципы стоят в сердце Stable Diffusion: VAE кодирует изображения в латентное пространство, diffusion работает там, decoder возвращает результат. Один трюк - reparameterization - изменил поле deep learning.
- **Anomaly detection в production**: AE для credit card fraud, manufacturing defects, network intrusion - аномалия = высокая reconstruction error на конкретной точке (банки тренируют модели на нормальном поведении)
- **Recommender systems**: VAE-CF, выпущенная Netflix в 2018, обучается на матрице 'пользователь x фильм' и предлагает рекомендации через декодирование латентного вектора пользователя
- **Drug discovery**: ChemVAE и MolVAE кодируют молекулы как SMILES-строки в латентное пространство; нахождение новых соединений = поиск точек z с нужными свойствами и декодирование обратно в молекулярную формулу
От глубоких автоэнкодеров к VAE
В 2006 году Geoffrey Hinton и Ruslan Salakhutdinov опубликовали статью в Science, показав, что глубокие автоэнкодеры, предобученные послойно, сжимают данные намного лучше PCA - ключевой результат возрождения deep learning. В 2013 году Diederik Kingma и Max Welling предложили Variational Autoencoder, превратив автоэнкодер в вероятностную генеративную модель. Их reparameterization trick сделал шаг сэмплирования дифференцируемым, поэтому всю модель можно обучать end-to-end через backpropagation, и это стало основой современного генеративного моделирования.
Предварительные знания
- Архитектуры encoder-decoder и bottleneck
- Reconstruction loss (MSE) и обучение по градиентам
- Основы вероятности: нормальное распределение, KL-дивергенция
Encoder-Decoder архитектура
**Автоэнкодер** - нейросеть, которая учится копировать вход на выход через узкое горлышко. Структура: encoder сжимает x в латентный вектор z размерности много меньше входа, decoder восстанавливает x' из z. Потери - MSE или binary cross-entropy между x и x'. Главная ценность - не сама копия, а латентный код z: сеть вынуждена выучить компактное представление, которое сохраняет существенные признаки. Это unsupervised learning - метки не нужны, только сами данные.
Варианты автоэнкодеров: Denoising AE - на вход подаётся зашумлённый x + noise, цель - восстановить чистый x. Сеть учится игнорировать шум; Sparse AE - добавляется L1-регуляризация на активации z, заставляя большую часть нейронов быть нулём - получается интерпретируемое представление; Contractive AE - регуляризация на якобиан encoder, делает z устойчивым к малым изменениям x. Все эти варианты не решают главную проблему обычного AE: латентное пространство может быть 'дырявым' - случайная точка z вне обучающих примеров декодируется в мусор.
Что произойдёт с автоэнкодером, если убрать bottleneck (сделать latent_dim равным размеру входа)?
Латентное пространство
Латентное пространство z автоэнкодера - это компрессированная карта входных данных. После обучения на MNIST 32-мерный z кодирует характеристики цифр: толщина линий, наклон, форма петель. Интерполяция в латентном пространстве показывает плавные переходы: точка между 'три' и 'восемь' в латентном пространстве декодируется в гибрид, морфирующий между ними. Это уже больше, чем просто сжатие - сеть учит представление о структуре данных.
Проблема обычного AE: латентное пространство **не структурировано**. Соседние точки в z могут декодироваться в совершенно разные образы, и большие области пространства не покрыты обучающими примерами - случайная z в этих 'дырах' декодируется в шум. Поэтому обычный AE плохо подходит для генерации: семплирование z ~ N(0, I) и декодирование почти всегда даёт мусор. VAE решает именно эту проблему - заставляет латентное распределение быть гладким, заполненным и приближённым к N(0, I).
Почему обычный автоэнкодер плохо подходит для генерации новых образов?
KL-дивергенция и VAE
**Variational Autoencoder (VAE)**, Kingma & Welling 2013, решает проблему дырявого латентного пространства принципиально другим путём. Encoder выдаёт не точку z, а параметры распределения - μ и σ нормального распределения q(z|x). Из этого распределения семплируется z ~ N(μ, σ²) и подаётся в decoder. Loss состоит из двух частей: (1) reconstruction loss как раньше, (2) KL-дивергенция KL(q(z|x) || N(0, I)) - штраф за отклонение латентного распределения от стандартного нормального. Этот штраф делает латентное пространство гладким и непрерывным.
ELBO loss: reconstruction + KL-дивергенция к prior p(z) = N(0, I).
Reparameterization trick - ключевой технический приём VAE: чтобы пропустить градиент через стохастический семплинг z ~ N(μ, σ²), записывают z = μ + σ * ε, где ε ~ N(0, I) - случайный шум. Теперь градиенты текут через μ и σ (детерминированные функции encoder), а ε воспринимается как 'data noise'. Без этого трюка backprop через семплинг невозможен. KL-дивергенция для двух нормальных распределений считается аналитически: KL = 0.5 * sum(μ² + σ² - 1 - log σ²).
Зачем VAE использует reparameterization trick z = μ + σ * ε вместо прямого семплирования z ~ N(μ, σ²)?
Генерация через VAE
После обучения VAE генерация работает в одну строчку: z ~ N(0, I) -> decoder(z) -> новый образ. Благодаря KL-регуляризации латентное пространство приближено к стандартному нормальному, и случайные точки декодируются в осмысленные образы (а не в шум, как у обычного AE). VAE даёт принципиальные генеративные возможности: условную генерацию (Conditional VAE - подавать класс c вместе с z), интерполяцию между конкретными образами через линейную комбинацию их μ-векторов, и атрибутную арифметику в латентном пространстве.
VAE vs GAN - две основные генеративные модели до прихода diffusion. VAE: проще тренировать, стабильно сходится, явная вероятностная интерпретация (ELBO), но изображения 'blurry' из-за усреднения по латентному распределению. GAN: резкие изображения, но нестабильное обучение (mode collapse, vanishing gradients), нет вероятностной интерпретации. Diffusion-модели (DALL-E 2, Stable Diffusion) - это итеративный процесс шумоподавления, дающий лучшее качество и стабильность, но за счёт скорости (десятки forward-проходов на одну картинку). VAE остаётся актуальным как латентный модуль (Stable Diffusion внутри использует VAE для компрессии).
Autoencoder и VAE - одна и та же модель с разной регуляризацией
Autoencoder - детерминированная функция компрессии, VAE - вероятностная генеративная модель
AE минимизирует только reconstruction loss и выдаёт точку z; VAE моделирует p(x, z) и оптимизирует ELBO (нижнюю границу log-likelihood). Различие фундаментальное: AE - feature learning, VAE - density modeling. Из VAE можно семплировать новые образы; из AE - нет (без trickery).
Образы, генерируемые VAE на MNIST, выглядят 'blurry' (размыто). Какая принципиальная причина?
Ключевые идеи
- **Autoencoder** - encoder + decoder с узким bottleneck, обучается копировать вход; ценность - в латентном представлении z, выученном через компрессию
- **Латентное пространство** обычного AE не структурировано: случайные z декодируются в шум, что делает обычный AE плохим генератором
- **VAE** заменяет точечный z на распределение q(z|x) = N(μ, σ²) и добавляет KL-divergence к N(0, I) - это делает латентное пространство гладким и пригодным для генерации
- **Reparameterization trick** z = μ + σ * ε - технический ключ к VAE, делающий стохастический семплинг дифференцируемым через изоляцию случайности в ε
Связанные темы
Reparameterization trick из вступления стал основой современных генеративных моделей. VAE - один из трёх главных подходов (наряду с GAN и diffusion), и его принципы пронизывают весь стек глубокого обучения:
- GAN — Альтернативный генеративный подход с adversarial loss - резче, но нестабильнее VAE. Современные подходы (StyleGAN, Stable Diffusion) комбинируют идеи обоих
- Diffusion модели — Stable Diffusion использует VAE как латентный модуль: encoder сжимает 512x512 -> 64x64x4, diffusion работает в латентном пространстве, decoder возвращает результат
- Representation Learning — Латентное пространство VAE - один из канонических примеров unsupervised representation learning, наряду с контрастивными подходами (SimCLR, MoCo)
Вопросы для размышления
- VAE даёт 'blurry' изображения, GAN - резкие, но нестабильные, diffusion - резкие и стабильные, но медленные. Какие компромиссы оправдывают использование каждой модели в 2025 году?
- Reparameterization trick решил конкретную проблему - дифференцируемость стохастического семплинга. Какие другие задачи в ML могли бы выиграть от подобного 'выноса случайности наружу'?
- Если латентное пространство VAE даёт смысленные интерполяции и арифметику, можно ли использовать его для понимания внутренних представлений нейросетей в целом? Какие ограничения у этого подхода?
Связанные уроки
- dl-12 — Distributed training - контекст для масштабирования VAE
- dl-14 — GAN - альтернативный генеративный фреймворк, сравнение с VAE
- it-03 — KL-дивергенция в VAE loss - прямо из information theory
- prob-04-bayes — VAE - байесовский inference: prior, likelihood, posterior
- la-13-eigenvectors