Autocodificadores
Rubén Rodríguez Abril
Los autocodificadores permiten lidiar con grandes cantidades de información consiguiendo así comprimirla y filtrarla. Por ello han resultado muy útiles aplicados a modelos de Deep Learning y al tratamiento de imágenes.
Autocodificadores
Dentro del ámbito del aprendizaje profundo, los autocodificadores (autoencoders), también llamados modelos de codificador-descodificador, son redes neuronales simétricas cuyo cometido es codificar la información de entrada en un vector de k dimensiones para después volver a descodificarla en un vector de salida de las mismas dimensiones que el original
El objetivo de la codificación inicial es reducir las dimensiones de la estructura de datos inicial (su «tamaño») buscando facilitar su almacenamiento(en este caso, la codificación serviría de mecanismo de compresión), eliminar ruido, entre otras muchas aplicaciones.
La parte de la red que reduce las dimensiones del vector de entrada se denomina codificador mientras que la que invierte este proceso se denomina descodificador. Los vectores que contienen la información comprimida se almacenan en el denominado espacio latente.
Autocodificadores y capas de convolución
Los autocodificadores ordinarios se utilizan en múltiples aplicaciones como la eliminación de ruido o el almacenamiento y compresión de información. En este apartado analizaremos brevemente los autocodificadores dotados de capas de convolución, que suelen ser usados para el procesamiento de imágenes.
Un prototipo básico de los autocodificadores con convolución puede, a nuestro juicio, construirse del modo siguiente:
En la imagen los bloques azules representan capas convolucionales, y los números a la derecha, el número de mapas de características. En gris se muestran las capas de modificación de resolución: de disminución (downsampling, pooling) en el codificador, y de incremento (upsampling) en el decodificador.
– Codificador: se estructuraría sobre una arquitectura de tipo AlexNet: la imagen de entrada tendría una resolución de 227 por 227, y sobre ella se aplicarían cinco capas de convolución alternadas con otras de agrupación (max-pooling), tras las cuales se obtendrían 256 mapas de características de dimensiones 6×6, con 9.216 neuronas en total.
– Espacio latente: esas 9.216 neuronas se conectarían densamente a una capa de 2.304 dimensiones (neuronas), que constituirían el espacio latente del autocodificador. Se produciría, por lo tanto, una reducción de dimensionalidad de 4 a 1. Dichas 2.304 neuronas volverían a conectarse densamente con las neuronas de los 256 mapas de características de la primera capa del decodificador (que también contaría, en total con 9.216 neuronas).
– Descodificador: presentaría una estructura exactamente inversa a la de AlexNet, y se encargaría de transformar 256 mapas de características de 6×6 dimensiones en una imagen de salida de 227 por 227 pixeles a través de cinco capas sucesivas de convolución (con neuronas ReLU) alternadas con otras de ampliación de resolución.
Autocodificadores y arquitecturas en U
Como el propio lector puede comprobar, hay dos grandes diferencias con las arquitecturas en U. En primer lugar, en los autocodificadores no existen atajos (conexiones intermedias) entre las capas de convolución del codificador y las del mismo nivel en el descodificador. En segundo lugar, en un autocodificador, las neuronas intermedias entre codificador y descodificador forman un espacio latente, que está conectado a través de conexiones densas a las capas adyacentes de ambas redes. No ocurre lo mismo en las arquitecturas en U, cuyas secciones ascendentes y descendentes están conectadas entre sí a través de capas de convolución.
El Codificador de Contexto
El Codificador de Contexto (Context Encoder) diseñado por el trabajo de Deepak Pathak et al. es un excelente ejemplo de codificador-descodificador, aunque modifica ligeramente el esquema de los párrafos anteriores. Su objetivo es el de generar una parcela faltante de una imagen a partir de la información de sus alrededores, y por lo tanto, no puede tolerar una disminución de dimensiones en el espacio latente, dado que esto supondría una severa pérdida de información y dificultaría extraordinariamente la reconstrucción de la imagen de que se trata.
Por este motivo, los autores del trabajo decidieron prescindir del espacio latente, y en su lugar, procedieron a conectar cada uno de los 256 mapas de características de la capa final del codificador con uno de los 256 mapas de la capa inicial del descodificador mediante conexiones densas, y estableciendo una correspondencia uno a uno entre los mapas, de tal manera que el primero de los mapas del codificador se conecta con el primero del descodificador, y así sucesivamente.
Cálculo de la función de pérdida
Por lo general, en un autocodificador la función de pérdida se computa mediante un simple término L, calculado para todo el lote:
Donde x_{i} es un pixel de la imagen de entrada, d_{i}(z) es el pixel correspondiente de la imagen de salida y z es un vector en el espacio latente. Al final de cada lote, el gradiente de esta función de pérdida se retropropagará a lo largo de las capas de la red, y se utilizará para el cómputo de la actualización de los pesos sinápticas.
Autocodificadores variacionales
El espacio latente
La estructura del descodificador es muy parecida a la del generador de una GAN. La única diferencia es que este último se alimenta de una fuente de ruido, mientras que el descodificador de un VAE lo hace de un conjunto de neuronas denominado espacio latente. Este último puede ser concebido como un espacio n-dimensional (una dimensión por cada neurona) cuyos parámetros equivalen a los valores de activación de cada una de las neuronas.
Por ejemplo, un espacio latente de tres neuronas ReLU puede ser visualizado como una variedad tridimensional, en la que las dimensiones n_{1}, n_{2}, n_{3}, equivalen a los valores de activación de la función rectificadora. La configuración del espacio latente es determinada a cada momento por la red codificadora.
Espacio latente tridimensional, de tres neuronas (n=3). Los vectores azul y fucsia representan dos configuraciones diferentes del espacio latente. Dado que están muy próximos geométricamente la red descodificadora debería producir resultados parecidos. Si no lo hiciera, y en su lugar se produjeran resultados dispares, el espacio latente estaría mal regularizado.
Principios variacionales
El espacio latente debe ser lo más regular posible, y a dos puntos muy próximos les deben corresponder imágenes de salida parecidas. Para que el funcionamiento de la red sea lo más regular posible, y evitar con ello fenómenos de sobreajuste y de falta de generalización, recientes trabajos han introducido métodos variacionales en el entrenamiento de los autocodificadores.
En el nuevo paradigma variacional, la red codificadora no determina con precisión la configuración del espacio latente. Se limita a producir dos números por cada dimensión, que constituyen la media y la desviación típica de una distribución gaussiana. El sistema (por lo general, la GPU) elige valores aleatorios dentro de esta distribución, y dichos números se transforman en los valores de activación de las neuronas del espacio latente. Por ejemplo, si el espacio latente consta de tres dimensiones, deberán crearse tres distribuciones gaussianas diferentes, dotadas de su propia media y desviación típica. Y de cada una de ellas se extraerán los números aleatorios respectivos.
A partir de la entrada, el codificador produce dos números por cada dimensión: la media (μ_{x}) y la desviación típica (σ_{x}) de una distribución gaussiana (N(μ_{x}, σ_{x})). En este ejemplo de espacio latente tridimensional, el sistema toma un número aleatorio de cada una de esas tres distribuciones, que constituyen los valores de activación de dichas neuronas (componentes del vector z). A partir de este vector z, el descodificador produce la salida.
Entropía relativa
La función de pérdida es ligeramente modificada, puesto que se le añade un segundo término, la entropía relativa, también denominada Divergencia de Kullback-Leibler:
donde KL(N(μ_{x}, σ_{x}), N(0, 1)) es la entropía relativa entre una distribución gaussiana N(0,1) -centrada en cero y con desviación típica de uno- y otra distribución N(μ_{x},σ_{x}) con media μ_{x} y desviación típica σ_{x}.
La entropía relativa puede ser definida como la cantidad de bits necesarios para describir una curva tomando como referencia otra. Geométricamente, mide las diferencias en el trazado de las dos curvas: cuanta mayor sea la entropía relativa, mayor será la diferencia entre las dos funciones/distribuciones. Si la entropía relativa es nula, las dos funciones/distribuciones serán iguales.
Cálculo de la Divergencia de Kullback-Leibler o entropía relativa entre las dos curvas P y N. Si las dos curvas se solapasen, el valor de esta divergencia sería nulo. La suma del parámetro KL en la función de pérdida
Dado que la función de pérdida se calcula a lo largo de todo el lote, la introducción del segundo término tiene como efecto el contribuir a que la suma total de todas las distribuciones sea lo más próximo posible a una distribución gaussiana estándar N(0,1).
El truco de reparametrización
El esquema que acabamos de reseñar tiene un grave defecto: los valores de activación del espacio latente son determinados exclusivamente por una función puramente estocástica (aleatoria) que no es derivable, lo cual no permite la retropropagación del gradiente, y por lo tanto, el entrenamiento de la red.
La función ζ
Para soslayar este inconveniente, los especialistas han introducido el llamado truco de reparametrización, que consiste en calcular el vector z del espacio latente por medio de una función parcialmente aleatoria. La ecuación de dicha función sería la siguiente:
Donde ζ es una función que obtiene un vector de números aleatorios a partir de una distribución gaussiana centrada en 0 y con una desviación típica de 1, μ_{x} es la media y σ_{x} la varianza calculadas por la red neuronal del codificador. Esta vez, la variable z sí es derivable respecto a σ_{x} y μ_{x}. Y gracias a ello, el gradiente puede retropropagarse hacia las capas del codificador.
En el paradigma variacional originario visto antes el vector es generado a partir de unos valores aleatorios tomados de la distribución gaussiana. Con estos valores no es posible construir una función continua, cuya derivada pueda usarse para calcular la función de pérdida. La ausencia de derivada impide pues la retropropagación del gradiente hacia las capas del codificador. Usando el truco de reparametrización que se muestra en la imagen, el vector z es una combinación lineal de tres valores: la media μ_{x}, la desviación típica σ_{x} y la función estocástica (aleatoria) ζ, que extrae un vector v de la distribución gaussiana estándar N(0,1).
Autocodificadores y GauGAN
El esquema de los autocodificadores variacionales es a menudo combinado con la arquitectura GAN. Por ejemplo, en el caso de la célebre aplicación GauGAN, el generador tiene una estructura codificador-descodificador. El usuario introduce una imagen, relativa al estilo que desea utilizar, en la entrada del codificador, cuya red produce como salida 256 distribuciones gaussianas (cada una de ellas con su media y desviación estándar) diferentes. A partir de ellas se generan a su vez 16.384 números aleatorios, que constituyen la entrada del descodificador. La información entonces, atraviesa sucesivamente capas de convolución, y ampliación de resolución hasta llegar a la salida. A lo largo del trayecto, durante las fases de normalización de la convolución, la información semántica creada por el usuario es inyectada a través del sistema SPADE, en el modo señalado en el artículo anterior de esta serie.
A fecha de Julio de 2021, el esquema del autocodificador variacional (variational autoencoder, VAE) es uno de los más utilizados dentro del procesamiento de imágenes, y es, quizá, uno de los ejemplos más refinados del estado de la técnica.
Lecturas recomendadas
– Pathak, D. et al. (2016) Context Encoders: Feature Learning by Inpainting.
– Kingma, D. P. y Welling, M. (2013) An Introduction to Variational Autoencoders.
– Kingma, D. P. y Welling, M. (2013) Auto-Encoding Variational Bayes.