Transfer Learning en modelos profundos

Enrique Blanco    13 septiembre, 2019
Cabezas de ganado

En el Departamento de Ideas Locas nos encanta trastear con la Inteligencia Artificial, sobre todo si nos piden algo con aplicaciones fuera de lo común. Justo antes del verano estuvimos familiarizándonos con una práctica muy interesante relacionada con el Deep Learning: Transfer Learning para clasificar imágenes con alta precisión.

El objetivo en la clasificación de imágenes no es más que es etiquetar una imagen específica de acuerdo con un conjunto de categorías posibles.

Desde una perspectiva de aprendizaje profundo, el problema de clasificación de imágenes se puede resolver mediante Transfer Learning o aprendizaje por transferencia. Éste es un método popular en visión artificial porque nos permite construir modelos precisos ahorrando una gran cantidad de tiempo. Con el aprendizaje de transferencia, en lugar de comenzar el proceso de aprendizaje desde cero, se comienza haciendo uso de patrones o modelos pre-entrenados que se han aprendido al resolver un problema diferente.

Principios de Transfer Learning

Un modelo pre-entrenado es un modelo que fue entrenado con un ingente conjunto de datos de referencia para resolver un problema similar al que queremos abordar. Debido al coste computacional del entrenamiento de tales modelos, así como en la complejidad a la hora de elegir la arquitectura óptima, el Transfer Learning de modelos bien conocidos y precisos se ha convertido es una práctica común (por ejemplo, VGG-16, VGG-19, ResNet-50, SeNet-50, etc.)

Supongamos que, por poner un ejemplo, deseamos clasificar rostros de ganado, pero no existen algoritmos liberados que hagan un trabajo adecuado. Parece algo novedoso, pero desde hace un año el Deep Learning ha encontrado en el sector ganadero un campo de aplicación muy interesante, como ya adelantamos en este post. Con Transfer Learning, podemos construir una red neuronal convolucional ya existente y entrenada, comúnmente utilizada para el reconocimiento facial y modificarlo para entrenar rostros de vacas (por ejemplo). Podríamos descargarnos los pesos de los modelos bien conocidos ya mencionados, de varias decenas o cientos de capas, con un elevado nivel de precisión para clasificar rostros de personas y usarlo para identificar con una precisión similar a una determinada cabeza de ganado.

Figura 1.
Diferencias en el proceso de aprendizaje entre ML tradicional y Transfer Learning. Fuente

Las redes convolucionales (que son las arquitecturas típicas para la resolución de este tipo de problema) actúan, al fin y al cabo, como extractores de características tales como los ojos, las orejas y los morros de una vaca o un cerdo haciendo uso de lo que ese modelo aprendió en su origen clasificando rostros de personas famosas.

Redes convolucionales

Una CNN (Convolutional Neural Network) típica tiene dos partes:

  • una base convolucional, compuesta por una pila de capas convolucionales y de agrupación. El objetivo principal de la base convolucional es extraer características de la imagen;
  • un clasificador, que generalmente está compuesto por capas completamente conectadas. El objetivo principal del clasificador es clasificar la imagen en función de las características detectadas. Una capa totalmente conectada es aquella en la que sus neuronas tienen conexiones con todas las activaciones en la capa anterior.

Un aspecto importante de estos modelos de aprendizaje profundo es que pueden aprender automáticamente representaciones jerárquicas de características. Esto significa que las características calculadas por la primera capa son generales y pueden reutilizarse en diferentes problemas, mientras que las características calculadas por la última capa son específicas y dependen del conjunto de datos y la tarea elegidos.

A lo largo de la arquitectura hay una transición donde se pasa de extraer los rasgos más generales a los más específicos. Como resultado, la base convolucional de una CNN, especialmente sus capas inferiores (las que están más cerca de las entradas), se refieren a características generales, mientras que la parte clasificadora y algunas de las capas superiores de la base convolucional se refieren a características especializadas.

En la siguiente imagen intentamos mostrar las activaciones de algunos de los filtros de la última capa convolucional de la arquitectura VGG-16 dedicada a la clasificación de rostros de un dataset extenso de personas famosas. Como se puede ver (aunque onírico e inquietante) se distinguen perfectamente las características en la que esta capa convolucional se fija en una imagen (ojos, narices, orejas, bocas…).

Figura 2.
Visualización de algunos de los filtros de la última capa convolucional (Conv5_3) del modelo VGG-16 de clasificación de rostros.

Conceptos asociados

Pero volvamos a poner el punto de mira en las fuentes del problema que se intenta resolver: la posible escasez de muestras para entrenar a un modelo y la disparidad entre los datos que tenemos entre manos y aquellos que se usaron en su día para entrenar el modelo que vamos a tomar como base.

Una definición formal de Transfer Learning es la siguiente (A Survey on Deep Transfer Learning; Tan, C.; et al. 6 Aug 2018):


Contamos con un dominio D formado por: un espacio de características X y una distribución de probabilidad P(X) donde x={x_1, ..., x_n}\in X . Dado ese dominio D={X, P(X)} y una muestra \tau  que podemos considerar formada por dos componentes: una etiqueta Y  y una función objetivo f(\cdot)  tal que \tau={Y, f(\cdot)}.  Esta función es aprendida a través de un entrenamiento basado en datos agrupados por pares {x_i, y_i} donde x_i\in X  e y_i\in Y . Entonces la función f(\cdot)  se puede usar para predecir una etiqueta  de una nueva muestra x  incluso cuando está en las fronteras de la distribución marginal que define D .


Estrategias

Cuando queremos reutilizar un modelo pre-entrenado para tus propias necesidades, se suele comenzar eliminando el clasificador original para posteriormente agregar un nuevo clasificador que se adapta a tus propósitos. Sólo nos queda ajustar tu modelo de acuerdo con una de tres estrategias por la que deberemos apostar:

  • Estrategia 1: Entrenar todo el modelo. En este caso, utiliza la arquitectura del modelo pre-entrenado y lo entrena de acuerdo con su conjunto de datos. Está aprendiendo el modelo desde cero, por lo que necesitará un gran conjunto de datos (y mucha potencia computacional).
  • Estrategia 2: Entrenar algunas capas y deja las otras congeladas. Como se comentó anteriormente, las capas inferiores abstraen características generales (independientes del problema), mientras que las capas superiores tienen capacidad de abstraer características específicas. Por lo general, si tiene un conjunto de datos pequeño y una gran cantidad de parámetros, deberemos tender a dejar más capas congeladas para evitar un overfitting sobre nuestro dataset. Por el contrario, si el conjunto de datos es grande y el número de parámetros es pequeño, puede mejorar su modelo entrenando más capas para la nueva tarea, ya que el overfitting no será un problema que nos afecte.
  • Estrategia 3: Congelar la base convolucional. La idea principal es mantener la base convolucional en su forma original y luego usar sus salidas para alimentar un clasificador propio. En este caso se está utilizando un modelo pre-entrenado como un mecanismo de extracción de características generales, que puede ser útil si tiene poca potencia computacional, su conjunto de datos es pequeño y/o el dataset empleado en entrenar el modelo pre-entrenado cuenta con una distribución muy similar al que tenemos entre manos.

Guía de aplicación de las estrategias

Desde una perspectiva práctica, todo el proceso de aprendizaje de transferencia se puede resumir como sigue. Contamos con un conjunto de dominios D_s  y   D_T (fuentes y objetivo respectivamente) donde D_s={X_s, P(X_s)}; D_T={X_T, P(X_T)} y tenemos muestras \tau_s  y \tau_T  donde \tau={Y, P(Y|X)} :

  1. Contamos con un gran número de datos, pero éstos son diferentes del conjunto de datos del modelo previamente entrenado. X_s\neq X_T y P(X_s)\neq P(X_T). El espacio de características en los dominios de la fuente y el objetivo son diferentes. Las distribuciones de probabilidad marginal no coinciden al ser los dominios de las fuentes y del objetivo diferentes. Esta situación la deberíamos abordar desde la estrategia 1. Como tenemos un gran conjunto de datos, puede entrenar un modelo desde cero y hacer lo que quiera. A pesar de la diferencia de conjunto de datos, en la práctica, aún puede ser útil inicializar su modelo a partir de un modelo previamente entrenado, utilizando su arquitectura y pesos.
  2. Tenemos un gran conjunto de datos que, además, es similar al conjunto de datos del modelo previamente entrenado. Este es un escenario ideal. Cualquier estrategia funcionará. Probablemente, la opción más eficiente es la estrategia 2. Dado que tenemos un gran conjunto de datos, el sobreajuste no debería ser un problema, por lo que podemos aprender todo lo que queramos. Sin embargo, dado que los conjuntos de datos son similares, podemos salvarnos de un gran esfuerzo de capacitación aprovechando el conocimiento previo. Por lo tanto, debería ser suficiente entrenar el clasificador y las capas superiores de la base convolucional.
  3. Nuestro conjunto de datos es pequeño y diferente del conjunto de datos del modelo previamente entrenado.   P(Y_s|X_s)\neq P(Y_T|X_T). Las distribuciones de probabilidad condicionales de la fuente y el objetivo son diferentes. Nos encontramos ante esta tesitura cuando el número de muestras de una determinada clase está sin balancear. Se suele aproximar a través de diferentes técnicas de over/under-sampling. La única opción que tiene es la estrategia 2. Será difícil encontrar un equilibrio entre la cantidad de capas para entrenar y congelar. Si profundizamos en la congelación, nuestro modelo podría sufrir overfitting. Si permanece en el extremo poco profundo de su modelo, éste no aprenderá nada útil de la nueva distribución marginal. Se deberían considerar seriamente las técnicas de aumento de datos.
  4. El conjunto de datos nuevos es pequeño, pero similar al conjunto de datos del modelo previamente entrenado. La estrategia 3 es la más adecuada. Solo necesita eliminar las últimas capas completamente conectadas (capas de salida), ejecutar el modelo previamente entrenado como un extractor de características fijas y luego usar las características resultantes para entrenar a un nuevo clasificador.

Esperamos que esta introducción a la reutilización de modelos de Deep Learning para proyectos propios os haya gustado. En siguientes entregas profundizaremos en un ejemplo entretenido de Transfer Learning donde presentaremos algo de código haciendo uso de Keras.

Para mantenerte al día con LUCA, visita nuestra página web,  suscríbete a LUCA Data Speaks o síguenos en TwitterLinkedIn YouTube.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *