Вариационные автокодировщики (VAE)
Функция потерь ELBO, трюк репараметризации, исследование латентного пространства, генерация изображений с VAE
«Вариационные автокодировщики (VAE)» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.
От автокодировщика к VAE
Обычный автокодировщик учится отображать данные в виде разрозненных точек, поэтому выборка новых точек приводит к бессмысленным результатам. Вариационный автокодировщик (VAE) учится формировать гладкое непрерывное латентное пространство, из которого можно выбирать точки, превращая его в полноценную генеративную модель.
Кодирование в распределение
Вместо одной точки энкодер VAE выдаёт для каждого входного примера распределение: среднее mu и логарифм дисперсии log_var. Каждый входной пример отображается в небольшую размытую область латентного пространства, а не в одну точку.
class Encoder(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(784, 256)
self.fc_mu = nn.Linear(256, 64)
self.fc_logvar = nn.Linear(256, 64)Зачем нужны mu и log_var?
Мы предсказываем log_var, а не саму дисперсию, потому что это значение может быть любым вещественным числом и не требует ограничения положительностью. Кроме того, такой подход численно устойчив. При необходимости дисперсия восстанавливается возведением в экспоненту.
def forward(self, x):
h = torch.relu(self.fc(x))
return self.fc_mu(h), self.fc_logvar(h)Выборка латентного z
Чтобы выполнить декодирование, необходимо выбрать z из предсказанного распределения. При наивной случайной выборке дифференцирование невозможно, поэтому через неё нельзя выполнить обратное распространение ошибки. Это исправляет трюк репараметризации.
Трюк репараметризации
Перепишем выборку в виде z = mu + eps * exp(0.5 * log_var), где eps — случайный шум. Теперь случайность содержится в eps (градиент для него не нужен), а градиенты проходят через mu и log_var.
def reparameterize(mu, log_var):
std = torch.exp(0.5 * log_var)
eps = torch.randn_like(std)
return mu + eps * stdДекодер
Декодер принимает выбранное значение z и реконструирует изображение, как обычный декодер автокодировщика: преобразует 64 измерения обратно в 784 пикселя и использует Sigmoid на выходе.
decoder = nn.Sequential(
nn.Linear(64, 256),
nn.ReLU(),
nn.Linear(256, 784),
nn.Sigmoid()
)Слагаемое ошибки реконструкции
Первая часть функции потерь VAE отвечает за реконструкцию: насколько хорошо декодированное изображение совпадает с входным. Для пикселей используется бинарная кросс-энтропия (или MSE).
recon_loss = nn.functional.binary_cross_entropy(
recon, x, reduction="sum"
)Слагаемое KL-дивергенции
Вторая часть — это KL-дивергенция, которая приближает каждое закодированное распределение к стандартному нормальному распределению. Это регуляризует латентное пространство, делая его гладким и непрерывным и обеспечивая возможность генерации.
kl = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())Целевая функция ELBO
VAE максимизируют ELBO (нижнюю границу свидетельства), что эквивалентно минимизации reconstruction + KL. Реконструкция делает выходные данные точными, а KL поддерживает правильную структуру пространства. Весь смысл заключается в балансе между этими двумя составляющими.
loss = recon_loss + kl
loss.backward()Генерация новых изображений
Поскольку латентное пространство соответствует стандартному нормальному распределению, можно генерировать совершенно новые изображения: выбирать z из N(0,1) и декодировать его, не подавая на вход исходное изображение.
with torch.no_grad():
z = torch.randn(16, 64)
new_images = decoder(z) # 16 generated samplesПочему важны VAE?
VAE формируют обоснованное гладкое латентное пространство, в котором можно выполнять интерполяцию и выборку. Они лежат в основе многих генеративных методов и показывают главный принцип: нужно учиться моделировать распределения, а не только отдельные точки.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли принцип работы VAE.
Повторение: вариационные автокодировщики
Вы изучили VAE: энкодер выдаёт mu и log_var, а трюк репараметризации z = mu + eps * exp(0.5 * log_var) сохраняет возможность дифференцирования при выборке. Функция потерь имеет вид ELBO = reconstruction + KL. Выборка z из N(0,1) с последующим декодированием позволяет генерировать новые изображения.
Часто задаваемые вопросы
Урок «Вариационные автокодировщики (VAE)» бесплатный?
Да — полный текст урока «Вариационные автокодировщики (VAE)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.
Чему я научусь в уроке «Вариационные автокодировщики (VAE)»?
Функция потерь ELBO, трюк репараметризации, исследование латентного пространства, генерация изображений с VAE Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn AI with Python?
Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Вариационные автокодировщики (VAE)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn AI with Python?
Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Автокодировщики для обучения представлений
- Вариационные автокодировщики (VAE)
- GAN: генератор и дискриминатор
- Условные GAN и перенос стиля