Inferencia variacional y ELBO Loss
Bueno, pues vamos a intentar derivar la función de pérdida de un autoencoder variacional.
En un autoencoder normal, lo que hacemos es usar el error de reconstrucción como función de pérdida. Pero, y ¿luego qué? ¿Cómo lo hacemos variacional? ¿Y qué cojones significa variacional? ¿Qué son todas esas historias del ELBO, el KL Divergence y demás jeroglíficos?
Paso a paso. Vamos a ver:
Del autoencoder convencional al variacional
Aquí tenemos el esquema de un vanilla autoencoder.
Los datos de entrada \(x\) se comprimen por el encoder en un espacio latente \(z\) que luego el decoder toma como input para reconstruir \(\hat{x}\) usando como función de pérdida el error de reconstrucción (algo como el MSE, o el MAE, lo que queramos).
Hasta aquí todo bien, todo correcto. ¿Cuál es el problema? Pues que sabe dios la forma que tomará ese espacio latente \(z\), porque no tenemos ningún tipo de control sobre ella.
Dado que ese espacio latente puede tomar formas incómodas con las que preferiríamos no tener que tratar, lo que vamos a hacer es mapearlo a una distribución gaussiana. Esto es lo que convierte a nuestro autoencoder clásico en uno variacional:
\[P(z|x) \sim N(0,1)\]
Ahora, lo que queremos es que la probabilidad de \(z\) dado \(x\) se parezca lo máximo posible a una distribución gaussiana estándar (la de media 0 y desviación 1, vaya).
Aquí va el contenido oculto que se despliega al hacer clic. Puedes incluir ecuaciones, código, imágenes, etc.
¿Y cómo se hace esto? Pues añadiendo un segundo término a nuestra función de pérdida basada en la reconstrucción que teníamos antes.
Lo que queremos es una nueva función de pérdida que penalice al modelo si no es capaz de que \(z\) se aproxime a una gaussiana. Hay varias maneras de hacerlo (por lo visto), pero la más habitual es la KL divergence.
De manera que nuestra nueva y awesome loss function nos quedaría tal que así:
\[ \begin{aligned} \mathcal{L} &= \mathcal{L}_{\mathrm{reconstruction}} + D_{\mathrm{KL}} \end{aligned} \]
KL Divergence
Una divergencia es una manera de medir la distancia entre distribuciones. Es decir, estas dos distribuciones ¿cuánto se parecen? ¿Mucho?¿Poco? ¿Están cerca? ¿Están lejos? Evidentemente si están cerca es que se parecen mucho, y si no, es que se parecen poco.
Matemáticamente, medimos la distancia entre dos distribuciones \(P\) y \(Q\) como:
\[ D_{KL}(P \| Q) = \sum_{x \in \mathrm{X}} p(x) \log \frac{p(x)}{q(x)} \quad \text{o} \quad \int p(x) \log \frac{p(x)}{q(x)} \, dx \]
La primera en su forma discreta y la segunda en su forma continua, pero son equivalentes. Algunas veces lo podremos ver expresado en función de la esperanza también. Pero vamos que es lo mismo.
\[ D_{KL}(P \| Q) = \mathbb{E}_{p} \left[ \log \frac{p(x)}{q(x)} \right] \]
También podemos reorganizar los términos de la expresión discreta para obtener:
\[ D_{KL}(P \| Q) = \underbrace{\sum_{x \in \mathrm{X}} p(x) \log p(x)}_{-H(P) \, \text{Negative Entropy}} - \underbrace{\sum_{x \in \mathrm{X}} p(x) \log q(x)}_{CE(P,Q) \, \text{Negative Cross Entropy}} \]
Esta reorganización tampoco es que nos diga mucho ahora mismo, pero podríamos reescribir la divergencia:
\[ D_{KL} = CE(P,Q) - H(P) \Leftrightarrow CE(P,Q) = D_{KL} + H(P) \]
Esta identidad tiene su origen en la teoría de la información de Shannon, pero ni es el tema de hoy, ni nos ayuda a derivar y entender la inferencia variacional ni nada, por lo que lo dejamos en el cajón para otro día. De momento, solo nos tenemos que quedar con esto:
\[ D_{KL}(P \| Q) = \sum_{x \in \mathrm{X}} p(x) \log \frac{p(x)}{q(x)} \]
Otra cosa que también vamos a necesitar es el comprender por qué \(D_{KL} \geq 0\), también llamada Desigualdad de Gibbs.
La desigualdad de Gibbs establece que la divergencia KL es siempre no negativa:
\[ D_{KL}(P \| Q) \geq 0 \]
Menos cuando \(P = Q\), que será cuando las dos distribuciones sean idénticas, y por tanto, la distancia entre ellas sea 0. Este resultado es fundamental en teoría de la información y lleva el nombre del físico Josiah Willard Gibbs. Para demostrarla, utilizamos la desigualdad de Jensen.
Recordatorio: Desigualdad de Jensen
La desigualdad de Jensen relaciona el valor esperado de una función con la función del valor esperado:
- Función cóncava \(\rightarrow\) \(\mathbb{E}[f(X)] \leq f(\mathbb{E}[X])\): Para una función cóncava, el valor esperado de su función siempre será menor que la función de su valor esperado (ej: \(\log\)).
- Función convexa \(\rightarrow\) \(\mathbb{E}[f(X)] \geq f(\mathbb{E}[X])\): Para una función convexa, el valor esperado de la función siempre será mayor que la función de su valor esperado (ej: \(x^2\)).
En los gráficos tenemos dos valores de ejemplo: \(x_1\) y \(x_2\) (puntos rojos sobre la curva).
Línea roja discontinua: conecta los dos puntos rojos. Representa qué pasaría si interpoláramos linealmente entre \(f(x_1)\) y \(f(x_2)\).
Punto naranja \(\mathbb{E}[f(X)]\): es el promedio de \(f(x_1)\) y \(f(x_2)\). Como promediar es una operación lineal, este punto cae sobre la línea roja.
Punto verde \(f(\mathbb{E}[X])\): primero calculamos el promedio de \(x_1\) y \(x_2\), y luego evaluamos \(f\) en ese punto. Por eso cae directamente sobre la curva.
Para funciones cóncavas, la curva queda por encima de la línea roja que conecta los puntos, así que el punto verde siempre estará más arriba que el naranja (\(f(\mathbb{E}[X]) \geq \mathbb{E}[f(X)]\)). Para funciones convexas, la curva queda por debajo, así que el punto naranja siempre estará más arriba que el verde (\(\mathbb{E}[f(X)] \geq f(\mathbb{E}[X])\)).
Demostración de Gibbs usando Jensen
Una vez hemos entendido esto, volvemos a nuestra definición de la KL Divergence:
\[ D_{KL}(P \| Q) = \sum_x p(x) \log \frac{p(x)}{q(x)} \]
La cual podemos reescribir dando la vuelta a los términos:
\[ D_{KL}(P \| Q) = -\sum_x p(x) \log \frac{q(x)}{p(x)} \]
Como \(\mathbb{E}[X] = \sum_{x} x \cdot p(x)\), podemos reescribir la expresión en términos de esperanza:
\[ D_{KL}(P \| Q) = -\mathbb{E}_p\left[\log \frac{q(x)}{p(x)}\right] \]
Y como la función del logaritmo es cóncava, podemos aplicar Jensen y decir que el valor esperado de nuestra función será menor que la función del valor esperado:
\[ \mathbb{E}_p\left[\log \frac{q(x)}{p(x)}\right] \leq \log \left( \mathbb{E}_p\left[\frac{q(x)}{p(x)}\right] \right) \]
Evaluamos la esperanza del lado derecho:
\[ \mathbb{E}_p\left[\frac{q(x)}{p(x)}\right] = \sum_x \cancel{p(x)} \frac{q(x)}{\cancel{p(x)}} = \sum_x q(x) \]
Y como el sumatorio de una distribución es 1, nos queda:
\[ \mathbb{E}_p\left[\frac{q(x)}{p(x)}\right] = \sum_x q(x) = 1 \]
Volvemos a la desigualdad de Jensen con este resultado:
\[ \mathbb{E}_p\left[\log \frac{q(x)}{p(x)}\right] \leq \log(1) = 0 \]
Ahora lo sustituimos en la expresión que teníamos antes, la del KL Divergence: \[ D_{KL}(P \| Q) = -\mathbb{E}_p\left[\log \frac{q(x)}{p(x)}\right] \geq 0 \]
Que es lo mismo que:
\[ D_{KL}(P \| Q) = \mathbb{E}_p\left[\log \frac{p(x)}{q(x)}\right] \geq 0 \]
Lo cual podemos reescribir de la misma manera que teníamos al principio:
\[ D_{KL}(P \| Q) = \sum_x p(x) \log \frac{p(x)}{q(x)} \geq 0 \]
¡Tachán! Aquí es donde queríamos llegar. Ya sabemos que la KL divergence siempre tiene que ser mayor que 0: \[ D_{KL}(P \| Q) \geq 0 \]
Esto completa la demostración de la desigualdad de Gibbs utilizando la desigualdad de Jensen.
Variational Inference
Ya hemos aprendido unas cuantas cosas. Ahora nos toca hablar sobre la inferencia variacional.
Un autoencoder variacional no es más que una forma de hacer inferencia variacional, la cual se basa en la regla de Bayes:
Conviene repasar brevemente de dónde sale el chisme este.
Probabilidad conjunta y condicional
Vamos a suponer que tenemos unos datos que observamos \(x\) y unas variables latentes \(z\) no observamos directamente. La probabilidad de que ocurran ambos a la vez es la probabilidad conjunta \(p(x,z)\).
Esta probabilidad conjunta siempre se puede factorizar usando la definición de probabilidad condicional1:
\[p(x,z) = p(z|x) \cdot p(x)\]
Que también podemos escribir así:
\[p(x,z) = p(x|z) \cdot p(z)\]
Igualando ambas expresiones y despejando \(p(z|x)\) ¡¡nos sale Bayes!!:
\[p(z|x) \cdot p(x) = p(x|z) \cdot p(z) \] \[p(z|x) = \frac{p(x|z) \cdot p(z)}{p(x)} \]
Así es como obtenemos los términos:
- Posterior \(p(z|x)\): distribución de \(z\) después de haber observado \(x\). Esto es lo que queremos calcular, y muchas veces lo veremos referido como la “actualización de nuestras creencias previas (prior) tras haber observado los datos (likelihood)”.
- Prior \(p(z)\): Lo que creíamos sobre \(z\) antes de observar los datos \(x\). Esto quizás es lo más tricky. Una manera fácil de tener cierta intuición sobre esto es que si tuviésemos un dado de 6 caras y \(z\) representa nuestra hipótesis de si está cargado o no (\(z \in \{\text{justo}, \text{cargado}\}\)); si nunca lo he lanzado pero confío en que es justo, mi prior sería algo como \(p(z=\text{justo})=0.9\) y \(p(z=\text{cargado})=0.1\).
- Likelihood \(p(x|z)\): probabilidad2 de observar los datos \(x\) dado \(z\). Responde a la pregunta: si este valor de \(z\) fuese correcto, ¿cómo de probable sería ver estos datos \(x\)?. En el ejemplo del dado: si mi hipótesis es que el dado es justo (\(z=\text{justo}\)), la probabilidad de sacar un 3 es \(p(x=3|z=\text{justo})=1/6\). Si mi hipótesis es que está cargado para sacar 6, entonces \(p(x=3|z=\text{cargado})\) sería mucho menor.
- Evidence o Marginal \(p(x)\): Probabilidad total de observar \(x\), considerando todos los posibles valores de \(z\). Se obtiene marginalizando la conjunta.
El problema con la marginal
La evidence \(p(x)\) también se conoce como el marginal porque se obtiene marginalizando3 la conjunta sobre \(z\).
Si partimos de la probabilidad conjunta \(p(x,z)\), marginalizar consiste en integrar sobre \(z\) para quedarnos solo con la probabilidad de \(x\) (también podría ser al revés, claro está):
\[p(x,z) \rightarrow p(x) = \int{p(x|z)p(z)dz}\]
El problema es que esa integral es intratable4, porque requeriría integrar sobre todas las configuraciones posibles de \(z\), las cuales desconocemos. Esto es por lo que no podemos calcular \(p(x)\) directamente en la mayoría de casos. Porque:
- El espacio latente \(z\) puede ser de alta dimensión.
- No tiene solución analítica cerrada.
- Crece exponencialmente con la complejidad del modelo
O sea, lo que hace Bayes básicamente es obtener la posterior. ¿No es eso lo que hace nuestro encoder? Tenemos unos datos \(x\) y queremos encontrar una representación latente \(z\) que los explique. Es decir, queremos \(p(z|x)\)
Sabiendo esto, podemos actualizar nuestro esquema del autoencoder en términos de Bayes y decir que:
- El encoder aproxima la posterior: calcula \(q_{\phi}(z|x)\), la distribución sobre los latentes \(z\) mediante los parámetros del modelo \({\phi}\) dados los datos observados \(x\).
- El decoder modela el likelihood: calcula \(p_{\theta}(x|z)\), la distribución sobre los datos reconstruidos \(\hat{x}\) mediante los parámetros del modelo \({\theta}\) dado el latente \(z\).
Esto es interesante. Pensemos en un conjunto de datos observados de entrenamiento \(x\). Puede que no conozcamos su distribución \(p(x)\) pero, ¿podemos aprender una distribución condicional \(p(z|x)\) con la cual podamos mapear los datos \(x\) a una distribución conocida (¿p. ej. gaussiana? Aunque realmente lo podríamos mapear a cualquier distribución) ?
Lo que nos gustaría sería que nuestro encoder calculase la posterior real \(p(z|x)\). Pero ya hemos visto que para poder hacerlo necesitamos la evidence \(p(x)\), que no podemos obtener porque es intratable. ¿So what?
Pues si no podemos calcular la posterior exacta \(p(z|x)\), la aproximamos. Usamos la distribución \(q_{\phi}(z|x)\) que calcula nuestro encoder para que se parezca lo máximo posible a la posterior real \(p(z|x)\) que no podemos calcular. Y de eso va la inferencia variacional:
Distintos modelos generativos usan trucos distintos para esquivar el problema de la intractabilidad. No podemos estimar \(p(x)\) directamente, pero ¿podemos hacerlo de una forma ligeramente distinta? Y la forma en la que el autoencoder variacional lo hace es usando algo conocido como la Evidence Lower Bound o ELBO.
Evidence Lower Bound
Pff está siendo denso, eh 😅.
Venga, recap. Ahora tenemos dos cosas:
- \(q_{\phi}(z|x)\) la distribución que aprende nuestro encoder.
- \(p(z|x)\): nuestra distribución objetivo en la cual estamos interesados, la posterior real.
Nuestro objetivo es minimizar la distancia entre estas dos distribuciones. ¿Y cómo medimos esto? Pues con la Divergencia KL:
\[D_{KL}(q_{\phi}(z|x)||p(z|x)) = \sum_{z \in \mathrm{Z}} q_{\phi}(z|x) \log\left(\frac{q_{\phi}(z|x)}{p(z|x)}\right)\]
Es decir, nuestro objetivo va a ser minimizar esta expresión.
Vamos a operar un poco. La posterior la podemos sustituir en función de la conjunta. Como \(p(x,z) = p(z|x) \cdot p(x) \rightarrow p(z|x) = \frac{p(x,z)}{p(x)}\):
\[\sum_{z \in \mathrm{Z}} q_{\phi}(z|x) \log\left(\frac{q_{\phi}(z|x)p(x)}{p(z,x)}\right)\]
Como \(\log(a \cdot b) = \log(a) + \log(b)\), expandimos:
\[\sum_{z \in \mathrm{Z}} q_{\phi}(z|x) \log\left(\frac{q_{\phi}(z|x)}{p(z,x)}\right)+ \sum_{z \in \mathrm{Z}} q_{\phi}(z|x) \log(p(x))\]
Ahora podemos hacer dos cosas:
- El sumatorio del segundo término es sobre \(z\), por lo que podemos factorizar \(\log(p(x))\).
- \(q_{\phi}(z|x)\) es una distribución de probabilidad sobre \(z\), por lo que \(\sum_{z \in Z} q_{\phi}(z|x) = 1\) por la condición de normalización5.
Lo que nos dejaría con la expresión:
\[\sum_{z \in \mathrm{Z}} q_{\phi}(z|x) \log\left(\frac{q_{\phi}(z|x)}{p(x,z)}\right) + \log(p(x))\]
Por la Desigualdad de Gibbs, sabemos que toda esta expresión tiene que ser \(\geq 0\)
\[\sum_{z \in \mathrm{Z}} q_{\phi}(z|x) \log\left(\frac{q_{\phi}(z|x)}{p(x,z)}\right) + \log(p(x)) \geq 0\]
O lo que es lo mismo:
\[ - \sum_{z \in \mathrm{Z}} q_{\phi}(z|x) \log\left(\frac{q_{\phi}(z|x)}{p(x,z)}\right) \leq \log(p(x))\]
De nuevo, por la probabilidad conjunta \(p(x,z) = p(x|z)p(z)\):
\[ - \sum_{z \in \mathrm{Z}} q_{\phi}(z|x) \log\left(\frac{q_{\phi}(z|x)}{p(x|z)p(z)}\right) \leq \log(p(x))\]
Y le damos la vuelta al logaritmo para eliminar el negativo:
\[ \underbrace{\sum_{z \in \mathrm{Z}} q_{\phi}(z\mid x)\, \log\left(\frac{p(x\mid z)\,p(z)}{q_{\phi}(z\mid x)}\right)}_{\text{ELBO}} \;\le\; \log p(x) \]
Este primer término es al que se conoce como Evidence Lower Bound o ELBO.
Hemos llegado a una expresión en la cual todo es computable o entrenable por una red neuronal. El término de la derecha sigue siendo intratable, pero hemos encontrado un límite inferior. Hemos encontrado una función, una fórmula, que ¡siempre será menor o igual al logaritmo de lo que queremos calcular!
Por tanto, siempre que maximicemos el ELBO, estaremos maximizando también \(p(x)\) de manera efectiva.
Como no podemos obtener \(p(x)\) directamente, hemos dado con una expresión que da una cota inferior a \(\log p(x)\).
Mientras maximicemos esa cota (la ELBO), estaremos empujando hacia arriba \(\log p(x)\) y, en la práctica, resolviendo el problema sin tener que calcular \(p(x)\) explícitamente.
Reescribiendo ELBO
Ahora nuestro autoencoder se convierte en un problema de maximización del ELBO a partir de los parámetros del encoder \(\phi\) y los del decoder \(\theta\). Reescribamos la expresión del ELBO de una forma que tenga más sentido para nuestra red neuronal:
\[\sum_{z \in \mathrm{Z}} q_{\phi}(z|x) \log\left(\frac{p_{\theta}(x|z)\,p(z)}{q_{\phi}(z|x)}\right) \;\le\; \log p(x) \]
La cual podemos expandir usando la regla del producto del logaritmo:
\[\sum_{z \in \mathrm{Z}} q_{\phi}(z|x) \log\left(\frac{p(z)}{q_{\phi}(z|x)}\right) + \sum_{z \in \mathrm{Z}} q_{\phi}(z|x) \log(p_{\theta}(x|z)) \;\le\; \log p(x) \]
En este punto tenemos dos cosas:
El primer término tiene la forma de una \(D_{KL}\)6, pero con la fracción invertida: en lugar de tener en el numerador la distribución que tenemos fuera del logaritmo en la expresión original sobre la cual hacemos el sumatorio, la tenemos en el denominador, por lo que tenemos que darle la vuelta y decir que tenemos \(- D_{KL} = - \sum_{z} q_{\phi}(z|x) \log\left(\frac{q_{\phi}(z|x)}{p(z)}\right)\)
El segundo término lo que tenemos es el sumatorio de una distribución multiplicado por un valor. Eso es la esperanza: \(\mathbb{E}[X] = \sum_x x_i P(x_i)\). Haciendo la correspondencia \(P(x) \leftrightarrow q_{\phi}(z|x)\) y \(X(x) \leftrightarrow \log(p_{\theta}(x|z))\), podemos reescribirlo en función de la esperanza: \(\mathbb{E}_{q_{\phi}}[\log(p_{\theta}(x|z))]\)
Con lo que nos quedaría:
\[-D_{KL}(q_{\phi}(z|x) || p(z)) + \underbrace{\mathbb{E}_{q_{\phi}}[\log(p_{\theta}(x|z))]}_{\text{Log-likelihood}} \leq \log(p(x))\]
Este segundo término se empieza a parecer (es) el Log-likelihood loss. Básicamente, el error de reconstrucción.
En la práctica, el término de reconstrucción no se calcula directamente como log-likelihood, sino como MSE. Veremos en la siguiente sección por qué son equivalentes bajo ciertas asunciones.
Con esto, llegamos a la forma final de nuestra función de pérdida:
\[-D_{KL} + \text{Reconstruction loss} \leq \log(p(x)) \tag{1}\]
Caso gaussiano
Podríamos haber terminado aquí, pero queremos encontrar la forma final de la fórmula. Lo que vamos a hacer ahora es computar el \(D_{KL}\) específicamente para el caso gaussiano (si quisiésemos hacer esto para un caso que no fuese el gaussiano tendríamos que rehacer este cálculo).
Partiendo de la ecuación:
\[D_{KL}(q_{\phi}(z|x) || p(z)) = \sum_{z} q_{\phi}(z|x) \log\left(\frac{q_{\phi}(z|x)}{p(z)}\right)\]
Y sustituyendo las distribuciones \(q_{\phi}(z|x)\) y \(p(z)\) por sus respectivas fórmulas analíticas gaussianas, llegamos a la siguiente expresión:
\[D_{KL} = \frac{1}{2}\left(\sigma_q^2 + \mu_q^2 - 1 - \log(\sigma_q^2)\right)\]
Sustituimos en Ecuación 1:
\[ - \frac{1}{2}\left(\sigma_q^2 + \mu_q^2 - 1 - \log(\sigma_q^2)\right) + \mathbb{E}_{q_{\phi}}[\log(p_{\theta}(x|z))] \leq \log(p(x))\]
Esta es casi nuestra función de pérdida final. Esto es el ELBO para el caso específico gaussiano. Y nuestro objetivo es maximizarlo. Nuestro objetivo es, más concretamente, maximizarlo respecto a los parámetros \(\phi\) y \(\theta\) de nuestra red neuronal.
\[\max_{\phi,\theta} - \frac{1}{2}\left(\sigma_q^2 + \mu_q^2 - 1 - \log(\sigma_q^2)\right) + \mathbb{E}_{q_{\phi}}[\log(p_{\theta}(x|z))]\]
Pero, como todos sabemos, el descenso del gradiente no maximiza: minimiza. Por lo que, lo que haremos será minimizar el negativo de esta función:
\[ \min_{\phi,\theta} -\left[ - \frac{1}{2}\left(\sigma_q^2 + \mu_q^2 - 1 - \log(\sigma_q^2)\right) + \mathbb{E}_{q_{\phi}}[\log(p_{\theta}(x|z))] \right]\]
Reformulando:
\[ \min_{\phi,\theta} \frac{1}{2}\left(\sigma_q^2 + \mu_q^2 - 1 - \log(\sigma_q^2)\right) - \mathbb{E}_{q_{\phi}}[\log(p_{\theta}(x|z))]\]
Esta es la función de pérdida que vamos a implementar.
Referencias
Una pregunta rápida a ChatGPT sobre recursos para aprender inferencia variacional nos dará este tipo de cosas:
- Kevin Murphy - “Probabilistic Machine Learning”, Volúmenes 1 y 2. El primero sobre probabilidad, Bayes y modelos gráficos, y el segundo sí que trata más en profundidad el VI.
- David Blei, Alp Kucukelbir, Jon McAuliffe (2017) - “Variational Inference: A Review for Statisticians”
- Kingma & Welling (2013) - Auto-Encoding Variational Bayes.
- El mítico “Pattern Recognition and Machine Learning” de Bishop.
- McElreath - Statistical Rethinking.
Tan útiles e interesantes como infumables.
Yo he seguido este video, que es bastante más claro:
- Mathing the Variational AutoEncoder: Deriving the ELBO Loss. Aunque en el desarrollo se le va un poco de las manos, sigue siendo el recurso más claro que he encontrado.
Notas
Probabilidad de que ocurra algo dado que otra cosa ya haya ocurrido↩︎
en puridad matemática, el likelihood es una función de \(z\), no una distribución de probabilidad (no tiene por qué sumar 1 sobre \(z\)). Pero para este contexto didáctico-educativo es válido llamarlo probabilidad↩︎
Marginalizar = integrar (o sumar, en discreto) sobre todas las posibilidades de una variable para eliminarla↩︎
No tiene solución analítica o es computacionalmente inviable de calcular↩︎
Una distribución de probabilidad válida debe sumar 1 sobre todos sus posibles valores, \(\sum_x p(x) = 1\)↩︎
Recordemos que \(D_{KL}=\sum_{z} q_{\phi}(z|x) \log\left(\frac{q_{\phi}(z|x)}{p(z)}\right)\)↩︎