• Saltar a la navegación principal
  • Saltar al contenido principal
Logo Codificando Bits

Codificando Bits

  • Academia
    • Rutas
    • Cursos
    • Proyectos
    • Tutoriales
  • Acceder
  • Suscribirse

Cómo funciona el Vision Transformer (ViT) en la Visión por Computador

En los últimos años, las Redes Transformer se han consolidado como una de las arquitecturas que ha revolucionado la Inteligencia Artificial y, de hecho, son la base de lo que hoy conocemos como los Grandes Modelos de Lenguaje.

Sin embargo, con ligeras modificaciones en su arquitectura, este mismo tipo de redes puede aprovecharse para realizar complejas tareas de visión por computador, usando una arquitectura que se conoce como el Vision Transformer (ViT).

Así que en este artículo veremos en detalle cómo funciona este Vision Transformer, cómo procesa las imágenes y cómo podemos combinarlo con otras arquitecturas de Deep Learning para generar aplicaciones capaces de procesar simultáneamente imágenes, texto e incluso videos.

Repaso: el principio de funcionamiento de la Red Transformer

Para entender el Vision Transformer, debemos volver a lo básico y repasar el funcionamiento de la Red Transformer original.

Esta red fue diseñada inicialmente para tareas de traducción de texto, es decir para tomar un texto de entrada en un idioma y llevarlo a un segundo idioma.

Internamente, toma el texto original, lo codifica numéricamente y lo envía a un bloque codificador (ver figura de abajo). Este bloque codificador genera una representación matricial con números que codifican cada palabra y, sobre todo, la relación de cada palabra con los diferentes elementos de todo el texto. Posteriormente, esta salida codificada se lleva a una etapa de decodificación, la cual realiza un proceso inverso para interpretar la secuencia y generar el texto en el idioma destino a la salida:

La arquitectura de una Red Transformer
La arquitectura de una Red Transformer

¿Qué es exactamente un Vision Transformer?

En esencia, un Vision Transformer consiste en tomar una red Transformer original, eliminar por completo la etapa de decodificación y quedarnos únicamente con el codificador.

Con unas ligeras modificaciones adicionales, esta arquitectura nos permite procesar una imagen exactamente como si fuese una secuencia de texto. La etapa de codificación se encarga de tomar dicha secuencia, procesarla y generar una secuencia numérica que codifica la información de la imagen y la relación espacial entre sus diferentes elementos, lo que nos va a permitir luego implementar diferentes aplicaciones de visión por computador.

Arquitectura del Vision Transformer paso a paso

El Vision Transformer acepta como entrada cualquier tipo de imagen, ya sea en escala de grises o a color. A partir de allí, la imagen es procesada secuencialmente por seis diferentes bloques:

  1. Generación de patches
  2. Embedding lineal
  3. Codificación posicional
  4. Codificador Transformer
  5. Bloque Pooling
  6. Cabecera de salida
Los bloques que conforman un Vision Transformer
Los bloques que conforman un Vision Transformer

Los tres primeros bloques actúan como etapas de preprocesamiento que preparan la imagen para ser representada e interpretada correctamente como una secuencia. Luego viene el codificador transformer, que es el elemento central de esta red, para finalizar con las etapas de salida.

Así que veamos cómo funciona en detalle cada uno de estos bloques.

1. Generación de patches y aplanado

Principio de funcionamiento de los bloques de generación de "patches" y embedding lineal en un Vision Transformer
Principio de funcionamiento del bloque de generación de «patches» en un Vision Transformer

Partiendo del hecho de que la red Transformer procesa secuencias, el primer paso es modificar la imagen original, para lo cual se sub-divide en diferentes porciones que en adelante llamaremos patches.

Para comprender esto visualmente, imaginemos que subdividimos la imagen en nueve recuadros diferentes, cada uno conteniendo una porción determinada de la imagen original (ver figura de arriba). Estos recuadros o patches no tienen un orden aleatorio, pues cada uno de ellos tiene relación con los anteriores y su ubicación específica dentro de la imagen se tiene que preservar para poder interpretarla correctamente.

Una vez creados estos recuadros, el siguiente paso es «aplanarlos» para llevarlos a una representación vectorial (una secuencia de números), que es exactamente lo que el codificador Transformer puede interpretar. Para aplanar cada patch, se lee cada uno fila por fila y se concatenan (unen) estas filas en una lista numérica que conforma un vector.

Ejemplo detallado en números:

  • Supongamos que nuestra imagen de entrada tiene 48 filas (altura), 48 columnas (ancho) y 3 de profundidad (plano de color con rojo, verde y azul).
  • Si creamos 9 patches, cada recuadro tendrá un tamaño de 16x16x3.
  • Al momento de aplanar cada uno de estos nueve recuadros, obtendremos vectores individuales de 768 elementos (dado que 16 x 16 x 3 = 768) .
  • Y en total, tendremos 9 vectores correspondientes a los 9 recuadros, ordenados del 1 al 9 dependiendo de su posición relativa original (y que se muestran en la parte de superior de la figura de arriba).

Con esto logramos representar numéricamente, como vectores y de forma secuencial, los diferentes elementos de la imagen.

2. Embedding lineal

Principio de funcionamiento del bloque de "embedding" lineal en un Vision Transformer
Principio de funcionamiento del bloque de «embedding» lineal en un Vision Transformer

El arreglo resultante del paso anterior (9 filas por 768 columnas para nuestro ejemplo) pasa al bloque de embedding lineal. Este bloque toma esa representación y la lleva a una pequeña Red Neuronal de una sola capa oculta.

El objetivo de esta Red Neuronal es generar un arreglo similar pero reduciendo su dimensionalidad (es decir el número de elementos de cada vector). Así que, en lugar de representar cada uno de los nueve vectores con 768 elementos, este bloque de embedding lineal compacta la información y los representa con tan solo 512 elementos.

En esencia, esta nueva representación contiene la misma información, pero con menos datos, lo cual sirve para reducir la cantidad de operaciones que se harán de allí en adelante en la red, lo cual también permite agilizar tanto el entrenamiento del ViT como la generación de predicciones.

3. Codificación posicional

Principio de funcionamiento del bloque de codificación posicional en un Vision Transformer
Principio de funcionamiento del bloque de codificación posicional en un Vision Transformer

A continuación tenemos un elemento importantísimo heredado de las redes Transformer originales: la codificación posicional.

Partiendo del arreglo de 9 filas por 512 columnas entregado por el embedding lineal, este bloque agrega a cada uno de los nueve elementos un nuevo vector de 512 elementos que contiene la información acerca de la posición del patch dentro de la imagen de entrada.

Este paso es crítico porque es esencial preservar la información espacial, garantizando que cada patch no tiene un orden aleatorio, sino específico (que dependerá de su ubicación con respecto a la imagen original). Al añadir estos vectores posicionales, se presenta esta información de forma adecuada al codificador Transformer, incluyendo las relaciones espaciales entre los diferentes elementos de la imagen que queremos procesar.

4. El codificador Transformer

Principio de funcionamiento del bloque codificador en un Vision Transformer
Principio de funcionamiento del bloque codificador en un Vision Transformer

Este es el bloque central y el más importante del Vision Transformer. Sus elementos son en esencia los mismos que los del bloque codificador de la red Transformer original, que podemos resumir acá en cuatro elementos clave:

  • Un bloque atencional que se encarga de codificar la relación entre los diferentes elementos que hacen parte de los patches y de la imagen como tal
  • Un bloque residual
  • Una capa lineal combinada con otro bloque residual

Estas cuatro partes en conjunto permiten representar de forma compacta la información relevante proveniente de la imagen. Y, además, toda esta etapa de codificación se repite, por ejemplo, 12 o 16 veces dentro del Vision Transformer.

A la salida de este bloque codificador, en nuestro ejemplo de análisis, ingresaron 9 filas codificadas posicionalmente con 512 elementos y seguiremos teniendo un arreglo de 9 por 512. Sin embargo, la información que obtenemos a la salida del codificador es totalmente diferente: tendremos codificaciones atencionales. Es decir que estos vectores ahora contienen información relevante de las características de la imagen y de las complejas relaciones existentes entre sus diferentes elementos, facilitando enormemente su interpretación para la tarea final de visión.

5. Bloque pooling

Principio de funcionamiento del bloque "pooling" en un Vision Transformer
Principio de funcionamiento del bloque «pooling» en un Vision Transformer

El bloque pooling toma las codificaciones atencionales resultantes (el arreglo de 9×512 del que hablamos hace un momento) y compacta esta información en un arreglo de una sola fila.

¿Y cómo se logra esto? Simplemente promediando el arreglo de 9×512 (las codificaciones atencionales) por sus columnas. Al calcular este promedio por columnas, a la salida obtendremos 512 columnas pero contenidas en una única fila (que será el promedio de las nueve filas anteriores).

Y con esto logramos obtener una representación súper compacta de la imagen de entrada cargada de toda la información atencional.

6. Cabecera de salida

Principio de funcionamiento de la cabecera de salida en un Vision Transformer
Principio de funcionamiento de la cabecera de salida en un Vision Transformer

Con la representación compacta del bloque anterior (1 x 512 en este caso), el último bloque en este Vision Transformer es una cabecera de salida, que no es más que una pequeña Red Neuronal.

El propósito de esta red es que durante el entrenamiento aprenderá a clasificar la imagen de entrada con base en la información de ese vector contenida en ese vector de 1×512. Así, si por ejemplo la imagen de entrada contiene un gato, entonces la cabecera de salida debería arrojar precisamente la categoría «gato».

Muy bien, teniendo claro el principio de funcionamiento del ViT, veamos ahora cómo se lleva a cabo su entrenamiento.

Entrenamiento de un Vision Transformer

Podemos entrenar un Vision Transformer siguiendo la misma lógica que para cualquier Red Neuronal.

Sin embargo, en este caso hay que tener en cuenta que, por tratarse de una arquitectura de Red Transformer, el ViT debe ser entrenado con una cantidad colosal de datos y muchísimas capacidades computacionales. De hecho, los creadores del Vision Transformer utilizaron tres sets de datos fundamentales:

  • ImageNet: con 1.3 millones de imágenes clasificables en 1,000 categorías diferentes
  • ImageNet-21k: con 14 millones de imágenes y 21,000 categorías
  • JFT-300M: el más grande, con 300 millones de imágenes pertenecientes a 18,000 categorías

Es decir que en total este entrenamiento requirió ¡más de 315 millones de imágenes!

Y como resultado de este entrenamiento se crearon tres variantes de modelos pre-entrenados:

  • Vision Transformer Base: el cual tiene 86 millones de parámetros
  • Vision Transformer Large: de tamaño mediano, con 307 millones de parámetros}
  • Vision Transformer Huge: el modelo más grande, con 632 millones de parámetros

Transferencia de aprendizaje (afinación) y su uso práctico

Lo verdaderamente interesante para quienes queremos desarrollar aplicaciones de visión por computador haciendo uso del ViT, es que muchos de estos modelos ya pre-entrenados (Base, Large y Huge) están almacenados y disponibles en repositorios de internet como Hugging Face.

Por lo tanto, podemos aplicar el principio de transferencia de aprendizaje (o afinación) para aprovechar estos modelos en nuestras propias tareas, evitando consumir el gigantesco tiempo de cómputo original.

El proceso de afinación se realiza de la siguiente manera:

  1. Tomamos el modelo pre-entrenado y congelamos todas las capas anteriores a la capa de salida (es decir, la generación de patches, embedding lineal, codificación posicional, codificador y pooling). Al hacer esto evitaremos entrenar la porción del modelo donde se encuentra la mayor parte de los parámetros.
  2. Modificamos la cabecera de salida según la tarea deseada (por ejemplo clasificación). Así, podemos colocar una pequeña red neuronal para clasificación específica o una diseñada para detectar objetos dentro de la imagen.
  3. Le presentamos un set de datos más pequeño y reentrenamos el modelo por unas pocas iteraciones. Dado que las capas pesadas (es decir, aquellas con más parámetros) están congeladas, en última instancia solo estamos entrenando la cabecera de salida que contiene muy pocos parámetros.
La idea básica de la afinación de un Vision Transformer
La idea básica de la afinación de un Vision Transformer

De este modo obtendremos un modelo muy potente, que requerirá menos tiempo y recursos para su afinación y que estará listo para diferentes tareas de visión por computador.

De hecho, si te interesa ver de forma práctica cómo afinar el Vision Transformer así como otros modelos de visión por computador, te invito a darle una mirada al curso Clasificación de Imágenes con Deep Learning, disponible acá en la Academia Online.

Aplicaciones y modelos multimodales

Con este poderoso modelo pre-entrenado y con la afinación, las posibilidades van mucho más allá de simplemente clasificar imágenes.

Si quitamos la capa de salida y le conectamos a la etapa de codificación del Vision Transformer un decodificador (como el de una red Transformer de texto o una red LSTM), podemos desarrollar aplicaciones avanzadas como el image captioning (es decir, generar descripciones en formato de texto a partir de la imagen de entrada) o incluso generar imágenes nuevas.

Además, podemos realizar procesamiento multimodal combinando el Vision Transformer con una red Transformer convencional para texto . Esto nos permitiría introducir una imagen de forma simultánea con una pregunta en texto relacionada, para que el modelo genere la respuesta correspondiente. Este es, de hecho, parte del principio con el que operan modelos avanzados actuales como GPT-4 o Gemini de Google para procesar datos de forma multimodal.

Conclusión

El Vision Transformer es una arquitectura altamente sofisticada que se deriva de las redes Transformer originales, especializándose en la visión por computador al tratar las imágenes como si fuesen secuencias de texto codificadas.

Y como estos modelos se entrenan con sets de datos gigantescos, aprenden a detectar de manera efectiva patrones y a codificar las relaciones entre los diferentes elementos de una imagen.

Afortunadamente, no es necesario entrenar desde cero este tipo de modelos, pues gracias a plataformas como Hugging Face y a la técnica de transferencia de aprendizaje (o afinación), podemos especializar estos modelos para nuestras propias tareas y construir soluciones potentes y multimodales con menos datos y menos iteraciones de entrenamiento.

© Codificando Bits, LLC | Blog | Contacto | Servicios | Acerca de | Políticas

¿Has olvidado la contraseña?
¿Has perdido tu contraseña? Por favor, introduce tu nombre de usuario o dirección de correo electrónico. Recibirás por correo electrónico un enlace para crear una nueva contraseña.
body::-webkit-scrollbar { width: 7px; } body::-webkit-scrollbar-track { border-radius: 10px; background: #f0f0f0; } body::-webkit-scrollbar-thumb { border-radius: 50px; background: #dfdbdb }