Inferencia variacional: ¿qué es y qué come?

Hola Habr!

Recientemente hablé con colegas sobre un codificador automático variacional y resultó que incluso aquellos que trabajan en Deep Learning conocen la inferencia variacional (inferencia variacional) y, en particular, el límite variacional inferior solo por rumores y no entienden completamente qué es.
En este artículo quiero analizar estos problemas en detalle. A quién le importa, le pido un corte, será muy interesante.

¿Qué es la inferencia variacional?


La familia de métodos variacionales de aprendizaje automático obtuvo su nombre de la sección de análisis matemático "Cálculo variacional". En esta sección, estudiamos los problemas de búsqueda de extremos de funcionales (un funcional es una función de funciones, es decir, no estamos buscando los valores de variables en las que la función alcanza su máximo (mínimo), sino una función en la que el funcional alcanza un máximo (mínimo).

Pero surge la pregunta: en el aprendizaje automático, siempre buscamos un punto en el espacio de parámetros (variables) en el que la función de pérdida tenga un valor mínimo. Es decir, es tarea del análisis matemático clásico, y aquí está el cálculo de las variaciones. El cálculo de variaciones aparece en el momento en que transformamos la función de pérdida en otra función de pérdida (a menudo, este es el límite de variación inferior) utilizando los métodos de cálculo de variaciones.

¿Por qué necesitamos esto? ¿No es posible optimizar directamente la función de pérdida? Necesitamos estos métodos cuando es imposible obtener directamente una estimación de gradiente imparcial (o esta estimación tiene una dispersión muy alta). Por ejemplo, nuestros conjuntos de modelos p(z) y p(x/z) y necesitamos calcular p(x)= int(p(z)p(x/z)dz) . Esto es exactamente para lo que se diseñó el codificador automático variacional.

¿Qué es el límite inferior variacional?


Imagina que tenemos una función f(x) . El límite inferior de esta función será cualquier función. g(x) satisfaciendo la ecuación:

g(x)<=f(x)


Es decir, para cualquier función hay innumerables límites inferiores. ¿Son todos estos límites inferiores iguales? Por supuesto que no. Introducimos otro concepto: discrepancia (no encontré un término establecido en la literatura en ruso, este valor se llama rigidez en los artículos en inglés):

 delta=maxf(x)maxg(x)


Obviamente, el residuo siempre es positivo. Cuanto más pequeño sea el residual, mejor.

Aquí hay un ejemplo de un límite inferior con cero residual:
imagen
Y aquí hay un ejemplo con un residuo pequeño pero positivo:
imagen
Y finalmente, una discrepancia lo suficientemente grande:
imagen

De los gráficos anteriores, se ve claramente que a cero residual, el máximo de la función y el máximo del límite inferior están en el mismo punto. Es decir, si queremos encontrar el máximo de alguna función, podemos buscar el máximo del límite inferior. Si la discrepancia no es cero, entonces esto no es así. Y el máximo del límite inferior puede estar muy lejos (a lo largo del eje x) del máximo deseado. Los gráficos muestran que cuanto mayor es el residual, más lejos pueden estar los máximos entre sí. Esto generalmente no es cierto, pero en la mayoría de los casos prácticos esta intuición funciona muy bien.

Codificador automático variable


Ahora analizaremos un ejemplo de un límite variacional inferior muy bueno con un residuo potencialmente cero (a continuación quedará claro por qué): este es un Autoencoder Variacional.

Nuestra tarea es construir un modelo generativo y entrenarlo utilizando el método de máxima verosimilitud. El modelo tendrá la siguiente forma:

q(x)= intq(z)q theta(x|z)dz


donde q(x) Es la densidad de probabilidad de las muestras generadas, z - variables latentes, q(z) - la densidad de probabilidad de una variable latente (a menudo simple), por ejemplo, una distribución gaussiana multidimensional con expectativa cero y dispersión unitaria, en general, algo de lo que podemos tomar muestras fácilmente, q theta(x|z) - densidad de muestra condicional para un valor dado de variables latentes, en el autoencoder variacional, se selecciona una gaussiana con expectativa de mat y dispersión dependiendo de z.

¿Por qué podríamos necesitar representar la densidad de datos de una manera tan compleja? La respuesta es simple: los datos tienen una función de densidad muy compleja y simplemente no podemos construir técnicamente un modelo de tal densidad directamente. Esperamos que esta densidad compleja se pueda aproximar bien utilizando dos densidades más simples. q(z) y q theta(x|z) .

Queremos maximizar la siguiente función:

I= intp(x)log(q(x))dx


donde p(x) - densidad de probabilidad de datos. El principal problema es que la densidad q(x) (con modelos suficientemente flexibles) no es posible presentar analíticamente y, por consiguiente, entrenar el modelo.

Usamos la fórmula de Bayes y reescribimos nuestra función de la siguiente manera:

I= intp(x)log( fracq(z)q(x|z)q(z|x))dx


Desafortunadamente q(z/x) todo también es difícil de calcular (es imposible tomar la integral analíticamente). Pero en primer lugar, observamos que la expresión debajo del logaritmo no depende de z, por lo que podemos tomar la expectativa matemática del logaritmo en z de cualquier distribución y esto no cambiará el valor de la función y se multiplicará y dividirá por el logaritmo en la misma distribución (formalmente solo tenemos una condición - esta distribución no debe desaparecer en ningún lado). Como resultado, obtenemos:

I= intp(x)dx int phi(z|x)log( fracq(z)q(x|z) phi(z|x))+ intp(x)dx int phi(z|x)log( frac phi(z|x)q(z|x))


tenga en cuenta que, en primer lugar, el segundo término es divergencia KL (lo que significa que siempre es positivo):

I= intp(x)dx int phi(z|x)log( fracq(z)q(x|z) phi(z|x))+ intp(x)KL[ phi(z|x)||q(z|x))]dx


y en segundo lugar I no depende de q(z|x) no de  phi(z|x) . Se sigue que

I>= intp(x)dx int phi(z|x)log( fracq(z)q(x|z) phi(z|x))=VLB


donde Vlb - El límite de variación inferior (límite inferior de variación) y alcanza su máximo cuando KL[ phi(z|x)||q(z|x))]=0 - es decir, las distribuciones son las mismas.

La positividad y la igualdad a cero si y solo si las distribuciones coinciden, las divergencias KL se prueban con precisión por métodos variacionales, de ahí el nombre de límite variacional.

Quiero señalar que el uso de un límite inferior variacional ofrece varias ventajas. En primer lugar, nos da la oportunidad de optimizar la función de pérdida mediante métodos de gradiente (intente hacer esto cuando la integral no se tome analíticamente) y, en segundo lugar, se aproxima a la distribución inversa q(z|x) distribución  phi(z|x) - es decir, no solo podemos muestrear datos, sino también muestrear variables latentes. Desafortunadamente, el principal inconveniente es cuando el modelo de distribución inversa no es flexible, es decir, cuando la familia  phi(z|x) no contiene q(z|x) - el residual será positivo e igual:

 delta= intp(x) underset phi(z|x)min(KL[ phi(z|x)||q(z|x)])dx


y esto significa que el máximo del límite inferior y las funciones de pérdida muy probablemente no coinciden. Por cierto, el codificador automático variacional utilizado para generar imágenes genera imágenes que son demasiado borrosas, creo que esto es solo por elegir una familia demasiado pobre  phi(z|x) .

Un ejemplo de un límite inferior no muy bueno


Ahora consideraremos un ejemplo donde, por un lado, el límite inferior tiene todas las buenas propiedades (con un modelo suficientemente flexible, el residual será cero), pero a su vez no ofrece ninguna ventaja sobre el uso de la función de pérdida original. Creo que este ejemplo es muy revelador y si no haces un análisis teórico, puedes pasar mucho tiempo tratando de entrenar modelos que no tienen sentido. Por el contrario, los modelos tienen sentido, pero si podemos entrenar a ese modelo, entonces es más fácil elegir q(x) de la misma familia y usar el principio de máxima verosimilitud directamente.

Por lo tanto, consideraremos exactamente el mismo modelo generativo que en el caso de un codificador automático variacional:

q(x)= intq(z)q theta(x|z)dz


estaremos entrenando con el mismo método de máxima verosimilitud:

I= intp(x)log(q(x))dx


Todavía esperamos que q(x|z) Será mucho más "fácil" que q(x) .
Solo ahora escribiremos I un poco diferente

I= intp(x)log( intq(z)q theta(x|z)dz)dx


usando la fórmula de Jensen, obtenemos:

I>= intp(x)q(z)log(q theta(x|z))dxdz=VLB


Es precisamente en este momento que la mayoría de la gente responde sin pensar que este es realmente el resultado final y que usted puede entrenar al modelo. Esto es cierto, pero veamos la discrepancia:

 delta= intp(x)log(q(x))dx intp(x)q(z)log(q theta(x|z))dxdz


donde (aplicando la fórmula de Bayes dos veces):

 delta= intp(x)q(z)log( fracq(x)q(x|z))dxdz= intp(x)q(z)log( fracq(z)q(z|x))dxdz


es fácil ver que:

 delta= intp(x)KL[q(z)||q(z|x)]dx


Veamos qué sucede si aumentamos el límite inferior: el residual disminuirá. Con un modelo bastante flexible:

KL[q(z)||q(z|x)] rightarrow0


todo parece estar bien: el límite inferior tiene un residuo potencialmente cero y con un modelo bastante flexible q(x|z) Todo debería funcionar. Sí, esto es cierto, solo los lectores atentos pueden notar que se alcanza cero residual cuando x y z son variables aleatorias independientes !!! y para un buen resultado, la "complejidad" de la distribución q(x|z) no debe ser menor que q(x) . Es decir, el borde inferior no nos da ninguna ventaja.

Conclusiones


El límite de variación inferior es una excelente herramienta matemática que le permite optimizar aproximadamente las funciones "inconvenientes" para el aprendizaje. Pero como cualquier otra herramienta, necesita comprender muy bien sus ventajas y desventajas y también usarla con mucho cuidado. Consideramos un muy buen ejemplo: un codificador automático variacional, así como un ejemplo de un límite inferior no muy bueno, mientras que los problemas de este límite inferior son difíciles de ver sin un análisis matemático detallado.

Espero que haya sido al menos un poco útil e interesante.

Source: https://habr.com/ru/post/471890/


All Articles