Генеративные модели — это творческие поклонники сообщества машинного обучения. Они могут изучать совместное распределение обучающих данных, что позволяет нам генерировать новый текст/изображения/аудио, похожие на то, что видела модель. Для обучения хорошей генеративной модели требуется много данных, особенно если точки данных являются высокоразмерными.

Вариационные автоэнкодеры, или VAE, представляют собой тип генеративной модели, которая сжимает входные данные в низкоразмерный вектор, а затем восстанавливает исходный ввод из этого низкоразмерного представления.

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

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

Прежде чем мы поймем VAE, мы должны сначала понять шаг «сжатия». Кодирование данных в низкоразмерном представлении — это метод, известный как уменьшение размерности.

Это схема автоэнкодера (к «вариационной» части мы вернемся позже) — обратите внимание, мы называем сжатое представление скрытым пространством. Вектор скрытого пространства — это низкоразмерное представление, которое фиксирует ключевые характеристики входных данных. «Скрытый» означает скрытый — модель делает вывод, что хранить в скрытом векторе, считывая шаблоны на входе. Иногда он может хранить интерпретируемую информацию, такую ​​как форма/цвет глаз, но в других случаях он может хранить вещи, которые нельзя наблюдать напрямую.

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

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

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

После обучения нашего автоэнкодера генерировать новые входные данные очень просто! Мы можем просто выбрать случайный вектор из нашего скрытого пространства и использовать декодер для создания совершенно нового изображения/текста/аудио.

Однако есть одна вопиющая проблема — распределение скрытых векторов четко не определено. Мы не знаем форму распределения, не говоря уже о том, сосредоточены ли значения в какой-то точке, например (0, 0). Это делает выборку из этого распределения чрезвычайно сложной и почти невозможной в больших размерностях.

Именно здесь на помощь приходят вариационные автокодировщики или (VAE).

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

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

Применив форму Гаусса к скрытому распределению, мы теперь можем выбирать скрытые векторы, используя среднее значение и стандартное отклонение, вычисленные кодировщиком.

Однако есть ключевая проблема — модель имеет полную свободу выбора произвольных значений для средних значений и стандартных отклонений. Во-первых, кодировщик может выбирать огромные средние значения, вызывая большие расстояния между скрытыми векторами для дифференциации входных данных. Это означает, что выборка из скрытого пространства для некоторых входных данных не даст информации о его связи с другими входными данными, поскольку их средства очень далеки. Точно так же кодировщик также может возвращать крошечные отклонения (фактически превращая распределение в точечную массу). Это приводит к тому, что каждый выбранный скрытый вектор оказывается одинаковым, что снова лишает его возможности осмысленно сравнивать два похожих входа. Это означает, что VAE фактически превратился в стандартный автокодировщик!

Если присмотреться, это проблема переоснащения, когда VAE игнорирует значимые шаблоны и пытается восстановить все идеально, кодируя бесполезные детали для разделения почти идентичных входных данных. В идеале мы хотим, чтобы выборка из нашего скрытого пространства возвращала содержательные скрытые векторы, которые может использовать декодер. Это означает, что аналогичные входные данные должны давать аналогичные скрытые векторы, а аналогичные скрытые векторы не должны давать сильно различающиеся выходные данные после декодирования.

Чтобы приспособиться к этому, мы добавляем термин регуляризациикнашим потерям при реконструкции, который заставляет векторы среднего/стандартного отклонения кодировщика быть близкими к стандартному нормальному распределению (среднее 0, единичная дисперсия ).

Здесь мы берем расхождение Кульбака-Либлера (KL) между многомерным гауссовским параметром, параметризованным выходными данными нашего кодировщика, и стандартным многомерным гауссовским. Этот термин заставляет наш кодировщик выбирать средние значения с центром вокруг нуля и дисперсии около 1.

Обучение VAE

Если мы посмотрим на нашу функцию потерь VAE, то обнаружим одну вопиющую проблему:

Кодер теперь подключен к операции выборки, что делает наши потери недифференцируемыми! Это означает, что мы не можем вычислять градиенты или выполнять обратное распространение, что делает невозможным обучение нашей сети. Чтобы обойти это, мы вводим так называемый трюк репараметризации. Чтобы произвести выборку из гауссианы с некоторым средним значением и дисперсией, она эквивалентна выборке из стандартной гауссианы и масштабирует стандартное отклонение на выбранное значение.

Применяя это к VAE, мы получаем

Вот и все! Теперь мы можем успешно обучать VAE и с легкостью генерировать новые входные данные.

Спасибо за прочтение. Не стесняйтесь оставлять комментарии или писать мне, если у вас есть дополнительные вопросы!