Glow: Улучшенные обратимые генеративные модели

Мы представляем Glow, обратимую генеративную модель, в которой используются обратимые свертки 1×1. Она расширяет предыдущиеработы по обратимым генеративным моделям и упрощает архитектуру. Наша модель способна генерировать реалистичные изображения высокого разрешения, поддерживает эффективную выборку и обнаруживает признаки, которые можно использовать для манипулирования характеристиками данных. Мы публикуем код модели и онлайн-инструмент визуализации, чтобы пользователи могли исследовать эти результаты и опираться на них.
Мотивация
Генеративное моделирование заключается в наблюдении за данными (например, набором фотографий лиц) с последующим обучением модели тому, как эти данные были сгенерированы. Обучение аппроксимации процесса генерации данных требует изучения всей структуры, присутствующей в данных, и успешные модели должны уметь синтезировать результаты, похожие на исходные данные. Точные генеративные модели имеют широкие возможности применения, включая синтез речи, анализ и синтез текста, обучение с частичным привлечением учителя и управление на основе моделей. Предлагаемый нами метод применим и к этим задачам.
Glow — это тип обратимой генеративной модели, также называемой генеративной моделью на основе потоков (flow-based generative model), и представляет собой развитие методов NICE и RealNVP. До сих пор генеративные модели на основе потоков привлекали мало внимания исследовательского сообщества по сравнению с GAN и VAE.
К достоинствам генеративных моделей на основе потоков относятся:
- Точный вывод скрытых переменных (latent-variable inference) и оценка логарифма правдоподобия. В VAE можно лишь приблизительно вывести значение скрытых переменных, соответствующих точке данных. В GAN вообще нет энкодера для вывода скрытых переменных. В обратимых генеративных моделях это можно сделать точно, без аппроксимации. Это не только приводит к точному выводу, но и позволяет оптимизировать точный логарифм правдоподобия данных, а не его нижнюю границу.
- Эффективный вывод и эффективный синтез. Авторегрессионные модели, такие как PixelCNN, также обратимы, однако синтез на основе таких моделей трудно распараллелить, и обычно он неэффективен на параллельном оборудовании. Генеративные модели на основе потоков, такие как Glow (и RealNVP), эффективно распараллеливаются как для вывода, так и для синтеза.
- Полезное скрытое пространство для последующих задач. Скрытые слои авторегрессионных моделей имеют неизвестные маргинальные распределения, что значительно затрудняет выполнение корректных манипуляций с данными. В GAN точки данных обычно не могут быть напрямую представлены в скрытом пространстве, так как у них нет энкодера, и они могут не обладать полной поддержкой распределения данных. Это не относится к обратимым генеративным моделям и VAE, которые позволяют решать различные задачи, такие как интерполяция между точками данных и осмысленные модификации существующих точек данных.
- Значительный потенциал экономии памяти. Вычисление градиентов в обратимых нейронных сетях требует объема памяти, который является постоянным, а не линейно зависящим от их глубины, как поясняется в статье о RevNet.
Результаты
Используя наши методы, мы добились значительных улучшений на стандартных бенчмарках по сравнению с RealNVP — предыдущим лучшим опубликованным результатом для генеративных моделей на основе потоков.
Набор данных | RealNVP | Glow |
CIFAR-10 | 3.49 | 3.55 |
Imagenet 32×32 | 4.28 | 4.09 |
Imagenet 64×64 | 3.98 | 3.81 |
LSUN (спальня) | 2.72 | 2.38 |
LSUN (башня) | 2.81 | 2.46 |
LSUN (церковь на улице) | 3.08 | 2.67 |
Количественная производительность в битах на размерность, оцененная на тестовом наборе различных наборов данных для модели RealNVP по сравнению с нашей моделью Glow.*
Модели Glow могут генерировать реалистично выглядящие изображения высокого разрешения, причем делают это эффективно. Нашей модели требуется около 130 мс для генерации выборки 256×256 на графическом процессоре NVIDIA 1080 Ti. Как и в предыдущей работе, мы обнаружили, что выборка из модели с пониженной температурой часто приводит к более высокому качеству образцов. Приведенные выше образцы были получены путем масштабирования стандартного отклонения скрытых переменных с коэффициентом температуры 0.7.
Интерполяция в скрытом пространстве
Мы также можем выполнять интерполяцию между произвольными лицами, используя энкодер для кодирования двух изображений и выборки из промежуточных точек. Обратите внимание, что входные данные представляют собой произвольные лица, а не выборки из модели, что служит доказательством того, что модель охватывает все целевое распределение.
Манипуляции в скрытом пространстве
Мы можем обучить модель на основе потоков без разметки, а затем использовать выученное скрытое представление для последующих задач, таких как манипулирование атрибутами входных данных. Этими семантическими атрибутами могут быть цвет волос на лице, стиль изображения, высота музыкального звука или эмоция в текстовом предложении. Поскольку модели на основе потоков имеют идеальный энкодер, вы можете кодировать входные данные и вычислять средний скрытый вектор для входов с определенным атрибутом и без него. Направление вектора между ними затем может быть использовано для изменения произвольного входного сигнала в направлении этого атрибута.
Описанный выше процесс требует относительно небольшого количества размеченных данных и может быть выполнен после обучения модели (во время обучения разметка не требуется). Предыдущиеработы, использующие GAN, требуют отдельного обучения энкодера. Подходы, использующие VAE, гарантируют совместимость декодера и энкодера только для данных из того же распределения. Другие подходы включают прямое обучение функции, представляющей преобразование, как в Cycle-GAN, однако они требуют повторного обучения для каждого преобразования.
Plain Text
1# Train flow model on large, unlabelled dataset X2m = train(X_unlabelled)3
4# Split labelled dataset based on attribute, say blonde hair5X_positive, X_negative = split(X_labelled)6
7# Obtain average encodings of positive and negative inputs8z_positive = average([m.encode(x) for x in X_positive])9z_negative = average([m.encode(x) for x in X_negative])10
11# Get manipulation vector by taking difference12z_manipulate = z_positive - z_negative13
14# Manipulate new x_input along z_manipulate, by a scalar alpha \in [-1,1]15z_input = m.encode(x_input)16x_manipulated = m.decode(z_input + alpha * z_manipulate)Простой фрагмент кода для использования модели на основе потоков с целью манипулирования атрибутами
Вклад
Наш главный вклад, а также отход от предыдущей работы RealNVP, заключается в добавлении обратимой свертки 1×1, а также в удалении других компонентов, что в целом упрощает архитектуру.
Архитектура RealNVP состоит из последовательностей двух типов слоев: слоев с шахматной маскировкой и слоев с маскировкой по каналам. Мы удаляем слои с шахматной маскировкой, упрощая архитектуру. Слои с маскировкой по каналам выполняют действия, эквивалентные повторению следующих шагов:
- Перестановка (пермутация) входных данных путем изменения их порядка в измерении каналов на обратный.
- Разделение входных данных на две части, A и B, по центру размерности признаков.
- Подача A в неглубокую сверточную нейронную сеть. Линейное преобразование B в соответствии с выходом нейронной сети.
- Конкатенация A и B.
Путем объединения этих слоев в цепочку A обновляет B, затем B обновляет A, затем A обновляет B и т. д. Этот двудольный поток информации, очевидно, является довольно жестким. Мы обнаружили, что производительность модели улучшается, если изменить обратную пермутацию шага (1) на (фиксированную) пермутацию перемешивания.
Идя дальше, мы также можем обучать оптимальную пермутацию. Обучение матрицы перестановок — это дискретная оптимизация, которая не поддается градиентному подъему. Но поскольку операция пермутации является лишь частным случаем линейного преобразования с квадратной матрицей, мы можем заставить это работать со сверточными нейронными сетями, так как перестановка каналов эквивалентна операции свертки 1×1 с равным количеством входных и выходных каналов. Поэтому мы заменяем фиксированную пермутацию обученными операциями свертки 1×1. Веса свертки 1×1 инициализируются как случайная матрица вращения. Как мы показываем на рисунке ниже, эта операция приводит к значительному улучшению качества моделирования. Мы также показали, что вычисления, необходимые для оптимизации целевой функции, могут быть выполнены эффективно с помощью LU-разложения весов.

Наш основной вклад — обратимые свертки 1×1 — приводит к значительным улучшениям моделирования.
Кроме того, мы удаляем пакетную нормализацию (batch normalization) и заменяем ее слоем нормализации активации. Этот слой просто сдвигает и масштабирует активации с использованием инициализации, зависящей от данных, которая нормализует активации для заданного начального мини-батча данных. Это позволяет уменьшить размер мини-батча до 1 (для больших изображений) и увеличить размер модели.
Масштаб
Наша архитектура в сочетании с различными оптимизациями, такими как контрольные точки градиента, позволяет нам обучать генеративные модели на основе потоков в гораздо больших масштабах, чем обычно. Мы использовали Horovod, чтобы легко обучать нашу модель на кластере из нескольких машин; модель, используемая в нашей демоверсии, была обучена на 5 машинах, каждая из которых имела по 8 графических процессоров. Используя эту установку, мы обучаем модели с более чем ста миллионами параметров.
Направления исследований
Наша работа показывает, что можно обучать потоковые (flow-based) модели генерировать реалистичные изображения высокого разрешения, а также изучать латентные представления, которые можно легко использовать для последующих задач, таких как манипуляция данными. Мы предлагаем несколько направлений для будущих исследований:
- Конкурентоспособность с другими классами моделей по правдоподобию. Авторегрессионные модели и VAE превосходят потоковые модели по логарифму правдоподобия, однако они имеют недостатки в виде неэффективной выборки и неточного вывода соответственно. Можно объединить потоковые модели, VAE и авторегрессионные модели, чтобы сбалансировать их сильные стороны; это было бы интересным направлением для будущих исследований.
- Усовершенствование архитектуры для повышения эффективности вычислений и использования параметров. Для генерации реалистичных изображений высокого разрешения модель генерации лиц использует около 200 млн параметров и около 600 сверточных слоев, что делает ее обучение затратным. Модели с меньшей глубиной хуже справляются с изучением долгосрочных зависимостей. Использование архитектур self-attention или выполнение прогрессивного обучения для масштабирования до высоких разрешений может сделать обучение моделей Glow менее затратным с точки зрения вычислений.
Наконец, если вы хотите использовать Glow в своих исследованиях, мы рекомендуем ознакомиться с нашей статьей для получения подробной информации или изучить наш код в этом репозитории на Github.
Авторы
Благодарности
Особая благодарность Николасу Бенсону за помощь в создании демоверсии.
Полный текст статьи читайте на OpenAI
