Difusão Latente: Comprimir Antes de Gerar
por Frank de Alcantara em 28/07/2026
Remover ruído de uma imagem de alta resolução é caro por uma razão pouco misteriosa: há muitos pixels, e o modelo precisa visitar o tensor repetidas vezes. Uma imagem de $1024\times1024$ possui dezesseis vezes a área de uma imagem de $256\times256$. Se a rede trabalhar diretamente nos pixels durante dezenas de passos, a conta cresce antes que qualquer amostra tenha a oportunidade de nos impressionar.
Índice da Série: Representações e Modelos de Mundo
- 1. Autoencoders: o Gargalo, a Reconstrução e o Latente
- 2. Difusão Latente: Comprimir Antes de Gerar (Você está aqui)
- 3. SimCLR: Aprender por Contraste e Pagar pelos Negativos
- 4. BYOL: Aprender sem Negativos sem Entregar Tudo ao Colapso
- 5. DINO: Autodestilação e Objetos que Emergem da Atenção
- 6. MAE: Mascarar 75% da Imagem e Reconstruir o que Falta
- 7. Prever, não gerar: o template JEPA e o problema do colapso
A difusão latente começa com uma pergunta de engenharia: precisamos executar todo o processo generativo no espaço em que a imagem será exibida? No artigo anterior, construímos justamente uma passagem para outro espaço:
\[z=E(x),\qquad \hat{x}=D(z).\]O encoder comprime a imagem; o decoder tenta reconstruí-la. A difusão latente acrescenta um segundo modelo entre essas duas operações. Em vez de aprender a remover ruído diretamente de $x$, aprende no latente $z$:
\[x\rightarrow z_0\rightarrow z_t\rightarrow\hat{z}_0\rightarrow\hat{x}.\]Essa decomposição separa responsabilidades e também separa os lugares em que podemos fracassar. O autoencoder define quais imagens podem ser reconstruídas a partir do latente. O modelo de difusão aprende uma distribuição sobre esse espaço. Se o primeiro descartou um detalhe, o segundo não possui um túnel secreto de volta aos pixels. A arquitetura pode ser prodigiosa; a informação continua desaparecida.
1. Corrupção gradual
Um DDPM, de denoising diffusion probabilistic model (modelo probabilístico de difusão com remoção de ruído), define uma cadeia direta que adiciona ruído gaussiano. Para passos $t=1,\ldots,T$:
\[q(x_t\mid x_{t-1}) =N\!\left(\sqrt{1-\beta_t}\,x_{t-1},\,\beta_t I\right),\]na qual $\beta_t\in(0,1)$ controla quanto ruído entra no passo. Defina $\alpha_t=1-\beta_t$ e
\[\bar{\alpha}_t=\prod_{s=1}^{t}\alpha_s.\]Então podemos amostrar $x_t$ diretamente a partir de $x_0$:
\[x_t=\sqrt{\bar{\alpha}_t}\,x_0+ \sqrt{1-\bar{\alpha}_t}\,\varepsilon, \qquad \varepsilon\sim N(0,I).\]O primeiro coeficiente conserva sinal; o segundo injeta ruído. Como seus quadrados somam $1$, uma entrada de variância unitária permanece com variância unitária sob as hipóteses do modelo. Quando $\bar{\alpha}_t$ se aproxima de zero, quase toda informação sobre $x_0$ desaparece.
2. Aprender o caminho inverso
O processo reverso verdadeiro depende da distribuição dos dados e não está disponível em forma simples. Uma rede $\varepsilon_\theta(x_t,t)$ aprende a prever o ruído usado na corrupção. A forma simplificada da perda é
\[\mathcal{L}_{\mathrm{noise}} =\mathbb{E}_{x_0,t,\varepsilon} \left\lVert \varepsilon-\varepsilon_\theta(x_t,t) \right\rVert_2^2.\]Durante a amostragem, começamos de ruído e aplicamos muitas avaliações da rede para caminhar até uma amostra. Diferentes formulações predizem ruído, score, a própria amostra limpa ou velocidade. Elas reorganizam o alvo e a ponderação; não mudam o fato central de que existe um processo iterativo aprendido.
É aqui que difusão e denoising autoencoder parecem parentes. Ambos recebem entrada corrompida e aprendem remoção de ruído. O DDPM, porém, organiza uma família inteira de níveis de ruído e usa o modelo para definir uma cadeia generativa.
3. Trocar pixels por latentes
Na difusão latente, um autoencoder pré-treinado produz $z_0=E(x)$. O processo direto torna-se
\[z_t=\sqrt{\bar{\alpha}_t}\,z_0+ \sqrt{1-\bar{\alpha}_t}\,\varepsilon,\]e a rede aprende $\varepsilon_\theta(z_t,t,c)$, possivelmente condicionada por texto ou outra variável $c$. Ao final, $D(\hat{z}_0)$ devolve uma imagem.
Considere uma imagem $256\times256\times3$. Com redução espacial $f=4$ e latente de quatro canais, o tensor passa de
\[256\cdot256\cdot3=196\,608\]valores para
\[64\cdot64\cdot4=16\,384.\]Isso representa doze vezes menos elementos. O ganho real do denoiser depende de canais internos, arquitetura e atenção, mas as convoluções passam a operar numa grade cuja área é $1/f^2=1/16$ da original.
Compressão excessiva cobra qualidade. No artigo de difusão latente, fatores espaciais moderados, como $4$ e $8$, ocupam o regime útil; reduzir demais piora o limite de reconstrução. O resultado não é surpresa: o modelo generativo só consegue distribuir massa sobre imagens acessíveis por $D(z)$.
4. Duas perdas, dois contratos
O primeiro estágio aprende reconstrução, usualmente combinando termos de pixel, perceptuais e regularização do latente. O segundo aprende remoção de ruído no espaço fixado:
\[\mathcal{L}_{\mathrm{total}} \neq \mathcal{L}_{\mathrm{rec}}+\mathcal{L}_{\mathrm{noise}}\]em uma única otimização necessariamente conjunta. Na receita clássica de LDM, o autoencoder é treinado primeiro e congelado para o treino da difusão. Isso evita que o espaço se mova enquanto o denoiser tenta aprendê-lo.
As métricas também não são intercambiáveis. Erro de reconstrução mede o teto do primeiro estágio. Perda de ruído mede o objetivo do segundo. FID, precisão e recall de amostras avaliam propriedades da distribuição gerada. Acurácia de uma sonda mede utilidade de representação. Um número baixo numa coluna não quita automaticamente as demais.
5. O processo direto em C++23
O código abaixo verifica a forma fechada em um exemplo unidimensional. Fixamos $x_0=0{,}8$, $\varepsilon=-0{,}35$ e $\bar{\alpha}_t=e^{-5t/T}$. O cronograma exponencial é didático; não reproduz uma receita de treinamento específica.
#include <cmath>
#include <iomanip>
#include <initializer_list>
#include <iostream>
double noisy_sample(
const double clean,
const double noise,
const double alpha_bar) {
return std::sqrt(alpha_bar) * clean
+ std::sqrt(1.0 - alpha_bar) * noise;
}
int main() {
constexpr double clean = 0.8;
constexpr double noise = -0.35;
constexpr int total_steps = 100;
std::cout << std::fixed << std::setprecision(6);
for (const int step : {0, 20, 50, 100}) {
const double alpha_bar =
std::exp(-5.0 * step / total_steps);
std::cout << "t=" << step
<< " alpha_bar=" << alpha_bar
<< " z_t=" << noisy_sample(clean, noise, alpha_bar)
<< '\n';
}
}
A mesma fórmula age elemento a elemento sobre tensores. Em produção, a rede recebe também uma codificação do passo $t$, pois remover pouco ruído perto do início e recuperar sinal quase apagado no fim são problemas diferentes.
No MSVC 19.51, compilamos com cl /std:c++latest /permissive- /W4 /EHsc /utf-8 /O2 forward_diffusion.cpp. O valor começa em z_t=0.800000, cruza 0.206953 no passo 20 e chega a -0.283151 no passo 100. Não deve chegar exatamente ao ruído $-0{,}35$, pois $\bar{\alpha}_{100}=e^{-5}\approx0{,}006738$ ainda conserva uma pequena parcela do sinal.
6. Laboratório: compressão e ruído
Altere o fator espacial e o passo de ruído. O painel mostra a forma do latente, a fração relativa de elementos e a mistura entre sinal e ruído. O “teto de detalhe” é uma ilustração monotônica, não uma métrica de um modelo real; serve para lembrar que custo e reconstrução caminham em direções opostas.
7. CPU, GPU e avaliações repetidas
Uma amostra exige muitas passadas pelo denoiser. Mesmo que cada passada fique mais barata no latente, o custo total multiplica-se pelo número de passos. Em CPUs, convoluções grandes e atenção repetida tornam geração de alta resolução difícil de amortizar. Em GPUs, o latente reduz ativação e tráfego, enquanto lotes e condicionamento alimentam os kernels matriciais.
O gargalo muda durante a amostragem. Camadas convolucionais reutilizam vizinhanças; atenção pode materializar relações quadráticas; decodificação final volta ao espaço de pixels. Medir apenas FLOPs do U-Net e ignorar passos, transferências e o decoder é pagar metade da conta e declarar o jantar barato.
8. Por que JEPA não é uma difusão sem decoder
Uma difusão latente precisa de um espaço decodificável porque sua finalidade é gerar amostras. A JEPA, que encontraremos no Artigo 7, prevê uma representação-alvo e não precisa convertê-la numa imagem. Isso permite que o encoder descarte detalhes que não ajudam a tarefa preditiva, embora não garanta que descartará os detalhes corretos.
O contraste seguro está no objetivo:
\[\text{LDM: modelar e amostrar }z,\qquad \text{JEPA: prever uma representação }s_y.\]No próximo artigo, sairemos da reconstrução e da geração. O SimCLR organizará representações por comparação, aproximando duas views relacionadas e afastando exemplos diferentes.
A difusão latente economiza porque gera num espaço comprimido. Continua devendo ao decoder cada detalhe que deseja mostrar.
Acrônimos e Abreviações neste artigo
A seguir está a lista de todos os acrônimos e abreviações identificados no texto, organizados em ordem alfabética com o termo original em inglês e a tradução para o português:
| Acrônimo / Abreviação | Definição em Inglês | Tradução em Português |
|---|---|---|
BLAS |
Basic Linear Algebra Subprograms | Subprogramas Básicos de Álgebra Linear |
CPU / CPUs |
Central Processing Unit | Unidade Central de Processamento |
FLOPs |
Floating Point Operations | Operações de Ponto Flutuante |
FP32 |
32-bit Floating Point | Ponto Flutuante de 32 bits |
GEMM |
General Matrix Multiply | Multiplicação Geral de Matrizes |
GPU |
Graphics Processing Unit | Unidade de Processamento Gráfico |
IA |
Artificial Intelligence | Inteligência Artificial |
I-JEPA |
Image Joint-Embedding Predictive Architecture | Arquitetura Preditiva de Incorporação Conjunta de Imagem |
JEPA |
Joint-Embedding Predictive Architecture | Arquitetura Preditiva de Incorporação Conjunta |
KiB |
Kibibyte | Kibibyte |
MAE |
Masked Autoencoder | Autocodificador Mascarado |
MSE |
Mean Squared Error | Erro Quadrático Médio |
MSVC |
Microsoft Visual C++ | Microsoft Visual C++ |
PCA |
Principal Component Analysis | Análise de Componentes Principais |
SIMD |
Single Instruction, Multiple Data | Instrução Única, Múltiplos Dados |
SimCLR |
Simple Framework for Contrastive Learning of Visual Representations | Estrutura Simples para Aprendizado Contrastivo de Representações Visuais |
Referências
HO, J.; JAIN, A.; ABBEEL, P. Denoising Diffusion Probabilistic Models. Advances in Neural Information Processing Systems, v. 33, 2020. Disponível em: https://papers.nips.cc/paper/2020/hash/4c5bcfec8584af0d967f1ab10179ca4b-Abstract.html. Acesso em: 28 jul. 2026.
ROMBACH, R.; BLATTMANN, A.; LORENZ, D.; ESSER, P.; OMMER, B. High-Resolution Image Synthesis with Latent Diffusion Models. Proceedings of CVPR 2022, p. 10684-10695, 2022. Disponível em: https://openaccess.thecvf.com/content/CVPR2022/html/Rombach_High-Resolution_Image_Synthesis_With_Latent_Diffusion_Models_CVPR_2022_paper.html. Acesso em: 28 jul. 2026.
Índice da Série: Representações e Modelos de Mundo
- 1. Autoencoders: o Gargalo, a Reconstrução e o Latente
- 2. Difusão Latente: Comprimir Antes de Gerar (Você está aqui)
- 3. SimCLR: Aprender por Contraste e Pagar pelos Negativos
- 4. BYOL: Aprender sem Negativos sem Entregar Tudo ao Colapso
- 5. DINO: Autodestilação e Objetos que Emergem da Atenção
- 6. MAE: Mascarar 75% da Imagem e Reconstruir o que Falta
- 7. Prever, não gerar: o template JEPA e o problema do colapso
(Updated: )