Embora os autoencodificadores variacionais (VAEs) sejam fáceis de implementar e treinar, explicá-los não é nada simples, porque eles misturam conceitos do Deep Learning e do Variational Bayes, e as comunidades Deep Learning e Probabilistic Modeling usam termos diferentes para os mesmos conceitos. Assim, ao explicar os VAEs, você corre o risco de se concentrar na parte do modelo estatístico, deixando o leitor sem uma pista sobre como realmente implementá-lo ou vice-versa para se concentrar na arquitetura da rede e na função de perda, na qual o termo Kullback-Leibler parece ser puxado para fora do ar. Vou tentar encontrar um meio termo aqui, começando pelo modelo, mas fornecendo detalhes suficientes para realmente implementá-lo na prática ou entender a implementação de outra pessoa.
VAEs são modelos generativos
Ao contrário dos auto-codificadores clássicos (esparsos, denoising, etc.), os VAEs são modelos generativos , como os GANs. Com modelo generativo, quero dizer um modelo que aprende a distribuição de probabilidade sobre o espaço de entrada . Isso significa que, depois de treinarmos esse modelo, podemos obter amostras de (nossa aproximação de) . Se nosso conjunto de treinamento for feito de dígitos manuscritos (MNIST), depois do treinamento, o modelo generativo poderá criar imagens que se parecem com dígitos manuscritos, mesmo que não sejam "cópias" das imagens no conjunto de treinamento.p(x)xp(x)
O aprendizado da distribuição das imagens no conjunto de treinamento implica que as imagens que parecem dígitos manuscritos devem ter uma alta probabilidade de serem geradas, enquanto imagens que parecem o Jolly Roger ou ruído aleatório devem ter uma probabilidade baixa. Em outras palavras, significa aprender sobre as dependências entre os pixels: se nossa imagem é uma imagem em escala de cinza de pixels do MNIST, o modelo deve aprender que, se um pixel é muito brilhante, há uma probabilidade significativa de que alguns vizinhos os pixels também são brilhantes; se tivermos uma linha longa e inclinada de pixels brilhantes, poderemos ter outra linha horizontal menor de pixels acima deste (a 7) etc.28×28=784
VAEs são modelos de variáveis latentes
O VAE é um modelo de variáveis latentes : isso significa que , o vetor aleatório das intensidades de 784 pixels (as variáveis observadas ), é modelado como uma função (possivelmente muito complicada) de um vetor aleatório de menor dimensionalidade, cujos componentes são variáveis não observadas ( latentes ). Quando esse modelo faz sentido? Por exemplo, no caso MNIST, pensamos que os dígitos manuscritos pertencem a uma variedade de dimensões muito menor que a dimensãoxz ∈ Z xz∈Zx, porque a grande maioria dos arranjos aleatórios com intensidades de 784 pixels não parece um dígito manuscrito. Intuitivamente, esperamos que a dimensão seja pelo menos 10 (o número de dígitos), mas é provavelmente maior porque cada dígito pode ser escrito de maneiras diferentes. Algumas diferenças não são importantes para a qualidade da imagem final (por exemplo, rotações e traduções globais), mas outras são importantes. Portanto, neste caso, o modelo latente faz sentido. Mais sobre isso mais tarde. Observe que, surpreendentemente, mesmo que nossa intuição nos diga que a dimensão deve cerca de 10, podemos definitivamente usar apenas 2 variáveis latentes para codificar o conjunto de dados MNIST com um VAE (embora os resultados não sejam bonitos). O motivo é que mesmo uma única variável real pode codificar infinitamente muitas classes, porque pode assumir todos os valores inteiros possíveis e muito mais. Obviamente, se as classes tiverem sobreposição significativa entre elas (como 9 e 8 ou 7 e I no MNIST), mesmo a função mais complicada de apenas duas variáveis latentes fará um trabalho ruim ao gerar amostras claramente discerníveis para cada classe. Mais sobre isso mais tarde.
Os VAEs assumem uma distribuição paramétrica multivariada (onde são os parâmetros de ) e aprendem os parâmetros do distribuição multivariada. O uso de um pdf paramétrico para , que impede que o número de parâmetros de um VAE cresça sem limites com o crescimento do conjunto de treinamento, é chamado amortização no jargão do VAE (sim, eu sei ...).q(z|x,λ)λqz
A rede do decodificador
Começamos a partir da rede de decodificadores porque o VAE é um modelo generativo, e a única parte do VAE que é realmente usada para gerar novas imagens é o decodificador. A rede do codificador é usada apenas no tempo de inferência (treinamento).
O objetivo da rede de decodificadores é gerar novos vetores aleatórios pertencentes ao espaço de entrada , ou seja, novas imagens, começando pelas realizações do vetor latente . Isso significa claramente que ele deve aprender a distribuição condicional . Para os VAEs, essa distribuição geralmente é considerada uma gaussiana multivariada 1 :xXzp(x|z)
pϕ(x|z)=N(x|μ(z;ϕ),σ(z;ϕ)2I)
ϕ é o vetor de pesos (e preconceitos) da rede do codificador. Os vetores e são funções não lineares complexas e desconhecidas, modelado pela rede do decodificador: as redes neurais são poderosas aproximações de funções não lineares.μ(z;ϕ)σ(z;ϕ)
Conforme observado por @amoeba nos comentários, há uma semelhança impressionante entre o decodificador e um modelo clássico de variáveis latentes: Análise Fatorial. Na análise fatorial, você assume o modelo:
x|z∼N(Wz+μ,σ2I), z∼N(0,I)
Ambos os modelos (FA e o decodificador) assumem que a distribuição condicional das variáveis observáveis nas variáveis latentes é gaussiana e que as próprias são gaussianas padrão. A diferença é que o decodificador não assume que a média de seja linear em , nem pressupõe que o desvio padrão seja um vetor constante. Pelo contrário, os modela como funções não lineares complexas do . A esse respeito, pode ser visto como Análise Fatorial não linear. Veja aquixzzp(x|z)zzpara uma discussão perspicaz dessa conexão entre FA e VAE. Como a FA com uma matriz de covariância isotrópica é apenas PPCA, isso também se vincula ao resultado bem conhecido de que um autoencoder linear reduz ao PCA.
Vamos voltar ao decodificador: como aprendemos ? Intuitivamente, queremos variáveis latentes que maximizem a probabilidade de gerar o no conjunto de treinamento . Em outras palavras, queremos calcular a distribuição de probabilidade posterior do , dados os dados:ϕzxiDnz
p(z|x)=pϕ(x|z)p(z)p(x)
Assumimos que antes de , e ficamos com o problema usual na inferência bayesiana de que calcular (a evidência ) é difícil ( integral multidimensional). Além disso, como aqui é desconhecido, não podemos computá-lo de qualquer maneira. Digite Inferência Variacional, a ferramenta que fornece o nome dos Autoencodificadores Variacionais.N(0,I)zp(x)μ ( z ; ϕ )μ(z;ϕ)
Inferência Variacional para o Modelo VAE
A Inferência Variacional é uma ferramenta para executar a Inferência Bayesiana aproximada para modelos muito complexos. Não é uma ferramenta excessivamente complexa, mas minha resposta já é muito longa e não vou entrar em uma explicação detalhada do VI. Você pode dar uma olhada nesta resposta e nas referências, se estiver curioso:
/stats//a/270569/58675
Basta dizer que VI procura uma aproximação para em uma família paramétrica de distribuições , onde, como observado acima, são os parâmetros da família. Procuramos parâmetros que minimizem a divergência de Kullback-Leibler entre nossa distribuição de destino e :p(z|x)q(z|x,λ)λp(z|x)q(z|x,λ)
minλD[p(z|x)||q(z|x,λ)]
Novamente, não podemos minimizar isso diretamente porque a definição de divergência Kullback-Leibler inclui a evidência. Apresentando o ELBO (Evidence Lower BOund) e após algumas manipulações algébricas, finalmente chegamos a:
ELBO(λ)=Eq(z|x,λ)[logp(x|z)]−D[(q(z|x,λ)||p(z)]
Como o ELBO é um limite inferior à evidência (veja o link acima), maximizar o ELBO não é exatamente equivalente a maximizar a probabilidade de dados fornecidos (afinal, VI é uma ferramenta para a inferência bayesiana aproximada ), mas vai na direção certa.λ
Para fazer inferência, precisamos especificar a família paramétrica . Na maioria dos VAEs, escolhemos uma distribuição Gaussiana multivariada e não correlacionadaq(z|x,λ)
q(z|x,λ)=N(z|μ(x),σ2(x)I)
Essa é a mesma escolha que fizemos para , embora possamos ter escolhido uma família paramétrica diferente. Como antes, podemos estimar essas funções não lineares complexas introduzindo um modelo de rede neural. Como este modelo aceita imagens de entrada e retorna parâmetros da distribuição das variáveis latentes, chamamos de rede do codificador . Como antes, podemos estimar essas funções não lineares complexas introduzindo um modelo de rede neural. Como este modelo aceita imagens de entrada e retorna parâmetros da distribuição das variáveis latentes, chamamos de rede do codificador .p(x|z)
A rede do codificador
Também chamada de rede de inferência , é usada apenas no tempo de treinamento.
Como observado acima, o codificador deve aproximar e , portanto, se tivermos, digamos, 24 variáveis latentes, a saída de o codificador é um vetor . O codificador possui pesos (e preconceitos) . Para aprender , podemos finalmente escrever o ELBO em termos dos parâmetros e da rede de codificadores e decodificadores, assim como os pontos de ajuste do treinamento:μ(x)σ(x)d=48θθθϕ
ELBO(θ,ϕ)=∑iEqθ(z|xi,λ)[logpϕ(xi|z)]−D[(qθ(z|xi,λ)||p(z)]
Podemos finalmente concluir. O oposto do ELBO, em função de e , é usado como a função de perda do VAE. Usamos o SGD para minimizar essa perda, ou seja, maximizar o ELBO. Como o ELBO é um limite inferior à evidência, isso vai na direção de maximizar a evidência e, assim, gerar novas imagens que são otimamente semelhantes às do conjunto de treinamento. O primeiro termo no ELBO é a probabilidade logarítmica negativa esperada dos pontos de ajuste do treinamento, portanto, incentiva o decodificador a produzir imagens semelhantes às do treinamento. O segundo termo pode ser interpretado como um regularizador: incentiva o codificador a gerar uma distribuição para as variáveis latentes que é semelhante aθϕp(z)=N(0,I). Mas, introduzindo primeiro o modelo de probabilidade, entendemos de onde vem toda a expressão: a minimização da divergência de Kullabck-Leibler entre o posterior aproximado posterior e o modelo posterior . 2qθ(z|x,λ)p(z|x,λ)
Depois de aprendermos e maximizando o , podemos jogar fora o codificador. A partir de agora, para gerar novas imagens, basta provar e propagá-lo através do decodificador. As saídas do decodificador serão imagens semelhantes às do conjunto de treinamento.θϕELBO(θ,ϕ)z∼N(0,I)
Referências e leituras adicionais
1 Essa suposição não é estritamente necessária, embora simplifique nossa descrição de VAEs. No entanto, dependendo dos aplicativos, você pode assumir uma distribuição diferente para . Por exemplo, se é um vetor de variáveis binárias, um gaussiano não faz sentido e um Bernoulli multivariado pode ser assumido.pϕ(x|z)xp
2 A expressão ELBO, com sua elegância matemática, oculta duas principais fontes de dor para os praticantes da VAE. Um é o termo médio . Isso efetivamente requer o cálculo de uma expectativa, o que requer a coleta de várias amostras deEqθ(z|xi,λ)[logpϕ(xi|z)]qθ(z|xi,λ). Dado o tamanho das redes neurais envolvidas e a baixa taxa de convergência do algoritmo SGD, ter que desenhar várias amostras aleatórias a cada iteração (na verdade, para cada minibatch, o que é ainda pior) consome muito tempo. Os usuários do VAE resolvem esse problema de maneira muito pragmática calculando essa expectativa com uma única amostra aleatória (!). A outra questão é que, para treinar duas redes neurais (codificador e decodificador) com o algoritmo de retropropagação, preciso diferenciar todas as etapas envolvidas na propagação direta do codificador para o decodificador. Como o decodificador não é determinístico (avaliar sua saída requer o desenho de um gaussiano multivariado), nem faz sentido perguntar se é uma arquitetura diferenciável. A solução para isso é o truque de reparametrização .