Генеративное моделирование с нормализующими потоками - NICE: нелинейная оценка независимых компонентов

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

В моем предыдущем посте мы реализовали архитектуру плоского потока. Здесь мы сосредоточимся на нелинейной оценке независимых компонентов (NICE), другом классе нормализующих потоковых моделей.



Слой f описывается как:

где x1 и x2 - разделы входной переменной x , а y1 и y2 - разделы выходной переменной y . В статье разделение выполняется путем разделения нечетных (x1, y1) и четных (x2, y2 ) компоненты входных и выходных переменных. Поскольку нечетные компоненты ввода не изменяются, разделение происходит между любыми двумя слоями, чтобы сделать полное преобразование достаточно выразительным. Это означает, что для второго слоя x1 будет составлять четные компоненты, а x2 - нечетные.

В отличие от плоских потоков это преобразование обратимо:

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

Учитывая точки данных, нормализующий поток (функция f) можно обучить, максимизируя прямую дивергенцию KL:

где pH - базовое распределение (стандартное логистическое распределение в статье). Если вы вычислите определитель Якоби функции f, описанной в начале, вы поймете, что каждый аддитивный слой имеет единичный определитель Якоби. Чтобы исправить это, после последнего слоя вводится диагональная матрица масштабирования.

«Мы включаем диагональную матрицу масштабирования S в качестве верхнего уровня, которая умножает i-е выходное значение на Sii: (xi) i≤D → (Siixi) i≤D. Это позволяет учащемуся придавать больший вес (т.е. моделировать больше вариаций) в одних измерениях и меньше - в других ». [1].

На практике выходной h последнего слоя масштабируется с положительным диагональным масштабированием:

где экспоненциальная функция обеспечивает положительное масштабирование (и позволяет легко вычислить логарифмический определитель матрицы Якоби).

Теперь перейдем к реализации. В документе используются четыре слоя NICE, где функция m представлена ​​с помощью MLP, состоящих из пяти скрытых слоев по 1000 единиц (для набора данных MNIST).

Необходимо реализовать две основные функции. Первая - это прямая функция, которая вычисляет соответствие между точками данных y (наши изображения) и скрытыми переменными z (см. рисунок 1). Эта функция также должна возвращать определитель логарифма матрицы Якоби преобразования. Эта функция полезна для оценки плотности. Вторая функция вычисляет соответствие между скрытыми переменными и целевыми данными (полезно для выборки).

Строки 8 и 9 в приведенном ниже коде являются прямой реализацией уравнений функции f. Строки 6 и 7 выполняют разделение компонентов, а строки 11 и 12 обновляют значение x после каждого слоя. Наконец, в строке 13 выполняется масштабирование и вычисляется лог-якобиан.

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

Теперь, когда нормализующий поток реализован, мы можем создать вспомогательную функцию для его обучения. В качестве входных данных он принимает модель, связанный с ней оптимизатор, загрузчик данных и базовое распределение. Затем он обучает модель, максимизируя общую предельную вероятность (прямое расхождение KL) набора данных в загрузчике данных.

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

Теперь, когда все части готовы, мы можем собрать их и обучить модель.

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

Полный код доступен в следующем репозитории GitHub.

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

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

Если вы хотите погрузиться в глубокое генеративное моделирование, вот две замечательные книги, которые я настоятельно рекомендую:

  • Генеративное глубокое обучение: обучение машин рисованию, письму, сочинению и игре: https://amzn.to/3xLG9Zh
  • Генеративный ИИ с Python и TensorFlow 2: создавайте изображения, текст и музыку с помощью VAE, GAN, LSTM, моделей Transformer: https://amzn.to/3g4Y9Ia

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

Ссылки

  • [1] Лоран Динь, Дэвид Крюгер, Йошуа Бенжио, «NICE: нелинейная оценка независимых компонентов», 2015.