Glow: как обратимые генеративные модели считают точное правдоподобие
Glow — потоковая модель от OpenAI, которая генерирует лица и умеет ровно то, чего не могут GAN: считать точную вероятность любого изображения и обратимо кодировать его в латентное пространство.

В 2018 году OpenAI представила Glow — генеративную модель на основе нормализующих потоков (normalizing flows). В отличие от GAN, где генератор и дискриминатор играют в антагонистическую игру, а точную вероятность изображения посчитать нельзя, поток строит обратимое преобразование: каждую картинку можно точно закодировать в вектор скрытого пространства и точно восстановить обратно. Никакой аппроксимации, как в вариационных автокодировщиках. Именно это свойство — полная обратимость и точный подсчёт log-likelihood — делает такие модели интересными для задач, где важна не только красивая картинка, но и математически честная плотность вероятности.
Что такое нормализующий поток
Идея потоковых моделей строится на формуле замены переменных. Если у вас есть простое распределение (обычно многомерное нормальное) над латентным вектором z и обратимая дифференцируемая функция f, которая переводит z в изображение x, то плотность x выражается через плотность z и якобиан преобразования.
На практике это значит следующее. Вы можете:
- взять реальное изображение и прогнать его через f-1, получив латентный код;
- взять любой латентный код и прогнать через f, получив изображение;
- посчитать точное значение log-likelihood для любого изображения — не нижнюю оценку, а точное число.
Сложность в том, что каждый слой сети должен быть обратимым, а определитель его якобиана — вычислимым за разумное время. Обычный якобиан для изображения размером сотни тысяч пикселей посчитать невозможно. Поэтому потоки строят из слоёв, у которых якобиан треугольный или диагональный, — тогда определитель это просто произведение диагональных элементов.
Главная валюта потоковых моделей — не картинка, а честная вероятность. Вы платите архитектурными ограничениями за то, чего GAN не даёт в принципе: точный ответ на вопрос «насколько вероятно это изображение».
Три кирпича, из которых собран Glow
Glow развивает более раннюю модель RealNVP и добавляет к ней несколько идей. Каждый шаг потока в Glow состоит из трёх операций.
Actnorm
Слой нормализации активаций с обучаемыми параметрами масштаба и сдвига на канал. Инициализируется так, чтобы после первого прохода данных активации имели нулевое среднее и единичную дисперсию. По сути замена батч-нормализации, которая плохо работает при маленьких батчах — а при обучении на изображениях высокого разрешения батчи как раз крошечные.
Обратимая свёртка 1×1
Ключевой вклад статьи. В RealNVP порядок каналов между слоями менялся фиксированной перестановкой. Glow заменяет это обучаемой обратимой свёрткой 1×1 — обобщением перестановки. Это позволяет сети самой находить, как перемешивать каналы, а определитель якобиана такой свёртки считается через определитель весовой матрицы. Авторы используют LU-разложение матрицы весов, чтобы удешевить подсчёт определителя.
Аффинный слой связывания (affine coupling)
Вход делится на две половины. Первая проходит без изменений, а на основе неё нейросеть предсказывает масштаб и сдвиг для второй половины. Такое преобразование тривиально обращается: зная первую половину, вы восстанавливаете параметры и откатываете вторую. Якобиан при этом треугольный, определитель считается мгновенно.
Сравнение с другими семействами
| Свойство | GAN | VAE | Поток (Glow) |
|---|---|---|---|
| Точный log-likelihood | нет | нижняя оценка | да, точный |
| Обратимое кодирование в латент | нет | приближённое | да, точное |
| Качество картинки | высокое | ниже, размытость | среднее-высокое |
| Стабильность обучения | капризное | стабильное | стабильное |
| Память при обучении | умеренная | умеренная | высокая |
Главная слабость потоков видна в последней строке. Обратимость требует, чтобы размерность латентного пространства совпадала с размерностью изображения — модель не сжимает данные, как VAE. Отсюда огромное число параметров и высокие требования к памяти на изображениях высокого разрешения.
Что умеет Glow на практике
Помимо генерации новых лиц из случайного шума, обратимость даёт несколько трюков, которые в GAN требуют отдельной инверсии генератора.
- Интерполяция. Кодируете два реальных лица в латентные векторы, линейно проходите между ними, декодируете — получаете плавный морфинг.
- Семантические манипуляции. Если разметить обучающие изображения по атрибутам (улыбка, возраст, цвет волос), можно посчитать средний вектор направления атрибута в латенте и сдвигать по нему любое закодированное лицо.
- Регулировка температуры. Сэмплируя латент из нормального распределения с уменьшенной дисперсией, вы получаете менее разнообразные, но более «типичные» и чистые изображения.
Минимальный псевдокод шага потока
Логика одного шага при кодировании изображения в латент выглядит так. Это иллюстрация структуры, а не готовая к запуску реализация.
def flow_step_forward(x, logdet):
# 1. actnorm
x, ld = actnorm(x)
logdet = logdet + ld
# 2. обратимая свёртка 1x1
x, ld = invertible_conv1x1(x)
logdet = logdet + ld
# 3. affine coupling
xa, xb = split_channels(x)
scale, shift = nn(xa) # предсказываем по первой половине
xb = xb * exp(scale) + shift # преобразуем вторую
logdet = logdet + sum(scale)
x = concat(xa, xb)
return x, logdet
Обратный проход — те же три операции в обратном порядке с обратными формулами. Именно симметрия forward и inverse отличает поток от обычной сети, где восстановить вход по выходу нельзя.
Стоит ли использовать это сегодня
Как чистый генератор изображений Glow проиграл конкуренцию — сначала прогрессивным GAN и StyleGAN, а затем диффузионным моделям, которые дают лучшее качество при сопоставимой стабильности обучения. Но идея нормализующих потоков не умерла: точный log-likelihood ценен там, где нужна оценка плотности, обнаружение аномалий и выбросов, вероятностные модели в физике и химии. Обратимые слои также используют как компонент внутри более крупных систем.
Если вы разбираетесь в генеративных моделях, Glow полезен как учебный пример: он показывает, как из требования обратимости и вычислимого якобиана вырастает вся архитектура, а не наоборот.
Prompt-инженер: Идеальные запросы для Midjourney, ChatGPT и других моделей.
Спросить за 15 ₽Источники: Glow: Better Reversible Generative Models — OpenAI, Kingma, Dhariwal. Glow: Generative Flow with Invertible 1x1 Convolutions (arXiv)
Частые вопросы
Чем поток принципиально отличается от GAN?
Почему Glow требует так много памяти?
Что даёт обратимая свёртка 1×1 по сравнению с RealNVP?
Можно ли на Glow редактировать реальные фото?
Актуальны ли потоковые модели сейчас или их вытеснили диффузии?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.