Modelos de difusão surgiram como uma abordagem poderosa em IA generativa, produzindo resultados de última geração em geração de imagem, áudio e vídeo. Neste artigo técnico aprofundado, exploraremos como os modelos de difusão funcionam, suas principais inovações e por que eles se tornaram tão bem-sucedidos. Abordaremos os fundamentos matemáticos, o processo de treinamento, os algoritmos de amostragem e as aplicações de ponta dessa nova e empolgante tecnologia.
Introdução aos Modelos de Difusão
Modelos de difusão são uma classe de modelos generativos que aprendem a gradualmente reduzir o ruído dos dados revertendo um processo de difusão. A ideia central é começar com ruído puro e refiná-lo iterativamente em uma amostra de alta qualidade da distribuição alvo.
Essa abordagem foi inspirada pela termodinâmica de não equilíbrio – especificamente, o processo de reversão da difusão para recuperar a estrutura. No contexto do aprendizado de máquina, podemos pensar nisso como aprender a reverter a adição gradual de ruído aos dados.
Algumas vantagens principais dos modelos de difusão incluem:
- Qualidade de imagem de última geração, superando GANs em muitos casos
- Treinamento estável sem dinâmicas adversas
- Altamente paralelizável
- Arquitetura flexível – qualquer modelo que mapeie entradas para saídas da mesma dimensionalidade pode ser usado
- Forte embasamento teórico
Vamos nos aprofundar em como os modelos de difusão funcionam.
Equações Diferenciais Estocásticas governam os processos direto e reverso em modelos de difusão. A SDE direta adiciona ruído aos dados, transformando-os gradualmente em uma distribuição de ruído. A SDE reversa, guiada por uma função de pontuação aprendida, take away progressivamente o ruído, levando à geração de imagens realistas a partir de ruído aleatório. Essa abordagem é essencial para atingir desempenho generativo de alta qualidade em espaços de estado contínuos
O Processo de Difusão Direta
O processo de difusão direta começa com um ponto de dados x₀ amostrado da distribuição de dados actual e adiciona gradualmente ruído gaussiano ao longo de T intervalos de tempo para produzir versões cada vez mais ruidosas x₁, x₂, …, xT.
Em cada passo de tempo t, adicionamos uma pequena quantidade de ruído de acordo com:
x_t = √(1 - β_t) * x_{t-1} + √(β_t) * ε
Onde:
- b_t é um cronograma de variação que controla quanto ruído é adicionado em cada etapa
- e é ruído gaussiano aleatório
Esse processo continua até que xT seja quase ruído gaussiano puro.
Matematicamente, podemos descrever isso como uma cadeia de Markov:
q(x_t | x_{t-1}) = N(x_t; √(1 - β_t) * x_{t-1}, β_t * I)
Onde N denota uma distribuição gaussiana.
O cronograma β_t é tipicamente escolhido para ser pequeno para os primeiros passos de tempo e aumentar ao longo do tempo. Escolhas comuns incluem cronogramas lineares, cosseno ou sigmoides.
O Processo de Difusão Reversa
O objetivo de um modelo de difusão é aprender o inverso desse processo: começar com ruído puro xT e progressivamente reduzi-lo para recuperar uma amostra limpa x₀.
Modelamos esse processo reverso como:
p_θ(x_{t-1} | x_t) = N(x_{t-1}; μ_θ(x_t, t), σ_θ^2(x_t, t))
Onde μ_θ e σ_θ^2 são funções aprendidas (normalmente redes neurais) parametrizadas por θ.
A principal inovação é que não precisamos modelar explicitamente a distribuição reversa completa. Em vez disso, podemos parametrizá-la em termos do processo ahead, que conhecemos.
Especificamente, podemos mostrar que a média ótima do processo reverso μ* é:
μ* = 1/√(1 - β_t) * (x_t - β_t/√(1 - α_t) * ε_θ(x_t, t))
Onde:
- α_t = 1 – β_t
- ε_θ é uma rede de previsão de ruído aprendida
Isso nos dá um objetivo simples: treinar uma rede neural ε_θ para prever o ruído que foi adicionado em cada etapa.
Objetivo do treinamento
O objetivo de treinamento para modelos de difusão pode ser derivado de inferência variacional. Após alguma simplificação, chegamos a uma perda L2 simples:
L = E_t,x₀,ε ( ||ε - ε_θ(x_t, t)||² )
Onde:
- t é amostrado uniformemente de 1 a T
- x₀ é amostrado a partir dos dados de treinamento
- ε é ruído gaussiano amostrado
- x_t é construído adicionando ruído a x₀ de acordo com o processo direto
Em outras palavras, estamos treinando o modelo para prever o ruído que foi adicionado em cada intervalo de tempo.
Arquitetura do modelo
A arquitetura U-Web é central para a etapa de denoising no modelo de difusão. Ela apresenta uma estrutura codificador-decodificador com conexões de salto que ajudam a preservar detalhes de granulação fina durante o processo de reconstrução. O codificador reduz progressivamente a amostragem da imagem de entrada enquanto captura recursos de alto nível, e o decodificador aumenta a amostragem dos recursos codificados para reconstruir a imagem. Essa arquitetura é particularmente eficaz em tarefas que exigem localização precisa, como segmentação de imagem.
A rede de previsão de ruído ε_θ
pode usar qualquer arquitetura que mapeie entradas para saídas da mesma dimensionalidade. Arquiteturas de estilo U-Web são uma escolha in style, especialmente para tarefas de geração de imagens.
Uma arquitetura típica pode se parecer com:
class DiffusionUNet(nn.Module): def __init__(self): tremendous().__init__() # Downsampling self.down1 = UNetBlock(3, 64) self.down2 = UNetBlock(64, 128) self.down3 = UNetBlock(128, 256) # Bottleneck self.bottleneck = UNetBlock(256, 512) # Upsampling self.up3 = UNetBlock(512, 256) self.up2 = UNetBlock(256, 128) self.up1 = UNetBlock(128, 64) # Output self.out = nn.Conv2d(64, 3, 1) def ahead(self, x, t): # Embed timestep t_emb = self.time_embedding # Downsample d1 = self.down1(x, t_emb) d2 = self.down2(d1, t_emb) d3 = self.down3(d2, t_emb) # Bottleneck bottleneck = self.bottleneck(d3, t_emb) # Upsample u3 = self.up3(torch.cat((bottleneck, d3), dim=1), t_emb) u2 = self.up2(torch.cat((u3, d2), dim=1), t_emb) u1 = self.up1(torch.cat((u2, d1), dim=1), t_emb) # Output return self.out(u1)