IA 101
¿Qué es un Autoencoder?

Si ha leído sobre técnicas de aprendizaje no supervisado antes, es posible que haya encontrado el término “autoencoder”. Los autoencoders son una de las principales formas en que se desarrollan los modelos de aprendizaje no supervisado. Sin embargo, ¿qué es exactamente un autoencoder?
En resumen, los autoencoders operan tomando los datos, comprimiéndolos y codificándolos, y luego reconstruyendo los datos a partir de la representación codificada. El modelo se entrena hasta que la pérdida se minimiza y los datos se reproducen lo más cercanamente posible. A través de este proceso, un autoencoder puede aprender las características importantes de los datos. Si bien esa es una definición rápida de un autoencoder, sería beneficioso tomar un vistazo más cercano a los autoencoders y obtener una mejor comprensión de cómo funcionan. Este artículo intentará desmitificar los autoencoders, explicando la arquitectura de los autoencoders y sus aplicaciones.
¿Qué es un Autoencoder?
Autoencoders son redes neuronales. Las redes neuronales están compuestas por múltiples capas, y el aspecto definitorio de un autoencoder es que las capas de entrada contienen exactamente la misma cantidad de información que la capa de salida. La razón por la que la capa de entrada y la capa de salida tienen el mismo número de unidades es que un autoencoder pretende replicar los datos de entrada. Produce una copia de los datos después de analizarlos y reconstruirlos de manera no supervisada.
Los datos que fluyen a través de un autoencoder no se mapean directamente desde la entrada hasta la salida, lo que significa que la red no simplemente copia los datos de entrada. Hay tres componentes en un autoencoder: una parte de codificación (entrada) que comprime los datos, un componente que maneja los datos comprimidos (o cuello de botella), y una parte de decodificador (salida). Cuando los datos se alimentan a un autoencoder, se codifican y luego se comprimen a un tamaño más pequeño. La red se entrena en los datos codificados/comprimidos y produce una recreación de esos datos.
¿Por qué querrías entrenar una red para simplemente reconstruir los datos que se le dan? La razón es que la red aprende la “esencia” o las características más importantes de los datos de entrada. Después de haber entrenado la red, se puede crear un modelo que pueda sintetizar datos similares, con la adición o sustracción de ciertas características objetivo. Por ejemplo, podrías entrenar un autoencoder en imágenes granuladas y luego usar el modelo entrenado para eliminar el grano/ruido de la imagen.
Arquitectura de Autoencoder
Veamos la arquitectura de un autoencoder. Discutiremos la arquitectura principal de un autoencoder aquí. Hay variaciones sobre esta arquitectura general que discutiremos en la sección a continuación.

Foto: Michela Massi via Wikimedia Commons, (https://commons.wikimedia.org/wiki/File:Autoencoder_schema.png)
Como se mencionó anteriormente, un autoencoder se puede dividir esencialmente en tres componentes diferentes: el codificador, un cuello de botella y el decodificador.
La parte del codificador del autoencoder es típicamente una red feedforward, densamente conectada. El propósito de las capas de codificación es tomar los datos de entrada y comprimirlos en una representación de espacio latente, generando una nueva representación de los datos que tiene una dimensionalidad reducida.
Las capas de código, o el cuello de botella, tratan la representación comprimida de los datos. El código del cuello de botella está diseñado cuidadosamente para determinar las porciones más relevantes de los datos observados, o para ponerlo de otra manera, las características de los datos que son más importantes para la reconstrucción de los datos. El objetivo aquí es determinar qué aspectos de los datos deben preservarse y cuáles pueden descartarse. El código del cuello de botella necesita equilibrar dos consideraciones diferentes: tamaño de representación (qué tan compacta es la representación) y relevancia de variable/característica. El cuello de botella realiza una activación element-wise en los pesos y sesgos de la red. La capa del cuello de botella también se llama a veces representación latente o variables latentes.
La capa del decodificador es la responsable de tomar los datos comprimidos y convertirlos nuevamente en una representación con las mismas dimensiones que los datos originales, no alterados. La conversión se realiza con la representación de espacio latente que fue creada por el codificador.
La arquitectura más básica de un autoencoder es una arquitectura feed-forward, con una estructura similar a un perceptrón simple utilizado en multilayer perceptrons. Al igual que las redes neuronales feed-forward regulares, el autoencoder se entrena mediante el uso de retropropagación.
Atributos de un Autoencoder
Hay varios tipos de autoencoders, pero todos tienen ciertas propiedades que los unen.
Los autoencoders aprenden automáticamente. No requieren etiquetas, y si se les da suficientes datos, es fácil obtener que un autoencoder alcance un alto rendimiento en un tipo específico de datos de entrada.
Los autoencoders son específicos de los datos. Esto significa que solo pueden comprimir datos que son muy similares a los datos que el autoencoder ya ha sido entrenado. Los autoencoders también son lossy, lo que significa que las salidas del modelo serán degradadas en comparación con los datos de entrada.
Al diseñar un autoencoder, los ingenieros de aprendizaje automático deben prestar atención a cuatro parámetros de modelo diferentes: tamaño de código, número de capas, nodos por capa y función de pérdida.
El tamaño del código decide cuántos nodos comienzan la parte media de la red, y menos nodos comprimen los datos más. En un autoencoder profundo, mientras que el número de capas puede ser cualquier número que el ingeniero considere apropiado, el número de nodos en una capa debe disminuir a medida que el codificador avanza. Mientras que lo contrario es cierto en el decodificador, lo que significa que el número de nodos por capa debe aumentar a medida que las capas del decodificador se acercan a la capa final. Finalmente, la función de pérdida de un autoencoder es típicamente la entropía cruzada binaria o el error cuadrático medio. La entropía cruzada binaria es adecuada para instancias donde los valores de entrada de los datos están en un rango de 0 a 1.
Tipos de Autoencoder
Como se mencionó anteriormente, existen variaciones sobre la arquitectura clásica de autoencoder. Veamos las diferentes arquitecturas de autoencoder.
Disperso

Foto: Michela Massi via Wikimedia Commons, CC BY SA 4.0 (https://commons.wikimedia.org/wiki/File:Autoencoder_sparso.png)
Mientras que los autoencoders típicamente tienen un cuello de botella que comprime los datos a través de una reducción de nodos, los autoencoders dispersos son una alternativa a ese formato de operación típico. En una red dispersa, las capas ocultas mantienen el mismo tamaño que las capas de codificador y decodificador. En su lugar, las activaciones dentro de una capa determinada se penalizan, configurándolo para que la función de pérdida capture mejor las características estadísticas de los datos de entrada. Para ponerlo de otra manera, mientras que las capas ocultas de un autoencoder disperso tienen más unidades que un autoencoder tradicional, solo un cierto porcentaje de ellas están activas en cualquier momento dado. Las funciones de activación más impactantes se preservan y las demás se ignoran, y esta restricción ayuda a la red a determinar solo las características más destacadas de los datos de entrada.
Contractivo
Los autoencoders contractivos están diseñados para ser resistentes a pequeñas variaciones en los datos, manteniendo una representación consistente de los datos. Esto se logra aplicando una penalización a la función de pérdida. Esta técnica de regularización se basa en la norma de Frobenius de la matriz jacobiana para las activaciones del codificador de entrada. El efecto de esta técnica de regularización es que el modelo se ve obligado a construir una codificación donde las entradas similares tendrán codificaciones similares.
Convolutivo
Los autoencoders convolutivos codifican los datos de entrada dividiéndolos en secciones y luego convirtiendo estas secciones en señales simples que se suman para crear una nueva representación de los datos. Similar a las redes neuronales convolucionales, un autoencoder convolutivo se especializa en el aprendizaje de datos de imagen, y utiliza un filtro que se mueve a través de toda la sección de imagen sección por sección. Las codificaciones generadas por la capa de codificación se pueden utilizar para reconstruir la imagen, reflejar la imagen o modificar la geometría de la imagen. Una vez que los filtros han sido aprendidos por la red, se pueden utilizar en cualquier entrada lo suficientemente similar para extraer las características de la imagen.
Desruidado

Foto: MAL via Wikimedia Commons, CC BY SA 3.0 (https://en.wikipedia.org/wiki/File:ROF_Denoising_Example.png)
Los autoencoders desruidados introducen ruido en la codificación, lo que resulta en una codificación que es una versión corrupta de los datos de entrada originales. Esta versión corrupta de los datos se utiliza para entrenar el modelo, pero la función de pérdida compara los valores de salida con los datos de entrada originales y no con los datos de entrada corruptos. El objetivo es que la red sea capaz de reproducir la versión original, no corrupta, de la imagen. Al comparar los datos corruptos con los datos originales, la red aprende qué características de los datos son más importantes y qué características son no importantes/corrupciones. En otras palabras, para que un modelo desruidice las imágenes corruptas, debe haber extraído las características importantes de los datos de la imagen.
Variacional
Los autoencoders variacionales operan haciendo suposiciones sobre cómo se distribuyen las variables latentes de los datos. Un autoencoder variacional produce una distribución de probabilidad para las diferentes características de las imágenes de entrenamiento/los atributos latentes. Al entrenar, el codificador crea distribuciones latentes para las diferentes características de las imágenes de entrada.

Cuando se entrena la red, los datos codificados se analizan y el modelo de reconocimiento produce dos vectores, extrayendo la media y la desviación estándar de las imágenes. Se crea una distribución basada en estos valores. Esto se hace para los diferentes estados latentes. El decodificador luego toma muestras aleatorias de la distribución correspondiente y las utiliza para reconstruir las entradas iniciales a la red.
Aplicaciones de Autoencoder
Los autoencoders se pueden utilizar para una amplia variedad de aplicaciones, pero generalmente se utilizan para tareas como reducción de dimensionalidad, desruidado de datos, extracción de características, generación de imágenes, predicción de secuencia a secuencia y sistemas de recomendación.
El desruidado de datos es el uso de autoencoders para eliminar el grano/ruido de las imágenes. De manera similar, los autoencoders se pueden utilizar para reparar otros tipos de daños en las imágenes, como imágenes borrosas o imágenes que faltan secciones. La reducción de dimensionalidad puede ayudar a las redes de alta capacidad a aprender características útiles de las imágenes, lo que significa que los autoencoders se pueden utilizar para mejorar el entrenamiento de otros tipos de redes neuronales. Esto también es cierto para el uso de autoencoders para la extracción de características, ya que los autoencoders se pueden utilizar para identificar características de otros conjuntos de datos de entrenamiento para entrenar otros modelos.
En términos de generación de imágenes, los autoencoders se pueden utilizar para generar imágenes falsas de humanos o personajes animados, lo que tiene aplicaciones en el diseño de sistemas de reconocimiento facial o la automatización de ciertos aspectos de la animación.
Los modelos de predicción de secuencia a secuencia se pueden utilizar para determinar la estructura temporal de los datos, lo que significa que un autoencoder se puede utilizar para generar el próximo evento en una secuencia. Por esta razón, un autoencoder podría utilizarse para generar videos. Finalmente, los autoencoders profundos se pueden utilizar para crear sistemas de recomendación al detectar patrones relacionados con el interés del usuario, con el codificador que analiza los datos de participación del usuario y el decodificador que crea recomendaciones que se ajustan a los patrones establecidos.












