EssayAI
Блог
Блог
Математика и алгоритмы

Вариационный автоэнкодер (VAE): как сеть учится генерировать

20 июня 2026Время чтения: 8 минут
#вариационный автоэнкодер#VAE#латентное пространство#ELBO#генеративные модели
Вариационный автоэнкодер (VAE): как сеть учится генерировать

Вариационный автоэнкодер (VAE) - это порождающая модель, которая учится не просто сжимать данные, а описывать их распределение в латентном пространстве. Отличие от обычного автоэнкодера принципиальное: энкодер выдаёт не точку, а параметры распределения, из которого латент сэмплируется случайно. Благодаря этому из VAE можно генерировать новые правдоподобные объекты, а не только восстанавливать имеющиеся. Ниже разберём вероятностную постановку, трюк репараметризации, функцию потерь ELBO и роль KL-расхождения. Если нужно решить конкретную задачу по теме, соберите запрос в форме ниже.

Что такое вариационный автоэнкодер

VAE - это вероятностная модель, которая предполагает, что наблюдаемые данные xx порождаются из скрытой переменной zz через распределение pθ(xz)p_\theta(x \mid z), а сам латент берётся из простого априорного распределения p(z)p(z), обычно стандартного нормального N(0,I)\mathcal{N}(0, I). Задача обучения - настроить параметры θ\theta так, чтобы модель правдоподобно объясняла данные.

Проблема в том, что апостериорное распределение pθ(zx)p_\theta(z \mid x) - то есть какой латент породил данный объект - вычислить напрямую невозможно: интеграл по всем zz неберущийся. VAE обходит это вариационным приближением: вводит обучаемое распределение qϕ(zx)q_\phi(z \mid x), которое играет роль энкодера и приближает истинный апостериор. Декодер pθ(xz)p_\theta(x \mid z) восстанавливает объект из латента. Обе части - нейросети, обучаемые совместно.

Схема вариационного автоэнкодера: энкодер выдаёт среднее и дисперсию, латент сэмплируется и подаётся в декодер
Схема вариационного автоэнкодера: энкодер выдаёт среднее и дисперсию, латент сэмплируется и подаётся в декодер

Вероятностный энкодер: среднее и дисперсия

Ключевое отличие от классического автоэнкодера - на выходе энкодера. Обычный автоэнкодер выдаёт код z=f(x)z = f(x) как одну точку. Вероятностный энкодер VAE выдаёт два вектора: вектор средних μ(x)\mu(x) и вектор логарифмов дисперсий logσ2(x)\log \sigma^2(x). Они задают нормальное распределение в латентном пространстве:

qϕ(zx)=N(z; μ(x), σ2(x)I)q_\phi(z \mid x) = \mathcal{N}\bigl(z;\ \mu(x),\ \sigma^2(x) I\bigr)

Латент для конкретного объекта не фиксирован - это целое облачко в латентном пространстве. Чтобы получить код, из этого облачка делают случайную выборку. Именно поэтому один и тот же объект при каждом проходе даёт чуть разный латент, и сеть учится тому, что близкие точки латента должны давать похожие реконструкции. Это и делает латентное пространство гладким и пригодным для генерации.

Энкодер выдаёт именно логарифм дисперсии, а не саму дисперсию. Так число на выходе может быть любым вещественным, а после экспоненты дисперсия всегда положительна - это устойчивее для оптимизации.

Трюк репараметризации

Сэмплирование из распределения - операция случайная, и через неё нельзя напрямую пропустить градиент при обратном распространении. Если бы латент брался как zN(μ,σ2)z \sim \mathcal{N}(\mu, \sigma^2) «в лоб», то градиент по μ\mu и σ\sigma не посчитать: случайный узел разрывает граф вычислений.

Репараметризация (reparameterization trick) решает это элегантно. Случайность выносят в отдельную независимую переменную ε\varepsilon, а латент собирают детерминированной формулой:

z=μ(x)+σ(x)ε,εN(0,I)z = \mu(x) + \sigma(x) \odot \varepsilon, \qquad \varepsilon \sim \mathcal{N}(0, I)

Здесь \odot - поэлементное умножение. Теперь zz зависит от μ\mu и σ\sigma гладко и дифференцируемо, а вся случайность сидит в ε\varepsilon, через которую градиент пропускать не нужно. Это единственный приём, делающий VAE обучаемым обычным градиентным спуском.

Трюк репараметризации: случайность выносится в отдельный шум, латент собирается дифференцируемой формулой
Трюк репараметризации: случайность выносится в отдельный шум, латент собирается дифференцируемой формулой

Функция потерь: ELBO

VAE максимизирует нижнюю оценку правдоподобия данных - Evidence Lower Bound (ELBO). Для одного объекта её записывают так:

L(x)=Eqϕ(zx)[logpθ(xz)]реконструкцияDKL(qϕ(zx)  p(z))регуляризация\mathcal{L}(x) = \underbrace{\mathbb{E}_{q_\phi(z \mid x)}\bigl[\log p_\theta(x \mid z)\bigr]}_{\text{реконструкция}} - \underbrace{D_{KL}\bigl(q_\phi(z \mid x)\ \|\ p(z)\bigr)}_{\text{регуляризация}}

Первый член - ожидаемое логарифмическое правдоподобие реконструкции: насколько хорошо декодер восстанавливает вход из сэмплированного латента. Он играет ту же роль, что MSE или кросс-энтропия в обычном автоэнкодере. Второй член - KL-расхождение между распределением энкодера и априором N(0,I)\mathcal{N}(0, I): оно тянет облачка латентов к началу координат и не даёт им разбегаться.

На практике ELBO максимизируют, то есть минимизируют величину L(x)-\mathcal{L}(x). Реконструкционный член оценивают по сэмплам, а KL-член при гауссовых распределениях имеет замкнутую формулу:

DKL=12j=1d(1+logσj2μj2σj2)D_{KL} = -\frac{1}{2} \sum_{j=1}^{d} \bigl(1 + \log \sigma_j^2 - \mu_j^2 - \sigma_j^2\bigr)

где dd - размерность латента. Никакого интегрирования по сэмплам для этого члена не нужно - он считается аналитически по выходам энкодера.

KL-расхождение и баланс двух сил

Две части ELBO тянут модель в разные стороны, и именно их баланс определяет поведение VAE. Реконструкционный член хочет, чтобы латенты были как можно более «информативными»: разнёс бы объекты подальше друг от друга, тогда декодер не путает их и восстанавливает точно. KL-член, наоборот, штрафует за отклонение от стандартного нормального - он сжимает латенты к нулю и заставляет распределения объектов перекрываться.

Если KL-член задавить, VAE вырождается в обычный автоэнкодер: латенты расползаются, между кластерами появляются «дыры», и генерация из априора даёт мусор. Если KL-член сделать слишком сильным, наступает posterior collapse - энкодер игнорирует вход, выдаёт почти N(0,I)\mathcal{N}(0, I) для всех объектов, и реконструкции становятся одинаково размытыми. Рабочая точка - посередине.

Чтобы управлять этим балансом явно, в β\beta-VAE перед KL-членом ставят коэффициент β\beta:

Lβ(x)=Eqϕ(zx)[logpθ(xz)]βDKL(qϕ(zx)  p(z))\mathcal{L}_\beta(x) = \mathbb{E}_{q_\phi(z \mid x)}\bigl[\log p_\theta(x \mid z)\bigr] - \beta\, D_{KL}\bigl(q_\phi(z \mid x)\ \|\ p(z)\bigr)

При β>1\beta > 1 латентное пространство становится более структурированным и «развязанным» (disentangled): отдельные оси латента начинают отвечать за отдельные осмысленные факторы вариации. Расплата - реконструкция становится грубее.

Чем VAE отличается от обычного автоэнкодера

Различие глубже, чем просто «случайный латент». Обычный автоэнкодер оптимизирует только реконструкцию и никак не структурирует латентное пространство: точки между кластерами могут декодироваться в бессмыслицу, и сэмплировать из такого пространства нельзя. VAE добавляет к реконструкции вероятностную регуляризацию, которая делает латент непрерывным и совпадающим с известным априором. Поэтому из VAE можно просто взять zN(0,I)z \sim \mathcal{N}(0, I), прогнать через декодер и получить новый правдоподобный объект.

СвойствоОбычный автоэнкодерВариационный (VAE)
Выход энкодераточка zzпараметры μ\mu, σ\sigma
Латентное пространствопроизвольноесогласовано с N(0,I)\mathcal{N}(0, I)
Генерация новых объектовнетда, сэмплированием из априора
Функция потерьреконструкцияреконструкция плюс KL

По сути VAE - это автоэнкодер, превращённый в честную порождающую модель ценой одного дополнительного члена в потере и одного трюка с сэмплированием.

Где применяют вариационные автоэнкодеры

VAE используют там, где важна не только точность восстановления, но и осмысленная структура латента.

  • Генерация данных. Из априора сэмплируют новые лица, цифры, молекулы, мелодии. По сравнению с GAN обучение VAE стабильнее, хотя картинки чуть более размытые.
  • Интерполяция и редактирование. Плавное движение по прямой между двумя латентами даёт плавную морфировку объектов - лицо постепенно меняет выражение, цифра перетекает в другую.
  • Поиск аномалий. Как и обычный автоэнкодер, VAE плохо реконструирует нетипичные объекты, но даёт ещё и вероятностную оценку правдоподобия.
  • Снижение размерности с гладким латентом. Латент VAE удобнее для последующих задач, чем у обычного автоэнкодера, именно из-за непрерывности.
  • Условная генерация (CVAE). Если подать в энкодер и декодер метку класса, можно генерировать объекты заданного класса.

Частые ошибки

  • Путают выход энкодера с точкой. В VAE энкодер выдаёт μ\mu и logσ2\log \sigma^2, а не готовый код. Латент получается сэмплированием - без него это уже не VAE.
  • Забывают про репараметризацию. Если сэмплировать zz напрямую из N(μ,σ2)\mathcal{N}(\mu, \sigma^2), градиент по энкодеру не посчитается и сеть не обучится.
  • Перекашивают баланс ELBO. Слишком сильный KL ведёт к posterior collapse и размытым реконструкциям, слишком слабый - к разрывному латенту и мусорной генерации.
  • Берут дисперсию вместо логарифма. Энкодер должен выдавать logσ2\log \sigma^2, иначе приходится насильно держать выход положительным, и оптимизация становится неустойчивой.
  • Ждут от VAE резких картинок. Усреднение по латентному облачку и MSE-потеря дают характерную размытость. За резкость отвечают другие модели или гибриды с GAN.

FAQ

Чем VAE отличается от GAN? VAE учит явное распределение и оптимизирует правдоподобие через ELBO, у него есть энкодер и стабильное обучение, но картинки получаются размытее. GAN не имеет энкодера и учится в игре генератора с дискриминатором - даёт резче, но обучается капризнее и не даёт оценки правдоподобия. Часто их комбинируют (VAE-GAN).

Зачем VAE репараметризация? Чтобы пропустить градиент через случайный шаг сэмплирования. Случайность выносят в независимую переменную ε\varepsilon, а латент собирают дифференцируемой формулой z=μ+σεz = \mu + \sigma \odot \varepsilon. Без этого трюка обратное распространение через сэмплирование невозможно.

Что такое posterior collapse? Это вырождение, когда энкодер перестаёт зависеть от входа и выдаёт для всех объектов почти стандартное нормальное распределение. KL-член обнуляется, но реконструкции становятся одинаково размытыми - модель фактически игнорирует латент. Лечат отжигом веса KL, β\beta-VAE или более слабым декодером.

Коротко

Вариационный автоэнкодер превращает обычный автоэнкодер в порождающую модель: энкодер выдаёт параметры распределения μ\mu и σ\sigma, латент сэмплируется через трюк репараметризации z=μ+σεz = \mu + \sigma \odot \varepsilon, а обучение максимизирует ELBO - сумму реконструкции и KL-расхождения с априором N(0,I)\mathcal{N}(0, I). KL-член делает латентное пространство гладким и согласованным с априором, поэтому из VAE можно генерировать новые объекты простым сэмплированием. Баланс двух членов критичен: его перекос ведёт либо к разрывному латенту, либо к posterior collapse.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

Читайте также