Normalizing Flows
Нормализующие потоки преобразуют простой шум в сложные данные с помощью обратимых слоёв, поэтому одна модель может и генерировать выборки, и вычислять точные правдоподобия. Разбираем принцип работы.
Нормализующий поток — это модель генеративного ИИ, которая преобразует простое базовое распределение, обычно стандартное гауссово, в сложное распределение данных с помощью последовательности обратимых дифференцируемых функций. Поскольку каждый слой можно вычислить в обратном направлении, а его влияние на объём — точно определить, один поток выполняет две задачи, которые большинство генеративных моделей не могут выполнять одновременно: генерирует новые образцы, пропуская шум вперёд через слои, и вычисляет точное правдоподобие наблюдаемой точки данных, передавая её обратно в базовое распределение. Эстебан Табак и его коллеги сформулировали методы потоков для оценки плотности в 2010 и 2013 годах, а Данило Резенде и Шакир Мохамед из DeepMind ввели это название в глубокое обучение в работе Variational Inference with Normalizing Flows, представленной на ICML 2015. «Нормализующий» означает преобразование распределения данных в нормальное, то есть гауссово, и не связано с пакетной нормализацией.
Формула замены переменных#
Если обратимая функция f переводит точку данных x в латентную точку z = f(x), логарифм правдоподобия данных равен log p(x) = log p_z(f(x)) + log |det J|, где J — матрица Якоби функции f, а определитель показывает, насколько f растягивает или сжимает объём вокруг x. Для общей функции от D переменных вычисление этого определителя требует порядка D³ операций — это слишком медленно для изображений с сотнями тысяч измерений. Поэтому слои потока проектируют с треугольными матрицами Якоби, определитель которых равен просто произведению диагональных элементов. Последовательное объединение таких слоёв комбинирует их преобразования и складывает их логарифмы определителей, а обучение напрямую максимизирует правдоподобие обучающих данных.
Аффинный слой сопряжения из RealNVP — классическая архитектура. Половина входных данных проходит без изменений и поступает в небольшую нейронную сеть, которая задаёт масштаб и сдвиг для другой половины, как в этом слое PyTorch:
import torch
from torch import nn
torch.manual_seed(0)
# Affine coupling layer (RealNVP): x1 passes through unchanged and sets the scale and shift for x2
net = nn.Sequential(nn.Linear(2, 32), nn.Tanh(), nn.Linear(32, 4))
def coupling(x):
"""Map data x to z and return log|det J|, which is just the sum of the log-scales."""
x1, x2 = x.chunk(2, dim=-1)
log_s, t = net(x1).chunk(2, dim=-1)
return torch.cat([x1, x2 * log_s.exp() + t], dim=-1), log_s.sum(dim=-1)
x = torch.randn(4)
z, log_det = coupling(x)
jacobian = torch.autograd.functional.jacobian(lambda v: coupling(v)[0], x)
print(f"log|det J|: {log_det:.4f} from the formula, {torch.logdet(jacobian):.4f} from the full 4x4 Jacobian")
# Inverse: z1 equals x1, so the same scale and shift can be recomputed and undone
z1, z2 = z.chunk(2)
log_s, t = net(z1).chunk(2)
x_rec = torch.cat([z1, (z2 - t) * (-log_s).exp()])
print(f"Largest reconstruction error: {(x_rec - x).abs().max():.1e}")И упрощённая формула, и полная матрица Якоби дают логарифм определителя 0.1489, а обратное преобразование восстанавливает вход с точностью до 1.2e-07 — погрешности округления float32. Сеть внутри слоя не нужно обращать, поэтому она может иметь произвольную сложность.
Архитектуры потоков#
- Потоки сопряжения: NICE (2014) и RealNVP (2016) Лорана Дина и его коллег поочерёдно преобразуют разные половины входа, а Glow (2018) от OpenAI добавил обучаемые обратимые свёртки 1 x 1 и генерировал реалистичные лица размером 256 x 256. И генерация, и оценка плотности выполняются быстро.
- Авторегрессионные потоки: Преобразуют каждое измерение с учётом предыдущих. Маскированные авторегрессионные потоки оценивают плотность за один проход, но генерируют образцы по одному измерению за раз; обратные авторегрессионные потоки делают наоборот. TarFlow (2024) от Apple применяет авторегрессионные блоки трансформера к фрагментам изображений и стал первым автономным потоком, образцы которого по качеству сравнялись с образцами моделей диффузии.
- Непрерывные потоки: Задают преобразование как решение обыкновенного дифференциального уравнения, что снимает ограничения на конструкцию слоёв; FFJORD (2018) отслеживает изменение логарифма плотности с помощью стохастического оценивателя следа.
Применение#
- Обнаружение аномалий: DifferNet (2021), CFLOW-AD и FastFlow обучают потоки на признаках предварительно обученной свёрточной нейронной сети на изображениях изделий без дефектов, а изображениям с низким правдоподобием присваивают метку дефектных. В 2021 году FastFlow показал AUC 99.4% при обнаружении аномалий на промышленном контрольном наборе MVTec AD.
- Синтез речи: WaveGlow (2018) от NVIDIA генерировал аудиоречь из мел-спектрограмм за один параллельный проход.
- Научное сэмплирование: Генераторы Больцмана (2019) Франка Ноэ и его коллег выбирают равновесные состояния молекул и белков, используя точное правдоподобие для перевзвешивания образцов в соответствии с истинным физическим распределением.
Эти детекторы моделируют признаки, а не пиксели, и на то есть причина: в 2019 году Эрик Налисник и его коллеги показали, что модель Glow, обученная на фотографиях CIFAR-10, назначает более высокое правдоподобие изображениям номеров домов SVHN, которых она никогда не видела. Позже выяснилось, что потоки моделируют локальные корреляции пикселей лучше, чем содержание изображений. Для обнаружения дефектов на вход потока можно подавать эмбеддинги из любой предварительно обученной базовой модели: метод embed в Ultralytics YOLO26 возвращает по одному усреднённому вектору признаков на изображение — по умолчанию из слоя непосредственно перед головкой детекции.
Нормализующие потоки и похожие термины#
- Сопоставление потоков и выпрямленный поток: Обучают непрерывный поток, регрессируя его поле скоростей без вычисления логарифма определителя во время обучения; сейчас эти методы лежат в основе крупных генераторов изображений.
- Вариационные автокодировщики и модели диффузии: Обучаются максимизировать нижнюю границу правдоподобия.
- GAN: Обучаются обманывать дискриминатор и вовсе не вычисляют правдоподобие.
- Генеративные сети потоков (GFlowNets): Используют слово «поток», но пошагово создают дискретные объекты с вероятностью, пропорциональной вознаграждению.










