Как «Свечение» создает качественные изображения со сменой переменных

Предисловие

Я адаптировал этот блог на потоковых моделях из технической презентации, которую я сделал после повторной реализации статьи «Glow: Generative Flow with Invertible 1x1 Convolutions» из OpenAI в качестве личного проекта. Блог состоит из двух частей:

  1. Представьте тип генеративной модели, использующей изменение переменных. Их также можно описать как потоковые модели, обратимые генеративные модели или как выполнение нелинейной оценки независимых компонентов.
  2. Объясните «слой связи», представленный в документе «NICE: нелинейная оценка независимых компонентов», который является фундаментальным для последних достижений в этих моделях.

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



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





Вот моя быстрая и грязная повторная реализация Glow с использованием tensorflow:



Часть 1: Введение

Для контекста, вот некоторые общие цели генеративных моделей:

  • Смоделируйте распределение данных, чтобы мы могли брать образцы и оценивать плотности
  • Кодировать данные как скрытые переменные и декодировать скрытые переменные для точного воспроизведения исходных данных
  • Используйте скрытые переменные, которые кодируют значимую информацию, полезную для последующих задач.
  • Создавать субъективно качественные данные

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

Делаем плотность послушной

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

Следующее изображение из учебного пособия Яна Гудфеллоу NIPS 2016 показывает, как традиционные генеративные модели соотносятся друг с другом в контексте максимизации вероятности функции плотности:

Вот несколько примеров того, как можно вычислить функцию плотности:

Скажем, у нас есть многомерное распределение в пространстве H с выборками из этого распределения h, состоящими из независимых компонентов h_d. Мы можем вычислить плотность на h, умножив плотность каждого компонента вместе:

Например, H может состоять из двух определенных атрибутов лица, которые мы считаем независимыми: h_1 указывает, улыбается ли лицо, h_2 указывает если лицо в очках. Чтобы получить вероятность того, что конкретное лицо в очках не улыбается, мы можем умножить p (h_1 = не улыбается) * p (h_2 = носить очки). Предположение о независимости сводит проблему к нахождению функций плотности компонентов.

К сожалению, компоненты, к которым у нас есть доступ, часто не являются независимыми, поэтому (чтобы избежать наивности) мы должны включить зависимости, используя цепное правило вероятности:

Продолжая предыдущий пример, если наш набор данных состоит из изображений людей, примеряющих очки в первый раз, до и после, может оказаться, что человек с большей вероятностью будет улыбаться, если впервые почувствует лучшее зрение ( носить очки). Следовательно, чтобы получить вероятность того, что конкретное лицо в очках не улыбается, мы умножаем p (h_1 = не улыбается | h_2 = в очках) * p (h_2 = в очках). Этот расчет включает зависимость между двумя компонентами.

В случае изображений распределение вероятности распространяется на все изображения X, и мы хотим вычислить плотность на конкретном изображении x. Для расчета плотности изображения необходимо учитывать зависимости компонентов изображения: пикселей. Например, пиксель 2 в изображении обычно очень зависит от пикселя 1. За исключением границ, пиксели, которые расположены близко друг к другу, как правило, являются частью одного и того же объекта и поэтому сильно коррелированы. Границы составляют небольшую часть естественного изображения, поскольку они представляют собой почти одномерные элементы в двухмерном пространстве. С другой стороны, скрытая переменная, такая как «ношение очков», часто не зависит от скрытой переменной, такой как «улыбка».

Нелинейная оценка независимых компонентов, применяемая к изображениям, направлена ​​на преобразование зависимого распределения по пикселям x в независимое распределение по скрытым переменным h путем применения функции f (x). Газета Glow, ее предшественники и этот блог в основном посвящены поиску правильной функции.

f (x) должен быть обратимым, чтобы мы могли вернуться к X из H (в противном случае мы не сможем сгенерировать образцы). Требование обратимости запрещает уменьшение размерности с потерями: скрытое пространство должно иметь столько же компонентов, сколько и пространство изображения (обычно высота * ширина * 3 цветовых канала). На рисунке 4 примерно показана концепция перехода от сложного дистрибутива к более простому и наоборот.

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

Если вы так же устали от изменений переменных, как я, когда впервые прочитал статью о Glow, шаг 4 может показаться интуитивно понятным. Однако это не совсем правильно из-за того, как работают непрерывные распределения. Я расскажу, почему, в следующей части. Если вы знакомы с заменой переменных для интегралов, то в основном это будет обзор.

Замена переменных

В качестве простого примера, скажем, X - это одномерное распределение по размеру бороды, а не по пикселям. На рисунке ниже (Рисунок 5) светлая борода наиболее вероятна, а бороды большего размера или отсутствие бороды имеют меньшую вероятность. Следуя шагу 2, мы можем применить функцию для преобразования X в H: h = f (x). Скажем, f (x) = x / 10. Нет смысла говорить о независимых переменных, когда есть только одна; этот пример предназначен для иллюстрации основного изменения переменной, которое затем может быть расширено для включения многомерных распределений. На рисунках 5 и 6 показаны до и после этого преобразования с коричневой кривой, показывающей функцию плотности вероятности, отображаемую над изображениями:

Примените h = x / 10.

Изображение, которое раньше было 10, теперь имеет 1, а изображение, которое было с -10, теперь -1. Изображение, которое было на 0, все еще на 0, но ясно, что плотность вероятности выше на -1, 0 и 1 в новом изображении, чем на -10, 0 и 10 в старом изображении, просто по мере увеличения плотности изображений.

Площадь под кривой функции плотности вероятности всегда должна быть 1, поэтому уменьшение ширины должно увеличивать высоту и наоборот. Эту концепцию можно выразить более математически с помощью кумулятивных функций плотности F,, которые вычисляются как интеграл функции плотности вероятности (pdf) от отрицательной бесконечности до рассматриваемой точки. Основная теорема исчисления указывает, что pdf, следовательно, является производной кумулятивной функции плотности. После перехода с x на h = f (x) нам нужно использовать правило цепочки для вычисления нового PDF-файла. Следующее уравнение дает фактический PDF для x в терминах PDF для h:

Следовательно, процесс должен быть следующим:

Поэтому плотность при x можно рассчитать как

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

Для меня знание того, что каждый шаг в уравнении математически верен, не всегда позволяет мне интуитивно понять это уравнение. Следующая диаграмма MSPaint примерно демонстрирует, как нужно изменить высоту нового PDF-файла, чтобы соответствовать изменению ширины пространства. На моем любимом канале на YouTube, 3Blue1Brown, есть видео, которое великолепно оживляет производные, такие как растяжение или сжатие пространства https://www.youtube.com/watch?v=CfW845LNObM&t=3m7s, что является важной интуицией для понимания изменения переменных .

Нахождение функции

Я еще не упомянул, зачем нам нужна точная функция плотности для генерации выборок (очевидно, нам нужна функция плотности, если мы хотим вычислить плотности). GAN, например, используют его только неявно. До этого момента я предполагал, что функция, отображающая пиксели в независимые компоненты, известна, но это не относится к набору данных с нетривиальными изображениями. Теперь приходит машинное обучение: мы можем заставить компьютер изучить функцию вместо того, чтобы писать ее самостоятельно. С помощью функции плотности изучение параметров f (x) может быть выполнено с помощью оценки максимального правдоподобия. В частности, мы можем максимизировать логарифмическую вероятность параметров f (x) 's θ для создания распределения с независимыми компонентами p_H для входных данных x

Если мы выберем независимое распределение гауссовым со средним 0 и дисперсией σ², уравнение станет

Без члена детерминанта журнала это эквивалентно минимизации среднеквадратичной ошибки между выходом функции и 0. В этом случае лучшим θ является тот, который заставляет f сопоставлять каждое значение с режим распределения (0), как показано на рисунке 8. Это отображение дает дельта-распределение Дирака, а не гауссово:

Вот еще один способ понять, как термин, определяющий журнал, необходим для поиска нужной функции:

Если мы хотим отобразить гауссиан с центром в 0, минимизируемая потеря логарифма правдоподобия составит f (x) ² / 2σ² (логарифм уравнения плотности Гаусса с нулевым средним). Без детерминанта журнала это означает, что функция, отображающая все обучающие данные в 0, имела бы нулевые потери (плохо: гауссианы должны иметь некоторую дисперсию). Функция не сможет этого сделать, если мы максимизируем ее наклон рядом с данными обучения: ненулевой наклон означает, что не все точки отображаются в одно и то же место. Учитывая это, кажется интуитивно понятным, что термин, определяющий журнал, должен каким-то образом быть связан с дисперсией. Часто, когда мы максимизируем MLE гауссиана, мы можем не принимать во внимание постоянные факторы, такие как дисперсия гауссиана; однако в этом случае мы не можем, потому что определяющий член журнала не умножается на ту же константу. Поскольку логарифмическая правдоподобие гауссиана представляет собой среднеквадратичную ошибку, деленную на 2σ², дисперсия фактически является весовым членом, при этом более высокая дисперсия увеличивает влияние логарифмического детерминантного члена за счет снижения влияния логарифмического члена плотности. Для полного исчезновения детерминантного члена логарифма дисперсия должна быть равна 0, что придает бесконечный вес члену логарифмической плотности, в результате чего получается PDF-файл дельта-типа Дирака, показанный на рисунке 8.

В следующем разделе, посвященном «слою связи», объясняется, как мы можем создать обратимую функцию с поддающимся обработке определителем Якоби, достаточно мощным, чтобы отображать естественные изображения на их независимые компоненты.

Часть 2: Связующий слой

Надеюсь, предыдущий раздел прояснил, что мы можем создать генеративную модель, используя обратимую функцию с управляемым якобианским детерминантом для отображения входных данных в независимое представление. Учитывая сложность некоторых типов входных данных (изображений), было бы сложно создать эту функцию вручную. Если функция дифференцируема и параметризована достаточным количеством переменных, мы можем использовать процесс оптимизации, чтобы изучить ее. Нейронные сети показали успех в изучении сложных дифференцируемых функций, но они, как правило, не обратимы с помощью поддающегося обработке детерминанта Якоби. Слой связи удовлетворяет всем этим требованиям: слой обратим, имеет управляемый определитель Якоби, является дифференцируемым и включает в себя нейронную сеть, достаточно мощную, чтобы обрабатывать сложный ввод. Это достигается с помощью треугольной функциональной структуры, в которой мы разделяем входы и выходы на две части. Первый слой в сети должен выполнить начальное разбиение на x_1 и x_2, которое обычно выполняется по каналам или с использованием пространственного шаблона шахматной доски, но для упрощения иллюстрации, На рисунке 9 показан пример разбивки по высоте.

Обратной стороной этого конкретного разделения является объединение верхней и нижней половин в одно изображение. В начале связующего уровня данные «ключа» передаются через нейронную сеть и объединяются с данными «сообщения». «Ключ» также передается без изменений, что означает, что нам не нужно инвертировать нейронную сеть, поскольку следующий уровень имеет версию входных данных сети. Связующие слои могут быть сложены друг с другом для создания более мощных функций, которые по-прежнему обратимы с помощью гибких детерминантов Якоби.

На рисунке 10 показана диаграмма связующего слоя, входными данными являются x_1 и x_2, а выходными данными - «новые ключевые данные» и «новые данные сообщения». сеть m повлияла на половину этих данных. Сложив эти слои, мы можем получить «глубокое» представление.

g - обратимая функция, объединяющая x_2 и результат m (x_1) (m может быть нейронной сетью). Диаграмма эквивалентна следующим уравнениям (без функции смешивания), которые также демонстрируют обратимость слоя

Треугольный характер якобиана для этих уравнений означает, что требуется только частная производная от y_2 по x_2, что не требует дифференцирования нейронной сети m (упрощая расчет)

Следовательно, выбирая правильный g и смешивая функции, мы можем получить обратимую функцию с легко управляемым определителем Якоби, даже если m очень сложный.

g часто определяют как следующую простую функцию для создания «аффинного связующего слоя»:

Круг с точкой посередине, используемый для объединения x_2 и m_2 (x_1), представляет собой произведение Адамара, которое представляет собой поэлементное умножение. Обратное распространение также использует продукт Hardmard.

y_1 и y_2 «смешаны» с обратимым преобразованием. Без смешивания данные «сообщения» никогда не будут переданы через нейронную сеть, и сеть не получит глубокого представления. На схеме ниже показаны два варианта этого преобразования.

Первый пример - это то, что делала оригинальная статья: данные ключ и сообщение поменялись местами. Обратное тривиально, поменяйте их местами обратно.

Второй пример ближе к тому, как бумага Glow реализует операцию смешивания. В документе указывается, что операция подкачки - это особый случай изменения перестановки каналов. Он использует более общую перестановку, реализованную как преобразование квадратной матрицы с обучаемыми весами, инициализированную как матрицу вращения. Именно в этом преобразовании появляется Обратимые свертки 1x1 из названия статьи: один из способов выполнения перестановки по каналам - свертки 1x1. Свертки 1x1 - это свертки с высотой и шириной фильтра, равными 1, которые использовались в таких архитектурах, как начальная сеть, для изменения количества каналов. В Glow количество каналов должно оставаться неизменным, чтобы архитектура была обратимой (если мы также не изменим пространственные измерения, чтобы общее количество компонентов оставалось постоянным).

Заключение

Я думаю, что важным выводом из этой модели является то, что мы не должны считать ограничения, налагаемые конкретным подходом, непреодолимыми. Я могу себе представить, что предполагаю, что требование обратимой функции с послушным детерминантом Якоби исключает использование нейронных сетей. Это предположение оказывается неверным, и решение представляет собой эффективный подход к моделированию независимых компонентов данных большой размерности. Однако архитектура все еще ограничена, что означает, что такие модели, как GAN, которые обладают большей гибкостью, могут давать высококачественные результаты с гораздо меньшими затратами времени на обучение и использование памяти. Мне также интересно лучше понять, как ведут себя генеративные модели и как они могут изучать полезные концепции без учителя. Я обсуждал подходы к этому в предыдущих блогах https://towardsdatascience.com/animating-ganime-with-stylegan-part-1-4cf764578e и https://towardsdatascience.com/animating-ganime-with-stylegan-the -tool-c5a2c31379d в контексте GAN.