Normalizing Flows
Los flujos de normalización transforman ruido simple en datos complejos mediante capas invertibles, lo que permite que un mismo modelo genere muestras y calcule verosimilitudes exactas. Descubre cómo funcionan.
Un flujo normalizante es un modelo de IA generativa que transforma una distribución base sencilla, normalmente una gaussiana estándar, en una distribución de datos compleja mediante una secuencia de funciones invertibles y diferenciables. Como cada capa puede ejecutarse en sentido inverso y su efecto sobre el volumen se calcula exactamente, un flujo realiza dos tareas que la mayoría de los modelos generativos no pueden combinar: genera muestras nuevas propagando ruido hacia delante por las capas y calcula la verosimilitud exacta de un dato observado propagándolo hacia atrás hasta la distribución base. Esteban Tabak y sus colaboradores formularon los flujos para la estimación de densidad en 2010 y 2013, y Danilo Rezende y Shakir Mohamed, de DeepMind, introdujeron el nombre en el aprendizaje profundo con Variational Inference with Normalizing Flows, en ICML 2015. «Normalizante» hace referencia a convertir la distribución de datos en una distribución normal o gaussiana y no tiene relación con la normalización por lotes.
La fórmula de cambio de variable#
Si una función invertible f transforma un dato x en un punto latente z = f(x), la log-verosimilitud de los datos es log p(x) = log p_z(f(x)) + log |det J|, donde J es la matriz jacobiana de f y el determinante mide cuánto estira o comprime f el volumen alrededor de x. Para una función general de D variables, calcular ese determinante requiere del orden de D³ operaciones, demasiado lento para imágenes con cientos de miles de dimensiones. Por eso, las capas de flujo se diseñan con jacobianos triangulares, cuyo determinante es simplemente el producto de los elementos de la diagonal. Al apilar muchas capas de este tipo se componen sus transformaciones y se suman sus log-determinantes; el entrenamiento maximiza directamente la log-verosimilitud de los datos de entrenamiento.
La capa de acoplamiento afín de RealNVP es el diseño clásico. La mitad de la entrada pasa sin cambios y alimenta una pequeña red neuronal que determina una escala y un desplazamiento para la otra mitad, como en esta capa de 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}")La fórmula simplificada y el jacobiano completo dan ambos un log-determinante de 0.1489, y la inversa recupera la entrada con un error máximo de 1.2e-07, debido al redondeo de float32. Nunca es necesario invertir la red que hay dentro de la capa, por lo que puede tener cualquier nivel de complejidad.
Arquitecturas de flujo#
- Flujos de acoplamiento: NICE (2014), de Laurent Dinh y sus colaboradores, y RealNVP (2016) alternan qué mitad se transforma. Glow (2018), de OpenAI, añadió convoluciones invertibles 1 x 1 aprendidas y generó rostros realistas de 256 x 256 píxeles. Tanto el muestreo como la evaluación de densidad son rápidos.
- Flujos autorregresivos: Transforman cada dimensión condicionándola a las anteriores. Los flujos autorregresivos enmascarados evalúan densidades en una sola pasada, pero muestrean una dimensión cada vez; los flujos autorregresivos inversos hacen lo contrario. TarFlow (2024), de Apple, apila bloques Transformer autorregresivos sobre parches de imagen y fue el primer flujo independiente cuyas muestras rivalizaron en calidad con los modelos de difusión.
- Flujos continuos: Definen la transformación como la solución de una ecuación diferencial ordinaria, lo que elimina las restricciones de diseño de las capas; FFJORD (2018) sigue el cambio de la log-densidad con un estimador estocástico de la traza.
Aplicaciones#
- Detección de anomalías: DifferNet (2021), CFLOW-AD y FastFlow ajustan flujos a las características de una red neuronal convolucional preentrenada con imágenes de productos sin defectos y marcan como defectuosas las imágenes con baja verosimilitud. En 2021, FastFlow comunicó un AUC del 99.4 % en detección de anomalías en el conjunto de referencia de inspección industrial MVTec AD.
- Síntesis de voz: WaveGlow (2018), de NVIDIA, generaba audio hablado a partir de espectrogramas mel en una única pasada paralela.
- Muestreo científico: Los generadores de Boltzmann (2019), de Frank Noé y sus colaboradores, muestrean estados de equilibrio de moléculas y proteínas y usan la verosimilitud exacta para reponderar las muestras y ajustarlas a la distribución física real.
Estos detectores modelan características en vez de píxeles por una razón que Eric Nalisnick y sus colaboradores demostraron en 2019: un modelo Glow entrenado con fotografías de CIFAR-10 asigna una verosimilitud mayor a imágenes de números de casas de SVHN que nunca había visto. Más adelante se descubrió que el problema se debía a que los flujos modelan más las correlaciones locales entre píxeles que el contenido de las imágenes. Para la detección de defectos, la entrada del flujo puede ser un conjunto de incrustaciones de cualquier red troncal preentrenada: el método embed de Ultralytics YOLO26 devuelve un vector de características con agrupación media por imagen y, de forma predeterminada, lo extrae de la capa justo antes del cabezal de detección.
Flujos normalizantes y términos relacionados#
- Emparejamiento de flujo y flujo rectificado: Entrenan un flujo continuo mediante regresión de su campo de velocidad, sin calcular el log-determinante durante el entrenamiento, y ahora impulsan generadores de imágenes de gran tamaño.
- Autoencoders variacionales y modelos de difusión: Se entrenan con una cota inferior de la verosimilitud.
- GAN: Aprenden a engañar a un discriminador y no proporcionan ninguna verosimilitud.
- Redes de flujo generativo (GFlowNets): Comparten la palabra «flujo», pero construyen objetos discretos paso a paso con una probabilidad proporcional a una recompensa.










