Transformers » Vision Transformers
Vision Transformers

Los Vision Transformers (ViTs) son una arquitectura de redes neuronales para visión por computadora basada en los Transformers, originalmente diseñados para procesamiento de lenguaje natural. En lugar de convoluciones como en las CNN tradicionales, los ViTs dividen una imagen en patches (parches) y los tratan como tokens de una secuencia, similar a cómo los Transformers manejan palabras en NLP.

🚀 Ventajas sobre CNNs

  1. Captura relaciones globales: No depende de ventanas locales como las CNNs, lo que permite captar estructuras a largo alcance.
  2. Mejor escalabilidad: Con suficientes datos y potencia de cómputo, puede superar a las CNNs en rendimiento.
  3. Transferencia de aprendizaje: Un ViT preentrenado en grandes datasets (como ImageNet) se puede ajustar bien a otras tareas.

🚨 Desventajas sobre CNNs

  1. Requiere más datos: Sin preentrenamiento en datasets grandes, rinde peor que las CNNs.
  2. Computacionalmente intensivo: La complejidad del self-attention crece cuadráticamente con el número de patches.

Un Vision Transformer se encarga de tomar una imagen y devolver un numero, que representa la clase a la que pertenece esta imagen.

Supongamos que quiero ordenar un set de imágenes en dos clases: La clase número 0 representa los perros y la clase 1 representa los gatos.

Si yo le entrego al Vision Transformer una imagen con un perro, me debería devolver el numero 0 para indicar que esa imagen es de un perro.

Por otro lado, cuando le entrego una imagen de un gato, me debería devolver el numero 1 para indicar que esa imagen es de un gato.

Decodificador

El Vision Transformer está compuesto por una serie decodificadores puestos en pila donde cada decodificador procesa la salida del decodificador anterior, excepto el primer decodificador que procesa la imagen.

El Vision Transformer está compuesto por decodificadores. Acá puedes ver un Vision Transformer con un solo decodificador:

Pero por lo general, los Vision Transformer suelen tener muchos decodificadores que se agrupan en bloques. Acá puedes ver un transformer con 3 decodificadores.

En líneas generales la imagen se dividirá en patches y se entregará al primer decodificador, el cual procesará las características de los patches que conforman la imagen y le pasara el resultado al siguiente decodificador. El siguiente decodificador repetirá el proceso hasta llegar al último decodificador, el cual le pasará los resultados a una capa lineal y luego a una función de activación Softmax que traducirá el resultado del transformer en probabilidades. La probabilidad más alta será la clase a la que pertenece la imagen.

Volviendo al ejemplo del perro, cuando le damos esta imagen al Vision Transformer, podemos intuir que va a procesar dicha imagen y va a devolver la probabilidad de que esa foto pertenezca a cada clase. La probabilidad más alta representa la clase a la cual pertenece esa imagen.

En este ejemplo se ve que la probabilidad más alta es la clase 0 (perro).

Flujo de trabajo

PASO 1 - Convertir la imagen en patches

Los Transformers no trabajan con imágenes crudas. Fueron diseñados para texto, donde cada palabra es un token. Para adaptar el modelo a imágenes, convertimos la imagen en pequeñas regiones cuadradas llamdas Patches que actúan como tokens.

¿Cómo se hace la conversión? Si tenemos una imagen de 224×224 píxeles y usamos patches de 16×16, la imagen se divide en:

22416=14(patchesporlado)\frac{224}{16}=14(patches por lado)

En total, la imagen se convierte en 14×14 = 196 patches.

Cada patche de 16×16 píxeles se aplana en un vector de tamaño 16×16×3=768 (si la imagen es RGB).

Paso 1.1 - Embedding de Patches 2D

Cada vector se transforma en un embedding, igual que las palabras en NLP. Se pasa por una capa lineal (Linear(768, embed_dim)) para mapearlo a un embedding de embed_dim dimensiones.

En ViT, el embedding de los patches sirve para representar características visuales. No tiene un significado semántico explícito como en NLP, pero encapsula información relevante sobre la imagen, tal como colores, texturas y patrones dentro del patche.

Paso 2 - Embedding Posicional

Para calcular el embedding posiciional se debe iniciar una matriz de parámetros aprendida. Es un tensor de tamaño (1,N,D) donde:

  1. N = número de patches (Ej: 196 si hay 14×14 patches).
  2. D = embed_dim (Ej: 768).

Inicialmente, este tensor contiene valores aleatorios, pero se entrena junto con el modelo para aprender la mejor representación espacial. Por eso, se define como un parámetro aprendible

La razón por la que se utiliza una matriz de parámetros aprendible en lugar de una capa lineal es porque el Positional Encoding no transforma los datos, sino que simplemente se suma a los embeddings de los patches para proporcionar información sobre su posición relativa.

PASO 3 - Mecanismo de autoatención de múltiples cabezales

En el decodificador, la atención de múltiples cabezas utiliza un mecanismo de atención especializado conocido como autoatención. Este enfoque permite a los modelos relacionar cada palabra de la entrada con las otras palabras de dicha entrada. Por ejemplo, en un ejemplo dado, el modelo podría aprender a conectar la palabra "eres" con "tú".

Este mecanismo permite que el decodificador se centre en diferentes partes de la secuencia de entrada mientras procesa cada token. Calcula puntuaciones de atención basadas en 3 tipos de vectores:

  1. Vector Consulta (Query): Representa la pregunta o enfoque que el modelo está realizando sobre la secuencia. Es la representación de lo que se quiere buscar o lo que se quiere obtener de la secuencia. En otras palabras, es el "foco" de atención del modelo, indicando lo que se necesita saber.

  2. Vector Clave (Key): Representa la información identificativa o característica de una posición específica en la secuencia. Es un vector que está asociado a cada token o palabra en la secuencia y contiene la información que podría ser relevante para la consulta (query).

  3. Vector Valor (Value): Cada valor está asociado con una clave y se utiliza para construir la salida de la capa de atención. Cuando una consulta y una clave coinciden bien, lo que básicamente significa que tienen una puntuación de atención alta, el valor correspondiente se enfatiza en el resultado.

Este primer módulo de Autoatención permite al modelo capturar información contextual de toda la secuencia. En lugar de realizar una única función de atención, las consultas, claves y valores se proyectan linealmente h veces. En cada una de estas versiones proyectadas de consultas, claves y valores, el mecanismo de atención se realiza en paralelo, generando valores de salida de dimensión h.

La arquitectura detallada es la siguiente:

Multiplicación de matrices: producto escalar de vectores consulta (query) y clave (key)

Una vez que los vectores de consulta, clave y valor pasan a través de una capa lineal, se realiza una multiplicación de matriz de producto escalar entre las consultas y las claves, lo que da como resultado la creación de una matriz de puntajes.

La matriz de puntajes establece el grado de énfasis que debe poner cada palabra sobre otras palabras. Por lo tanto, a cada palabra se le asigna un puntaje en relación con las otras palabras dentro del mismo intervalo de tiempo. Un puntaje más alto indica una mayor concentración.

Este proceso asigna efectivamente las consultas a sus claves correspondientes.

Reducir la magnitud de las puntuaciones de atención

Luego, las puntuaciones se reducen dividiéndolas por la raíz cuadrada de la dimensión de la consulta y los vectores clave. Este paso se implementa para garantizar gradientes más estables, ya que la multiplicación de valores puede generar efectos excesivamente grandes.

Aplicación de Softmax a las puntuaciones ajustadas

Posteriormente, se aplica una función Softmax a las puntuaciones ajustadas para obtener los pesos de atención. Esto da como resultado valores de probabilidad que van de 0 a 1. La función Softmax enfatiza las puntuaciones más altas mientras disminuye las puntuaciones más bajas, mejorando así la capacidad del modelo para determinar de manera efectiva qué palabras deberían recibir más atención.

Combinando los resultados de Softmax con el vector de valor

El siguiente paso del mecanismo de atención es que los pesos derivados de la función Softmax se multiplican por el vector de valor, lo que da como resultado un vector de salida.

En este proceso, sólo se conservan las palabras que presentan puntuaciones Softmax altas. Finalmente, este vector de salida se introduce en una capa lineal para su posterior procesamiento.

¡Y finalmente obtenemos el resultado del mecanismo de Atención!

Entonces, quizás te preguntes por qué se llama Atención de múltiples cabezas.

Recuerde que antes de que comience todo el proceso, descomponemos nuestras consultas, claves y valores h veces. Este proceso, conocido como autoatención, ocurre por separado en cada una de estas etapas más pequeñas o "cabezas". Cada cabeza hace su magia de forma independiente, evocando un vector de salida.

Este conjunto pasa por una capa lineal final, muy parecida a un filtro que afina su interpretación colectiva. La belleza aquí radica en la diversidad de aprendizaje en cada cabeza, enriqueciendo el modelo decodificador con una comprensión sólida y multifacética.

PASO 3.1 - Normalización y conexiones residuales

Cada subcapa en una capa de decodificador va seguida de un paso de normalización. Además, la salida de cada subcapa se agrega a su entrada (conexión residual) para ayudar a mitigar el problema del gradiente que desaparece, lo que permite modelos más profundos. Este proceso también se repetirá después de la red neuronal.

PASO 3.2 - Red neuronal de retroalimentación

El viaje de la producción residual normalizada continúa mientras navega a través de una red de retroalimentación puntual, una fase crucial para un refinamiento adicional.

Imagine esta red como un dúo de capas lineales, con una activación ReLU ubicada entre ellas, actuando como un puente. Una vez procesada, la salida sigue un camino familiar: retrocede y se fusiona con la entrada de la red de alimentación directa puntual.

A esta reunión le sigue otra ronda de normalización, asegurando que todo esté bien ajustado y sincronizado para los próximos pasos.

PASO 4 - Salida del decodificador

La función del decodificador se centra en la elaboración de secuencias de texto. El decodificador está equipado con un conjunto similar de subcapas. Cuenta con dos capas de atención de múltiples cabezales, una capa de red neuronal e incorpora conexiones residuales y normalización de capas después de cada subcapa.

Estos componentes funcionan de manera similar a las capas del decodificador, pero con un giro: cada capa de atención de múltiples cabezas en el decodificador tiene una misión única.

El final del proceso del decodificador implica una capa lineal, que sirve como clasificador, rematada con una función Softmax para calcular las probabilidades de elegir las diferentes palabras del vocabulario.

Conclusiones

Los Vision Transformers (ViTs) han demostrado ser una alternativa muy potente a los CNNs tradicionales para tareas de visión por computadora. Algunas conclusiones clave sobre su desempeño y uso son:

1. ViTs superan a los CNNs con suficientes datos

  1. Cuando se entrenan con grandes volúmenes de datos, los ViTs pueden superar a las redes convolucionales en muchas tareas de visión.
  2. En datasets pequeños, sin preentrenamiento, los CNNs siguen siendo superiores debido a su inductive bias (como la invarianza a traslaciones).

2. Escalabilidad

  1. ViTs escalan muy bien con el tamaño del dataset y el modelo. Modelos más grandes entrenados en conjuntos de datos masivos (por ejemplo, JFT-300M) pueden lograr un rendimiento de vanguardia.
  2. En comparación con los CNNs, los ViTs no requieren que los ingenieros diseñen arquitecturas con convoluciones específicas para diferentes tareas.

3. Requieren mucho preentrenamiento

  1. Los ViTs dependen fuertemente del preentrenamiento en grandes datasets como ImageNet o incluso conjuntos aún más grandes.
  2. Sin preentrenamiento, los ViTs tienen dificultades para generalizar en datasets más pequeños.

4. Costos computacionales elevados

  1. Los ViTs tienen una complejidad cuadrática respecto a la cantidad de patches de imagen debido a la autoatención global, lo que los hace costosos en imágenes de alta resolución.
  2. Para mejorar la eficiencia, han surgido variantes como Swin Transformer y DeiT, que reducen el costo computacional y mejoran la eficiencia.

5. Interpretabilidad

  1. A diferencia de los CNNs, donde los filtros convolucionales pueden interpretarse como detectores de características, los ViTs son más difíciles de analizar debido a su uso de atención global.
  2. Sin embargo, herramientas como attention maps permiten visualizar qué partes de la imagen influyen más en la decisión d el modelo.

6. Adaptabilidad a múltiples tareas

  1. ViTs se han adaptado a tareas más allá de clasificación, como segmentación (Segmenter), detección de objetos (DETR) y generación de imágenes.

Los ViTs son una tecnología revolucionaria en visión por computadora, pero requieren grandes volúmenes de datos y potencia computacional para superar a los CNNs. Con avances en modelos híbridos y optimizaciones, los transformers seguirán ganando terreno en tareas de visión.

Hemos llegado al final de este artículo. Espero que te halla resultado útil y que hallas disfrutado leyéndolo tanto como yo disfrute escribiéndolo 😁.