Vision Transformer (ViT)
Un Vision Transformer (ViT) divide una imagen en parches y los relaciona mediante autoatención. Explica su arquitectura, variantes y ventajas e inconvenientes frente a las CNN.
Un Vision Transformer (ViT) es una red neuronal que aplica a las imágenes la arquitectura Transformer del modelado del lenguaje. Divide una imagen en parches de tamaño fijo, convierte cada parche en un embedding de token y procesa la secuencia mediante autoatención, de modo que cada parche puede utilizar la información de los demás desde la primera capa. Investigadores de Google presentaron la arquitectura en «An Image is Worth 16x16 Words», donde demostraron que un Transformer puro, sin capas de convolución, iguala a las redes neuronales convolucionales (CNN) de vanguardia en clasificación de imágenes si se preentrena con suficientes datos. Actualmente, los ViT se utilizan como codificadores de imagen en modelos de visión y lenguaje, modelos fundacionales de segmentación y redes troncales autosupervisadas.
Cómo funcionan los Transformers visuales#
Un ViT convierte una imagen en una secuencia y luego la procesa como si fuera texto. Los pasos siguientes utilizan ViT-Base/16 con una imagen de 224×224:
- Embedding de parches: La imagen se divide en parches de 16×16 píxeles, formando una cuadrícula de 14×14 con 196 parches. Cada parche se aplana y se multiplica por una matriz aprendida para convertirse en un embedding de 768 dimensiones, que normalmente se implementa como una convolución 16×16 con stride 16.
- Token de clase y embeddings de posición: Se antepone a la secuencia un token de clase aprendible y se añaden embeddings de posición aprendibles a cada token. La atención por sí sola ignora el orden, por lo que estos embeddings son la única fuente de información sobre la ubicación original de cada parche.
- Codificador Transformer: Una pila de bloques idénticos —12 en ViT-Base— alterna entre la autoatención multi-cabeza, que combina información de todos los tokens, y un perceptrón multicapa de dos capas que utiliza activaciones GELU y transforma cada token por separado. La normalización de capas precede a cada subcapa, que está rodeada por una conexión residual.
- Cabezal: La salida final del token de clase alimenta un clasificador lineal. En las tareas densas, como la segmentación, se utilizan en su lugar los tokens de parche, que se reorganizan en una cuadrícula de 14×14.
El código de PyTorch siguiente crea la secuencia de tokens de una imagen y la pasa por un único bloque codificador.
import torch
from torch import nn
# Configuración de ViT-Base/16: parches de 16x16, tokens de 768 dimensiones, 12 cabezas de atención
image = torch.randn(1, 3, 224, 224)
patch_embed = nn.Conv2d(3, 768, kernel_size=16, stride=16) # una proyección lineal por parche
# Divide la imagen en una cuadrícula de parches de 14x14 y aplánala en 196 tokens
tokens = patch_embed(image).flatten(2).transpose(1, 2)
# Anteponer un token de clase aprendible y añadir embeddings de posición aprendibles
cls_token = nn.Parameter(torch.zeros(1, 1, 768))
pos_embed = nn.Parameter(torch.zeros(1, 197, 768))
tokens = torch.cat([cls_token, tokens], dim=1) + pos_embed
# Un bloque codificador con prenormalización en el que cada token presta atención a todos los demás
block = nn.TransformerEncoderLayer(
d_model=768, nhead=12, dim_feedforward=3072, activation="gelu", batch_first=True, norm_first=True
)
print(block(tokens).shape)Muestra torch.Size([1, 197, 768]): los 196 tokens de parche más el token de clase, todos con 768 dimensiones, listos para el siguiente de los 12 bloques de ViT-Base.
Tamaños y variantes de modelos#
Los nombres ViT indican el tamaño del modelo y el de los parches: ViT-B/16 es el modelo Base, con 86 millones de parámetros y parches de 16×16, mientras que los modelos Large y Huge tienen 307 y 632 millones de parámetros. Los parches más pequeños generan más tokens, lo que mejora el detalle a un mayor coste computacional. Varias variantes modifican el entrenamiento o la estructura de los ViT:
- DeiT: Una receta de entrenamiento con una intensa aumentación y un token de destilación que permite entrenar ViT competitivos solo con ImageNet-1k, sin datos adicionales de preentrenamiento.
- Swin Transformer: Calcula la atención dentro de ventanas locales desplazadas y combina los parches entre etapas, generando una jerarquía similar a la de las CNN, adecuada para la detección y la segmentación.
- Autoencoders enmascarados (MAE) y DINOv2: Métodos autosupervisados que preentrenan ViT con imágenes sin etiquetar: MAE reconstruye los parches enmascarados y DINOv2 compara las salidas de una red profesora.
- CLIP y SigLIP: Codificadores de imagen ViT entrenados para asociar imágenes con sus pies de foto, reutilizados ampliamente como torre visual de modelos multimodales.
Aplicaciones#
- Modelos de visión y lenguaje: Un codificador ViT convierte una imagen en una secuencia de tokens que un gran modelo de lenguaje lee junto con el texto, lo que permite generar descripciones y responder preguntas visuales.
- Predicción densa: Los tokens de parche de las redes troncales ViT impulsan la segmentación de imágenes y la estimación de profundidad, tareas en las que cada píxel de salida necesita contexto de zonas lejanas de la imagen.
- Comprensión de vídeo: Los ViT de vídeo dividen los clips en parches espaciotemporales, y los modelos de vídeo autosupervisados, como V-JEPA, aprenden características de movimiento y apariencia a partir de vídeos sin etiquetar para tareas como el reconocimiento de acciones.
Transformers visuales y CNNs#
Las CNN incorporan dos suposiciones en cada capa: localidad, porque cada filtro observa un vecindario pequeño, y equivariancia traslacional, porque el mismo filtro se aplica en todas las posiciones. Salvo por la cuadrícula de parches, un ViT debe aprender la estructura espacial a partir de los datos. En el artículo original, los ViT entrenados solo con ImageNet —1,3 millones de imágenes— obtuvieron puntuaciones unos pocos puntos porcentuales inferiores a las de las ResNet de tamaño comparable, mientras que el preentrenamiento con el conjunto de datos JFT-300M, de 300 millones de imágenes, elevó ViT-H/14 al 88,55 % de precisión top-1 en ImageNet. El coste es la otra diferencia. La autoatención compara cada token con todos los demás, así que duplicar la longitud de un lado de la imagen cuadruplica el número de tokens y multiplica por 16 el coste de la atención. La atención Flash reduce el tráfico de memoria de este cálculo, y la atención por ventanas limita las comparaciones. Ultralytics ejecuta el Segment Anything Model de Meta, cuyo punto de control sam_b.pt codifica cada imagen de 1024×1024 con una red troncal ViT-B: los parches de 16×16 forman una cuadrícula de 64×64 con 4096 tokens, así que ocho de sus 12 bloques prestan atención únicamente dentro de ventanas de 14×14 y cuatro utilizan atención global.










