Vision Transformer (ViT)
Un Vision Transformer (ViT) suddivide un'immagine in patch e le mette in relazione con l'attenzione di sé. Panoramica dell'architettura, delle varianti e dei compromessi rispetto alle CNN.
Un Transformer per la visione (ViT) è una rete neurale che applica alle immagini l'architettura transformer sviluppata per la modellazione del linguaggio. Suddivide un'immagine in patch di dimensioni fisse, trasforma ogni patch in un embedding di token ed elabora la sequenza con l'autoattenzione, così che ogni patch possa attingere alle informazioni di tutte le altre fin dal primo strato. I ricercatori di Google hanno introdotto l'architettura nel lavoro "An Image is Worth 16x16 Words", dimostrando che un transformer puro, privo di strati di convoluzione, eguaglia le prestazioni delle reti neurali convoluzionali (CNNs) più avanzate nella classificazione delle immagini quando viene preaddestrato con dati sufficienti. Oggi i ViT fungono da encoder di immagini per i modelli di visione e linguaggio, i modelli fondazionali per la segmentazione e i backbone autosupervisionati.
Come funzionano i Vision Transformer#
Un ViT trasforma un'immagine in una sequenza e la elabora come testo. I passaggi seguenti usano ViT-Base/16 su un'immagine da 224×224:
- Embedding delle patch: l'immagine viene suddivisa in patch da 16×16 pixel, formando una griglia 14×14 di 196 patch. Ogni patch viene appiattita e moltiplicata per una matrice appresa per ottenere un embedding a 768 dimensioni, generalmente implementato come una convoluzione 16×16 con stride 16.
- Token di classe ed embedding posizionali: un token di classe apprendibile viene anteposto alla sequenza e a ogni token vengono aggiunti embedding posizionali apprendibili. L'attenzione da sola ignora l'ordine, quindi questi embedding sono l'unica fonte di informazioni sulla posizione da cui proviene ciascuna patch.
- Encoder Transformer: una serie di blocchi identici — 12 in ViT-Base — alterna la self-attention multi-head, che mescola le informazioni tra tutti i token, a un MLP a due strati con attivazioni GELU, che trasforma separatamente ciascun token. La normalizzazione degli strati precede ogni sottostrato, avvolto da una connessione residua.
- Head: l'output finale del token di classe alimenta un classificatore lineare. Nei compiti densi, come la segmentazione, si usano invece i token delle patch, rimodellati in una griglia 14×14.
Il codice PyTorch seguente crea la sequenza di token di una singola immagine e la passa attraverso un unico blocco encoder.
import torch
from torch import nn
# Impostazioni ViT-Base/16: patch 16x16, token a 768 dimensioni, 12 head di attenzione
image = torch.randn(1, 3, 224, 224)
patch_embed = nn.Conv2d(3, 768, kernel_size=16, stride=16) # una proiezione lineare per patch
# Suddividi l'immagine in una griglia 14x14 di patch e appiattiscila in 196 token
tokens = patch_embed(image).flatten(2).transpose(1, 2)
# Anteponi un token di classe apprendibile e aggiungi embedding posizionali apprendibili
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 blocco encoder pre-norm in cui ogni token presta attenzione a tutti gli altri
block = nn.TransformerEncoderLayer(
d_model=768, nhead=12, dim_feedforward=3072, activation="gelu", batch_first=True, norm_first=True
)
print(block(tokens).shape)Stampa torch.Size([1, 197, 768]): i 196 token delle patch più il token di classe, tutti ancora a 768 dimensioni, pronti per il successivo dei 12 blocchi di ViT-Base.
Dimensioni e varianti dei modelli#
I nomi ViT indicano le dimensioni del modello e quelle delle patch: ViT-B/16 è il modello Base da 86 milioni di parametri con patch 16×16; i modelli Large e Huge hanno rispettivamente 307 milioni e 632 milioni di parametri. Patch più piccole producono più token, migliorando i dettagli a un costo computazionale più elevato. Diverse varianti hanno modificato l'addestramento o la struttura dei ViT:
- DeiT: una ricetta di addestramento con aumentazione intensa e un token di distillazione, che permette di addestrare ViT competitivi con il solo ImageNet-1k, senza dati aggiuntivi di preaddestramento.
- Swin Transformer: calcola l'attenzione all'interno di finestre locali sfalsate e unisce le patch tra le varie fasi, producendo una gerarchia simile a quella delle CNN adatta al rilevamento e alla segmentazione.
- Autoencoder mascherati (MAE) e DINOv2: metodi autosupervisionati che preaddestrano i ViT su immagini senza etichette, ricostruendo le patch mascherate nel caso di MAE e facendo corrispondere gli output di una rete insegnante nel caso di DINOv2.
- CLIP e SigLIP: encoder di immagini ViT addestrati ad associare le immagini alle rispettive didascalie, ampiamente riutilizzati come componente visiva dei modelli multimodali.
Applicazioni#
- Modelli visione-linguaggio: un encoder ViT converte un'immagine in una sequenza di token che un modello linguistico di grandi dimensioni legge insieme al testo, abilitando la generazione di didascalie e la risposta a domande visive.
- Previsione densa: i token delle patch dei backbone ViT alimentano la segmentazione delle immagini e la stima della profondità, compiti in cui ogni pixel di output ha bisogno del contesto di aree distanti dell'immagine.
- Comprensione dei video: i ViT per video suddividono i filmati in patch spazio-temporali e i modelli video autosupervisionati come V-JEPA apprendono caratteristiche di movimento e aspetto da filmati senza etichette, per compiti come il riconoscimento delle azioni.
Vision Transformer e CNN#
Le CNN incorporano due presupposti in ogni strato: la località, perché ogni filtro osserva un piccolo intorno, e l'equivarianza alla traslazione, perché lo stesso filtro viene applicato in ogni posizione. A parte la griglia delle patch, un ViT deve apprendere dai dati la struttura spaziale. Nell'articolo originale, i ViT addestrati solo su ImageNet — 1,3 milioni di immagini — hanno ottenuto punteggi inferiori di alcuni punti percentuali rispetto ai ResNet di dimensioni comparabili; il preaddestramento sul dataset JFT-300M da 300 milioni di immagini ha portato ViT-H/14 all'88,55% di accuratezza top-1 su ImageNet. L'altro fattore distintivo è il costo. La self-attention confronta ogni token con tutti gli altri, quindi raddoppiare la lunghezza di un lato dell'immagine quadruplica il numero di token e moltiplica per 16 il costo dell'attenzione. Flash attention riduce il traffico di memoria di questo calcolo, mentre l'attenzione a finestre limita i confronti stessi. Ultralytics esegue il Segment Anything Model di Meta, il cui checkpoint sam_b.pt codifica ogni immagine 1024×1024 con un backbone ViT-B: le patch 16×16 formano una griglia 64×64 di 4.096 token, perciò 8 dei suoi 12 blocchi applicano l'attenzione solo all'interno di finestre 14×14 e 4 usano l'attenzione globale.










