Demonstrações interativas da aula de Autoencoders e Variational Autoencoders
Quatro visualizações que acompanham os slides: um autoencoder com gargalo treinado ao vivo em dados 2D (encoder g(x,φ), decoder f(z,θ), score de anomalia s(x) = ‖x − f(g(x,φ),θ)‖²), a comparação entre o espaço latente do AE e o do VAE (posterior aproximado q(z|x,φ) = N(μ, σ²) contra o prior p(z) = N(0, 1)), o reparametrization trick z* = μ + σ·ε com ε ~ N(0,1), e o ELBO decomposto em reconstrução mais DKL[q(z|x,φ) ‖ p(z)] com o peso β ajustável durante o treino.
Um autoencoder é treinado para reconstruir a própria entrada: argminθ,φ J(X, f(g(X,φ),θ)), onde g é o encoder e f é o decoder. Aqui os dados vivem em 2D mas formam uma variedade de dimensão 1 (duas luas), e o gargalo força a rede a descobrir isso: com latente 1D, a imagem do decoder é uma curva (laranja) que persegue os dados, e cada ponto é reconstruído pela sua projeção nessa curva. Sem gargalo (latente 2D, mesma dimensão da entrada), a rede aprende a cópia e reconstrói bem qualquer ponto do plano. A sonda roxa arrastável mostra a aplicação em detecção de anomalias: o score s(x) = ‖x − f(g(x,φ),θ)‖² é baixo sobre os dados e alto longe deles, mas só quando existe gargalo.
Dados, reconstruções x̂ e variedade aprendida (arraste a sonda roxa para medir s(x))
Perda de reconstrução J por passo de treino (escala log)
💡 Treine até J < 0.05 e arraste a sonda: sobre as luas s(x) ≈ 0.01, no vão entre elas e nos cantos s(x) > 1. Agora troque para a aba de latente 2D: a perda cai muito mais rápido e s(x) fica pequeno em quase todo o plano, a rede virou uma cópia e o detector de anomalias quebra. É a regularização por gargalo do slide: sem ela, o autoencoder não aprende estrutura.
Um AE e um VAE com latente 1D são treinados ao vivo nos mesmos dados. O AE mapeia cada x em um único código z = g(x,φ): os códigos formam aglomerados com buracos, e nada obriga a distribuição deles a ter uma forma conhecida. Para gerar dados novos seríamos tentados a ajustar uma gaussiana sobre os códigos e amostrar dela, mas as amostras caem nos buracos e decodificam pontos fora da variedade. O encoder do VAE produz uma distribuição q(z|x,φ) = N(μ(x), σ²(x)) para cada instância, e o termo KL do ELBO empurra essas gaussianas para o prior p(z) = N(0,1): elas se sobrepõem, o posterior agregado cobre o prior, e amostrar z ~ p(z) e decodificar com f(z,θ) (a amostragem ancestral dos slides) gera pontos sobre os dados.
Latente do AE: códigos z = g(x,φ) (histograma) e a gaussiana ajustada a eles (arraste para mover z*)
Latente do VAE: q(z|x,φ) individuais, posterior agregado e prior N(0,1) (arraste para mover z*)
Espaço de dados: gerações z ~ N(0,1) decodificadas por cada modelo e o ponto f(z*) de cada decoder
💡 Treine os dois modelos (uns 4000 passos) e arraste z* da esquerda para a direita. No histograma do AE aparecem vales sem código nenhum: quando z* cruza um vale, o ponto ciano fAE(z*) atravessa regiões vazias do plano. No VAE o posterior agregado (laranja) gruda no prior verde e o ponto laranja anda quase sempre sobre os dados. Compare também as nuvens de gerações: conte quantos pontos cianos caem fora das luas em relação aos laranjas.
A amostragem z* ~ q(z|x,φ) é um nó estocástico no meio da rede, e não dá para fazer backpropagation através de um sorteio. O truque visto em aula reescreve a amostra como z* = μ + σ·ε com ε ~ N(0,1) sorteado fora da rede: o gráfico da esquerda mostra que isso é só uma reta, com inclinação σ e intercepto μ, aplicada ao ruído. Os gradientes ∂z/∂μ = 1 e ∂z/∂σ = ε existem e fluem até φ. À direita, o custo dessa liberdade: o termo DKL[N(μ,σ²) ‖ N(0,1)] = ½(μ² + σ² − 1 − log σ²) em forma fechada (o caso 1D da fórmula da caixa dos slides), que pune desvio da origem (μ²), variância grande (σ²) e variância pequena demais (−log σ², o termo anti-colapso).
Ruído ε no eixo horizontal, reta z = μ + σ·ε e o histograma resultante de z na vertical
Mapa de DKL[N(μ,σ²) ‖ N(0,1)] no plano (μ, σ): arraste o ponto, claro = KL alto
💡 Ligue a chuva de amostras e arraste μ: as amostras já sorteadas deslizam junto, porque z é função determinística de (μ, σ) dado o ruído. Com σ = 0.05 a reta fica quase horizontal e o histograma vira um espeto, mas o KL dispara por causa do −log σ²; confira no mapa que o mínimo KL = 0 é exatamente (μ, σ) = (0, 1), quando q coincide com o prior. Reproduza o exemplo numérico dos slides com μ = 0.5, σ² = 0.25 (σ = 0.5).
A função de custo do VAE é −ELBO = reconstrução + DKL[q(z|x,φ) ‖ p(z)], e para verossimilhança gaussiana a reconstrução é exatamente um MSE, como nos slides. Aqui você treina o VAE com a perda generalizada recon + β·KL e muda β durante o treino. Com β = 1 recupera-se o ELBO; com β = 0 sobra só a reconstrução e o modelo vira um AE, com σ(x) → 0 e os μ(x) espalhados longe do prior; com β grande o KL domina e aparece o posterior collapse da aula: KL → 0, μ(x) → 0, σ(x) → 1 para todo x, e o decoder, sem informação em z, reconstrói um borrão perto da média dos dados.
Espaço latente: q(z|x,φ) individuais, posterior agregado, prior e as médias μ(x)
Espaço de dados: reconstruções f(μ(x),θ) e a curva gerada ao varrer z pelo prior
Termos da perda por passo de treino; as linhas tracejadas marcam as mudanças de β
💡 Treine com β = 1 até estabilizar e então arraste β para 10 sem pausar: a curva vermelha (KL) despenca, as marcas de μ(x) colapsam em zero e as reconstruções cianas se amontoam no centro, o quadro clássico de posterior collapse. Volte para β = 0 e veja o efeito oposto: a reconstrução melhora, mas o posterior agregado descola do prior verde e o latente deixa de ser amostrável. O equilíbrio do ELBO é o meio termo que mantém as duas coisas.