Fundamentos de la IA

¿Qué es un Autoencoder?

mm
Añade Unite.AI a tus fuentes preferidas en Google

Si has leído sobre técnicas de aprendizaje no supervisado antes, es posible que hayas 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 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. Aunque 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?

Los 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 a 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 decodificación (salida). Cuando se alimentan datos 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 entrenar la red, se puede crear un modelo que puede 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 del Autoencoder

Veamos la arquitectura de un autoencoder. Discutiremos la arquitectura principal de un autoencoder aquí. Hay variaciones en 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 dimensionalidad reducida.

Las capas de código, o el cuello de botella, tratan con la representación comprimida de los datos. El código del cuello de botella se diseña cuidadosamente para determinar las partes más relevantes de los datos observados, o para decirlo 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 necesitan ser preservados y cuáles se pueden descartar. El código del cuello de botella necesita equilibrar dos consideraciones diferentes: tamaño de la representación (qué tan compacta es la representación) y relevancia de la variable/característica. El código del 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 de regreso 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 se creó con el codificador.

La arquitectura más básica de un autoencoder es una arquitectura feed-forward, con una estructura similar a la de un perceptrón simple utilizado en redes neuronales multilayer. Al igual que las redes neuronales feed-forward regulares, el autoencoder se entrena mediante el uso de la propagación hacia atrás.

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 sean muy similares a los datos en los que el autoencoder ya ha sido entrenado. Los autoencoders también son pérdida, 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 necesitan prestar atención a cuatro hiperpará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 tanto, lo opuesto 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 en las que los valores de entrada de los datos están en un rango de 0 a 1.

Tipos de Autoencoders

Como se mencionó anteriormente, existen variaciones en la arquitectura clásica del autoencoder. Veamos las diferentes arquitecturas de autoencoders.

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 funcionamiento típico. En una red dispersa, las capas ocultas mantienen el mismo tamaño que las capas del codificador y del 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 decirlo 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 conservan 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 convolutivas, 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 la 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 la red ha aprendido los filtros, se pueden utilizar en cualquier entrada lo suficientemente similar para extraer las características de la imagen.

Desruidoso

Foto: MAL via Wikimedia Commons, CC BY SA 3.0 (https://en.wikipedia.org/wiki/File:ROF_Denoising_Example.png)

Los autoencoders desruidosos 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 pueda 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 irrelevantes/corrupciones. En otras palabras, para que un modelo pueda desruidar 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.

 

Debido a que el modelo aprende las características o imágenes como distribuciones gaussianas en lugar de valores discretos, es capaz de ser utilizado para generar nuevas imágenes. La distribución gaussiana se muestrea para crear un vector, que se alimenta a la red de decodificación, que renderiza una imagen basada en este vector de muestras. Esencialmente, el modelo aprende características comunes de las imágenes de entrenamiento y les asigna alguna probabilidad de que ocurran. La distribución de probabilidad se puede utilizar para revertir la ingeniería de una imagen, generando nuevas imágenes que se asemejan a las imágenes de entrenamiento originales.

Al entrenar 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 toma muestras aleatorias de la distribución correspondiente y las utiliza para reconstruir las entradas iniciales a la red.

Aplicaciones de los Autoencoders

Los autoencoders se pueden utilizar para una amplia variedad de aplicaciones, pero generalmente se utilizan para tareas como la reducción de dimensionalidad, la desruidación de datos, la extracción de características, la generación de imágenes, la predicción de secuencia a secuencia y los sistemas de recomendación.

La desruidación 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 otras redes neuronales. Esto también es cierto al utilizar 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 cuanto a la generación de imágenes, los autoencoders se pueden utilizar para generar imágenes humanas falsas 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 siguiente evento en una secuencia. Por esta razón, un autoencoder se podría utilizar 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 analizando los datos de participación del usuario y el decodificador creando recomendaciones que se ajustan a los patrones establecidos.

Bloguero y programador con especialidades en Machine Learning y Deep Learning temas. Daniel espera ayudar a otros a utilizar el poder de la IA para el bien social.