В этой статье мы узнаем об уловке «повторной параметризации», которая делает вариационные автоэнкодеры (VAE) подходящим кандидатом для обратного распространения ошибки. Во-первых, мы кратко обсудим автоэнкодеры и проблемы, связанные с их ванильными вариантами. Затем мы сразу перейдем к сути статьи - трюку с «перепараметризацией».
Примечание. Эта статья не представляет собой руководство по использованию автоэнкодеров, поэтому при необходимости я кратко расскажу о них. Если вы хотите узнать больше об автоэнкодерах, прочтите эти статьи.
Автоэнкодеры: что они делают?
Автоэнкодеры - это класс генеративных моделей. Они позволяют нам сжать большое пространство входных функций до гораздо меньшего, которое впоследствии можно будет реконструировать. Сжатие в целом имеет большое значение для качества обучения.
У нас, людей, есть удивительные возможности сжатия - мы можем изучать полезные вещи, а позже мы можем легко расширить их, когда это необходимо. Например, зачастую вам вовсе не нужно помнить все мельчайшие подробности конкретной концепции; вы просто запоминаете определенные моменты об этом, а затем пытаетесь восстановить его с помощью этих конкретных точек.
Итак, если мы можем представить многомерные данные в гораздо более низкоразмерном пространстве и реконструировать их позже, это может быть очень полезно для ряда различных сценариев, таких как сжатие данных, извлечение низкоразмерных функций и т. Д.
Ванильные автоэнкодеры
Это проще объяснить с помощью кода -
У нас есть очень простая сеть, в которой мы находимся:
- Подача в сеть вектора 784 d.
- Сжатие вектора до 32-мерного (кодировщик).
- Реконструкция исходного 784-мерного вектора из 32-мерного (декодер).
Рисунок ниже может прояснить эту идею -
Говоря о результатах, эта сеть при обучении на старом добром наборе данных MNIST может дать следующий результат (записная книжка доступна здесь):
Выходы выглядят не так уж плохо, но вот некоторые из проблем, к которым эта сеть склонна:
- Кодировщик сети не имеет возможности узнать, как он должен кодировать точки входных данных в скрытые переменные (читать сжатие). Это заставляет представление скрытых переменных не заботиться о структуре точек входных данных. Конечно, в конце сети есть функция потерь (обычно L2), которая сообщает ей, насколько далеки прогнозы от исходных точек данных. Но он по-прежнему не учитывает способ сжатия входных данных. В результате очень небольшое изменение скрытых переменных может привести к тому, что декодер будет выдавать очень разные выходные данные.
- Еще одно соображение - это определение размера скрытых переменных. В данном случае мы использовали 32-d. С помощью многомерного вектора для представления скрытых переменных мы можем улучшить качество генерируемых изображений, но только до определенной степени. Здесь все еще будет присутствовать первая проблема.
Первая проблема кажется более проблематичной, чем вторая, потому что мы можем экспериментировать с разными измерениями и наблюдать за качеством прогнозов. Итак, что можно сделать, чтобы решить эту проблему?
Вариационные автоэнкодеры: кодирование, выборка, декодирование и повтор
Чтобы облегчить проблемы, присутствующие в обычном автоэнкодере, мы обращаемся к вариационным кодировщикам. Первое изменение, которое он вносит в сеть, заключается в том, что вместо прямого отображения точек входных данных в скрытые переменные точки входных данных отображаются в многомерное нормальное распределение. Этот дистрибутив ограничивает свободу действий кодировщика при кодировании точек входных данных в скрытые переменные. В то же время он привносит в сеть стохастичность, потому что теперь мы являемся точками выборки из распределения вероятностей.
Нормальное распределение параметризуется с помощью среднего () и дисперсии (), и это в точности (с некоторыми «вариациями») то, что делается в случае вариационного автоэнкодера. Итак, шаг за шагом -
- Каждая точка данных в VAE будет сопоставлена с векторами средних значений и log_variance, которые будут определять многомерное нормальное распределение вокруг этой точки входных данных.
- Точка выбирается из этого распределения и возвращается как скрытая переменная.
- Эта скрытая переменная подается в декодер для получения вывода.
Это заставляет сеть изучать более плавное представление. Он также гарантирует, что небольшое изменение скрытых переменных не приведет к тому, что декодер будет выдавать существенно разные выходные данные, потому что теперь мы осуществляем выборку из непрерывного распределения. С другой стороны, поскольку этот процесс выборки является случайным по своей природе, выходные данные декодера начинают становиться более разнообразными.
Ниже представлена принципиальная схема неглубокой VAE -
Как вы можете видеть на рисунке, мы ввели в сеть еще один промежуточный плотный слой. В ВАЭ. mean
и log-variance
- это обучаемые параметры. Слой Lambda
на приведенной выше диаграмме представляет операцию выборки и определяется следующим образом:
Итак, если точка входных данных должна быть отображена в скрытую переменную 𝑧 посредством выборки (после прохождения через нейронную сеть), она должна соответствовать следующему уравнению:
где = 𝑒𝑥𝑝 (𝑧_𝑙𝑜𝑔_𝑣𝑎𝑟 / 2).
Логарифмируя дисперсию, мы заставляем сеть иметь выходной диапазон натуральных чисел, а не только положительные значения (дисперсии будут иметь только положительные значения). Это позволяет более плавно отображать скрытое пространство.
Вы, должно быть, задаетесь вопросом о маленьком термине epsilon
, в чем его значение? Мы займемся этим через минуту.
Теперь, прежде чем мы наконец сможем обсудить трюк с «повторной параметризацией», нам нужно будет рассмотреть функцию потерь, используемую для обучения VAE. Это связано с тем, что в конечном итоге мы передаем градиенты функции потерь в обратном направлении, и трюк с «повторной параметризацией» действительно помогает в процессе обратного распространения, когда это происходит в VAE.
VAE Loss
Вспомните из предыдущего раздела, что VAE пытается изучить распределение для скрытого пространства. Таким образом, помимо учета восстановленных выходных данных, создаваемых декодером, нам также необходимо убедиться, что распределение скрытого пространства правильно сформировано. Из Глубокого обучения с помощью Python (Франсуа Шоле) (страница 300, 1-е издание) -
Параметры VAE обучаются с помощью двух функций потерь: потеря реконструкции, которая заставляет декодированные выборки соответствовать исходным входным данным, и потеря регуляризации , что помогает изучить хорошо сформированные скрытые пространства и уменьшить переобучение обучающим данным.
Потеря регуляризации обрабатывается с помощью Дивергенции Кульбака-Либлера. Превосходная интерпретация дивергенции KL доступна в GANs in Action (Якуб Лангр и Владимир Бок) (стр. 29, 1-е издание) -
[…] Расхождение Кульбака – Лейблера (расхождение KL), также известное как относительная энтропия, - это разница между кросс-энтропией двух распределений и их собственной энтропией. Для всех остальных представьте, что вы рисуете два распределения, и везде, где они не пересекаются, будет область, пропорциональная расхождению KL.
Эта лекция может оказаться полезной для более математически строгого рассмотрения вопроса о выборе KL-дивергенции.
Что касается потери реконструкции, я в основном видел следующие два варианта:
- L2 потеря
- Двоичная кроссентропия (для сравнения каждой характеристики точки данных со значением в восстановленном выходе)
Теперь мы можем перейти к тому, что мы ожидали обсудить, - к уловке «повторной параметризации».
Обучение VAE с обратным распространением
Чтобы иметь возможность обновлять параметры. VAE, использующий обратное распространение, мы должны учитывать, что узел выборки внутри является стохастическим по своей природе. Мы можем вычислить градиенты узла выборки относительно векторов mean
и log-variance
(оба вектора mean
и log-variance
используются в слое выборки).
Помните маленького парня в слое выборки epsilon
? Это фактически изменяет параметры нашей сети VAE. Это позволяет векторам mean
и log-variance
оставаться в качестве обучаемых параметров сети, сохраняя при этом стохастичность всей системы через epsilon
.
где, 𝜙 представляет распределение, которое сеть пытается изучить.
epsilon
остается случайной величиной (выбранной из стандартного нормального распределения) с очень низким значением, тем самым не заставляя сеть отклоняться слишком от истинного распределения. Здесь можно с уверенностью повторить, что распределение 𝜙 (параметризованное векторами mean
и log-variance
) все еще изучается сетью. Эта идея фактически позволила VAE тренироваться в непрерывном режиме и была предложена Kingma et al. в своей статье Автокодирование вариационного Байеса.
Заключение
Итак, это все, и спасибо за то, что вы ее прочитали! Автоэнкодеры - первые первоклассные члены генеративных моделей, даже находящие свое применение при разработке GAN (НАЧАЛО). Распутанные VAE также весьма актуальны в области обучения с подкреплением (DARLA: Improving Zero-Shot Transfer in Reinforcement Learning). VAE были одним из своего рода открытий, которые объединили байесовский вывод с глубоким обучением, поощряя различные направления исследований.
Ниже приведены ссылки, которые я использовал для его написания, и вы обязательно должны проверить их, если вам интересно узнать больше об автоэнкодерах в целом.
- Генеративное глубокое обучение Дэвида Фостера
- GANs в действии Якуба Лангра и Владимира Бока
- Глубокое обучение с помощью Python Франсуа Шоле
- Глубокое генеративное моделирование | MIT 6.S191
- Вариационные автоэнкодеры от Arxiv Insights
Вы можете связаться со мной через Twitter (@RisingSayak).