Demonstrações interativas da aula de modelos difusores
Quatro visualizações que acompanham os slides: o processo de difusão (forward), o noise schedule, a álgebra gaussiana por trás do kernel e da posterior, e o treinamento ao vivo de um mini modelo difusor em 2D, direto no navegador. Notação dos slides: zt, βt, αt = ∏s≤t(1−βs).
Partimos de amostras de uma distribuição simples e aplicamos a regra sequencial zt = √(1−βt)·zt−1 + √βt·εt, com εt ∼ 𝒩(0, I). Arraste o tempo e observe a distribuição marginal (roxo) convergir para a normal padrão (tracejado).
Trajetórias zt no tempo (3 instâncias destacadas)
Marginal q(zt) no instante atual
Os hiperparâmetros βt controlam a velocidade da difusão. Acumulando αt = ∏(1−βs) obtemos quanto sinal (√αt) e quanto ruído (√(1−αt)) compõem zt = √αt·x + √(1−αt)·ε.
βt
αt = ∏(1−βs)
√αt (sinal) vs √(1−αt) (ruído)
zt = √αt·x + √(1−αt)·ε aplicado pixel a pixel
Da mesma instância x saem várias trajetórias estocásticas. O kernel q(zt|x) = 𝒩(√αt·x, (1−αt)·I) permite amostrar o resultado de t passos de uma vez. Compare o histograma das trajetórias sequenciais (ciano) com amostras diretas do kernel (verde): ambas seguem a mesma densidade (roxo). Arraste o marcador de x.
30 trajetórias sequenciais a partir do mesmo x
Em t: trajetórias vs kernel vs densidade exata
A difusão revertida no tempo, condicionada em x, é proporcional ao produto q(zt|zt−1) · q(zt−1|x). O produto de duas gaussianas é gaussiano: a posterior (roxo) fica entre a verossimilhança (ciano) e a prior (laranja), e é mais estreita que ambas. Arraste os marcadores de x e zt no gráfico.
Curvas sobre o eixo zt−1 (arraste x e zt)
💡 Observe com o slider: com t pequeno a prior é estreita (pouco ruído acumulado, variância 1−αt−1 pequena) e a posterior praticamente coincide com ela, a informação vem de x. Com t grande a prior fica quase plana e a posterior cola na verossimilhança, a informação vem de zt. É por isso que a amostragem reversa pode partir de ruído puro: perto de t = T, condicionar em x quase não muda a posterior (teste arrastando x com t = 50).
Uma MLP g(z, t, c) (13→64→64→2, ~5,6 mil parâmetros) é treinada aqui no navegador com o algoritmo dos slides: sorteia t ∼ U{1..T} e ε ∼ 𝒩(0,I), monta zt = √αt·x + √(1−αt)·ε pelo kernel e minimiza ‖g(zt, t) − ε‖². Depois, a amostragem reversa transforma ruído puro nas duas luas.
Loss (média móvel, escala log). O patamar ≈ variância irredutível do ruído, não é bug.
Amostragem reversa: zT ∼ 𝒩(0,I) → dados
Amostragem (slides): ẑt−1 = zt/√(1−βt) − (βt/(√(1−αt)·√(1−βt)))·g(zt, t), depois zt−1 = ẑt−1 + σt·ε. Com condição de classe, usa-se classifier-free guidance: g̃ = (1+w)·g(z, t, c) − w·g(z, t, ∅).