В этом блоге мы расскажем о вариационном выводе, а после этого перейдем к вариационным автоэнкодерам (VAE). Этот блог содержит все детали VAE, то есть от базового определения до сравнения с автокодировщиками, математического вывода функции потерь, используемой в VAE, и реализации VAE с использованием Pytorch. Позже мы сравним VAE с другими генеративными моделями, такими как Generative Adversarial Networks (GAN).

Вступление

Во многих интересных моделях со скрытыми переменными вычислить апостериор невозможно. Вариационный вывод предоставляет в таких случаях метод вычисления приблизительного апостериорного распределения. В этом блоге мы рассмотрим вариационный вывод в контексте Variational Autoencoder (VAE), генеративной модели глубокого обучения. Прежде чем мы продолжим, ниже приводится определение скрытой переменной.

Скрытая переменная. Скрытые переменные - это переменные, которые не наблюдаются напрямую, но получаются из других переменных, или мы можем сказать, что скрытые переменные позволяют нам описывать очень сложное распределение по видимым переменным.
Давайте рассмотрим грубый пример: взгляните на изображение, показанное ниже. Предположим, я отправил вам это изображение, чтобы установить его в качестве обоев на экране. Как мы уже знаем, пиксели изображения зависят от соседей (из-за цвета текстуры и всего прочего). Теперь вы можете спросить, почему небо голубое, а не черное? (потому что я решил показать вам дневное время, а не ночное время). Вы также можете спросить, почему небо не облачно? (потому что я решил показать вам солнечный день) и т. д.
Итак, эти решения (дневное, солнечное и т. д.) явно вам не известны (они скрыты от вас). Таким образом, мы наблюдаем только изображение, но то, что мы наблюдаем, зависит от этих скрытых (скрытых) решений.

Вариационный вывод

При изучении простых моделей, таких как наивный байесовский анализ и линейная регрессия, мы предполагаем, что данные взяты из базового распределения, более вероятно, из нормального распределения. Кроме того, в наивном байесовском методе предполагается, что все образцы являются iid (независимыми и одинаково распределенными), но на самом деле это не так.

На изображении выше у нас есть модель скрытой переменной и правило Байеса для получения апостериорного распределения скрытой переменной z. Однако трудно вычислить знаменатель, то есть свидетельство, потому что оно переводится в неразрешимый интеграл в многомерных пространствах. Таким образом, мы не можем вычислить апостериорные данные из-за неубедительных доказательств.

Вариационный вывод предлагает нам использовать другое распределение q с параметрами Φ в качестве приближения к апостериорному. Самыми известными алгоритмами для вариационного вывода являются алгоритм Максимальное ожидание (EM) и Вариационные автоэнкодеры. Прежде чем перейти к вариационным автокодировщикам, давайте сделаем краткий обзор автокодировщиков.

Автоэнкодеры

Автоэнкодеры обучены восстанавливать входные данные. Автоэнкодер содержит кодировщик, который принимает входной X и сопоставляет его со скрытым представлением. Затем декодер берет это скрытое представление и пытается восстановить входные данные из него как X. Базовая архитектура автоэнкодера выглядит следующим образом:

Вариационные автоэнкодеры (VAE)

Вариационные автоэнкодеры относятся к генеративным моделям, которые обеспечивают принципиальный способ выборки из распределения модели. Вариационные автоэнкодеры имеют ту же структуру, что и автоэнкодеры. Но в автокодировщиках мы можем реконструировать только ввод, потому что h (скрытое пространство большой размерности) является вектором очень большой размерности, и только несколько векторов в этом пространстве будут фактически соответствовать осмысленным скрытым представлениям ввода. Таким образом, в VAE мы вводим только те значения h, которые наиболее вероятны. Другими словами, нас интересует выборка из P (h | X), чтобы мы выбирали только те h которые имеют большую вероятность. Таким образом, вариационные автокодеры могут выполнять как реконструкцию, так и генерацию.

  1. В VAE обучающие данные отображаются в скрытое пространство с помощью нейронной сети (кодировщик). Затем апостериорное распределение скрытого пространства (P (z | X)) и априорное распределение (P (z)) моделируются как гауссовы. Выходные данные сети - это два параметра - среднее (µ) и дисперсия (Σ), то есть параметры апостериорного распределения.
  2. Предполагается, что случайная выборка из распределения скрытого пространства генерирует входные данные.
  3. Затем вектор скрытого пространства сопоставляется с входными данными с помощью другой нейронной сети (декодер).

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

Архитектура ВАЭ

Кодировщик: кодировщик принимает в качестве входных обучающих данных и создает скрытое представление z. Скрытое представление является стохастическим, т.е. они являются параметрами распределения вероятностей (гауссовского).

Сэмплер: учитывая среднее и логарифмическое отклонение от кодировщика, мы производим выборку из Qθ (z | X), используя детерминированную функцию, созданную с помощью трюка с повторной параметризацией.

Трюк с репараметризацией: Мы знаем, что в нейронных сетях мы узнаем параметры через обратное распространение. Таким образом, VAE также использует алгоритм обратного распространения для изучения параметров. Но в VAE нам нужно, чтобы узел sampler внутри был стохастическим по своей природе, и мы должны иметь возможность вычислять градиенты узла дискретизации относительно векторов mean и log-variance. Таким образом, этот маленький человек в samplerepsilon фактически изменяет параметры наших VAE. Это позволяет векторам mean и log-variance оставаться в качестве обучаемых параметров сети, сохраняя при этом стохастичность всей системы через epsilon.

KL-дивергенция: Мы вычисляем KL-дивергенцию вариационного приближения Qθ (z | X) и истинное распределение скрытой переменной z. Это также используется в общей функции потерь и действует как регуляризатор.

KL-расхождение: он используется для измерения разницы в информации, содержащейся в двух распределениях. Чтобы узнать о происхождении KL-дивергенции и узнать о ней больше, посмотрите это видео, доступное на YouTube.

Декодер: z выбирается из выходных данных кодировщика и передается в качестве входных данных декодеру. Ошибка декодера используется в общей функции потерь и представляет собой потерю восстановления.

Функция общих потерь: общая функция потерь L (x), используемая для обучения автокодировщика, представляет собой сумму KL-расходимости и ошибки декодера.

Убыток складывается из двух выражений. Первое выражение в функции потерь фиксирует распределение вероятностей скрытой переменной и действует как регуляризатор. И второе выражение отражает идею ошибки восстановления, которая используется во всех автоэнкодерах.

Теперь, переходя к математике, вот вывод функции потерь:

Реализация

Я реализовал вариационный автокодер для набора данных MNIST в PyTorch и выполнил реконструкцию и генерацию из VAE.

Вот код VAE:

Скачивание набора данных и построение некоторых образцов изображений из набора данных.

Создал классы для кодировщика и декодера и объединил их в класс с именем VAE.

Обучение VAE и построение графика между функцией потерь и эпохами.

Построил скрытое пространство, полученное от кодировщика.

Следующий код показывает интерполяцию между цифрами из скрытого пространства. Здесь я интерполирую между цифрами 7 и 2. Это можно рассматривать как реконструкцию VAE.

Наконец, создание изображений из VAE.

Помимо этого, я также реализовал VAE для набора данных CIFAR10. Вот ссылка на репозиторий GitHub: https://github.com/bamboriyaankit/ML-Course-Project/blob/main/ML_Project_VAE_CIFAR.ipynb

Ссылка на указанный выше код: https://github.com/bamboriyaankit/ML-Course-Project/blob/main/ML_Project_VAE_MNIST%20(1).ipynb

Краткое сравнение VAE и GAN

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

Вот некоторые из важных ссылок, которые я использовал:

  1. Https://en.wikipedia.org/wiki/Variational_Bayesian_methods
  2. Https://ermongroup.github.io/cs228-notes/inference/variational/
  3. Https://www.youtube.com/watch?v=oJu649cDGyo&list=PLEAYkSg4uSQ1r-2XrJ_GBzzS6I-f8yfRU&index=148

Что касается любых объяснений или исправлений, пожалуйста, дайте мне знать в разделе комментариев.