Vision Transformer (ViT)
Um Vision Transformer (ViT) divide uma imagem em patches e relaciona-os com autoatenção. Abrange a sua arquitetura, variantes e vantagens e desvantagens em comparação com CNNs.
Um Vision Transformer (ViT) é uma rede neural que aplica a arquitetura de transformer, usada em modelagem de linguagem, a imagens. Ele divide uma imagem em recortes de tamanho fixo, transforma cada recorte em um embedding de token e processa a sequência com autoatenção, permitindo que cada recorte use informações de todos os outros desde a primeira camada. Pesquisadores do Google apresentaram a arquitetura em “Uma imagem vale 16×16 palavras”, demonstrando que um transformer puro, sem camadas de convolução, iguala o desempenho de ponta das redes neurais convolucionais (CNNs) em classificação de imagens quando pré-treinado com dados suficientes. Hoje, os ViTs são usados como codificadores de imagem em modelos de visão e linguagem, modelos fundamentais de segmentação e backbones autossupervisionados.
Como funcionam os Vision Transformers#
Um ViT converte uma imagem em uma sequência e depois a processa como texto. As etapas abaixo usam o ViT-Base/16 em uma imagem de 224×224:
- Embedding de recortes: A imagem é dividida em recortes de 16×16 pixels, formando uma grade de 14×14 com 196 recortes. Cada recorte é achatado e multiplicado por uma matriz aprendida para se tornar um embedding de 768 dimensões, geralmente implementado como uma convolução de 16×16 com stride 16.
- Token de classe e embeddings posicionais: Um token de classe aprendível é acrescentado ao início da sequência, e embeddings posicionais aprendíveis são adicionados a cada token. A atenção, por si só, ignora a ordem, então esses embeddings são a única fonte de informação sobre a origem de cada recorte.
- Codificador transformer: Uma pilha de blocos idênticos — 12 no ViT-Base — alterna entre autoatenção multi-head, que combina informações entre todos os tokens, e uma MLP de duas camadas com ativações GELU, que transforma cada token individualmente. A normalização de camada vem antes de cada subcamada, que é envolvida por uma conexão residual.
- Cabeça: A saída final do token de classe alimenta um classificador linear. Tarefas densas, como segmentação, usam os tokens dos recortes, reorganizados em uma grade de 14×14.
O código em PyTorch abaixo cria a sequência de tokens de uma imagem e a passa por um único bloco de codificador.
import torch
from torch import nn
# Configurações do ViT-Base/16: recortes de 16x16, tokens de 768 dimensões, 12 cabeças de atenção
image = torch.randn(1, 3, 224, 224)
patch_embed = nn.Conv2d(3, 768, kernel_size=16, stride=16) # uma projeção linear por recorte
# Divida a imagem em uma grade de recortes 14x14 e achate-a em 196 tokens
tokens = patch_embed(image).flatten(2).transpose(1, 2)
# Acrescente um token de classe aprendível e adicione embeddings posicionais aprendíveis
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
# Um bloco de codificador pré-normalizado no qual cada token presta atenção a todos os outros
block = nn.TransformerEncoderLayer(
d_model=768, nhead=12, dim_feedforward=3072, activation="gelu", batch_first=True, norm_first=True
)
print(block(tokens).shape)Ele imprime torch.Size([1, 197, 768]): os 196 tokens dos recortes mais o token de classe, cada um ainda com 768 dimensões, prontos para o próximo dos 12 blocos do ViT-Base.
Tamanhos e variantes de modelos#
Os nomes ViT indicam o tamanho do modelo e dos recortes: ViT-B/16 é o modelo Base de 86 milhões de parâmetros com recortes de 16×16, enquanto os modelos Large e Huge têm 307 milhões e 632 milhões de parâmetros. Recortes menores produzem mais tokens, aumentando os detalhes a um custo computacional maior. Várias variantes mudaram o treinamento ou a estrutura dos ViTs:
- DeiT: Uma receita de treinamento com ampliação intensa e um token de destilação, que treina ViTs competitivos apenas com ImageNet-1k, sem dados adicionais de pré-treinamento.
- Swin Transformer: Calcula a atenção em janelas locais deslocadas e combina recortes entre etapas, produzindo uma hierarquia semelhante à de uma CNN, adequada para detecção e segmentação.
- Autoencoders mascarados (MAE) e DINOv2: Métodos autossupervisionados que pré-treinam ViTs com imagens sem rótulos: o MAE reconstrói recortes mascarados, e o DINOv2 corresponde às saídas de uma rede professora.
- CLIP e SigLIP: Codificadores de imagem ViT treinados para associar imagens a suas legendas, amplamente reutilizados como torre visual de modelos multimodais.
Aplicações#
- Modelos de visão e linguagem: Um codificador ViT converte uma imagem em uma sequência de tokens que um grande modelo de linguagem lê junto com o texto, permitindo gerar legendas e responder a perguntas visuais.
- Predição densa: Tokens de recortes de backbones ViT alimentam a segmentação de imagens e a estimativa de profundidade, em que cada pixel de saída precisa de contexto de regiões distantes da imagem.
- Compreensão de vídeo: ViTs de vídeo dividem clipes em recortes espaço-temporais, e modelos de vídeo autossupervisionados, como o V-JEPA, aprendem características de movimento e aparência a partir de vídeos sem rótulos para tarefas como o reconhecimento de ações.
Vision Transformers e CNNs#
As CNNs incorporam duas suposições em cada camada: localidade, porque cada filtro enxerga uma pequena vizinhança, e equivariância à translação, porque o mesmo filtro é aplicado em todas as posições. Além da grade de recortes, um ViT precisa aprender a estrutura espacial a partir dos dados. No artigo original, os ViTs treinados apenas com o ImageNet (1,3 milhão de imagens) ficaram alguns pontos percentuais abaixo de ResNets de tamanho comparável; o pré-treinamento no conjunto de dados JFT-300M, com 300 milhões de imagens, elevou a precisão top-1 do ViT-H/14 no ImageNet a 88,55%. O custo é a outra diferença. A autoatenção compara cada token com todos os outros, então dobrar o comprimento de cada lado da imagem quadruplica a quantidade de tokens e multiplica o custo da atenção por 16. A atenção Flash reduz o tráfego de memória desse cálculo, e a atenção em janelas limita as próprias comparações. A Ultralytics executa o Segment Anything Model da Meta, cujo checkpoint sam_b.pt codifica cada imagem de 1024×1024 com um backbone ViT-B: os recortes de 16×16 formam uma grade de 64×64, com 4.096 tokens, então 8 de seus 12 blocos prestam atenção apenas em janelas de 14×14 e 4 usam atenção global.










