Deformable Attention
L'attenzione deformabile consente a ogni query di prestare attenzione a pochi punti di campionamento appresi attorno a una posizione di riferimento, anziché a ogni posizione di una mappa delle caratteristiche.
L'attenzione deformabile è un meccanismo di attenzione per la visione artificiale in cui ogni query presta attenzione a un numero ridotto e fisso di punti di campionamento attorno a una posizione di riferimento, invece che a ogni posizione di una mappa delle caratteristiche. La query prevede la posizione di questi punti come offset rispetto al riferimento e il peso da assegnare a ciascuno, quindi il costo cresce in base al numero di query e di punti, non alla risoluzione dell'immagine. Xizhou Zhu, Jifeng Dai e i colleghi di SenseTime, della University of Science and Technology of China e della Chinese University of Hong Kong l'hanno introdotta in Deformable DETR, un articolo presentato oralmente a ICLR 2021. Il metodo ha risolto i due punti deboli del Transformer di rilevamento DETR originale: l'attenzione completa lo limitava a caratteristiche a bassa risoluzione e l'addestramento richiedeva 500 epoche. Deformable DETR ha richiesto 10 volte meno epoche e ha rilevato meglio gli oggetti piccoli.
Come funziona l'attenzione deformabile#
L'idea estende la convoluzione deformabile, sviluppata anche da Dai, che apprende gli offset delle posizioni del kernel convoluzionale. Per ogni query con un punto di riferimento, ciascuna testa di attenzione applica due livelli lineari alle caratteristiche della query: uno prevede K offset di campionamento e l'altro K pesi di attenzione, normalizzati con una softmax. Le caratteristiche dei valori in ciascun punto spostato vengono lette tramite interpolazione bilineare, poiché gli offset sono frazionari, e la testa ne restituisce la somma ponderata. Il paper usa 8 teste e K = 4 punti, quindi ogni query legge 32 posizioni per mappa delle caratteristiche, mentre la self-attention standard assegnerebbe un punteggio a ogni pixel. Una versione a testa singola e scala singola può essere implementata in poche righe di PyTorch:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
dim, n_points, n_queries = 32, 4, 100
value = torch.randn(1, dim, 64, 64) # a 64x64 feature map: 4,096 positions
query = torch.randn(n_queries, dim)
ref = torch.rand(n_queries, 2) * 2 - 1 # reference points in grid_sample's [-1, 1] coordinates
# Each query predicts where to look (offsets) and how much each sample counts (weights)
to_offsets, to_weights = torch.nn.Linear(dim, n_points * 2), torch.nn.Linear(dim, n_points)
offsets = 0.1 * to_offsets(query).view(n_queries, n_points, 2)
weights = to_weights(query).softmax(dim=-1)
# Bilinearly sample the value map at reference + offset, then take the weighted sum
grid = (ref[:, None] + offsets)[None] # (1, n_queries, n_points, 2)
sampled = F.grid_sample(value, grid, align_corners=False)[0] # (dim, n_queries, n_points)
out = (sampled * weights).sum(dim=-1).T # (n_queries, dim)
print(f"Output {tuple(out.shape)} from {n_queries * n_points} samples, not {n_queries * 64 * 64:,} dense scores")Stampa Output (100, 32) from 400 samples, not 409,600 dense scores: ciascuna delle 100 query legge 4 delle 4.096 posizioni. L'addestramento modifica i livelli degli offset e dei pesi, così i punti si spostano verso le parti dell'immagine utili per il task.
Attenzione deformabile multiscala#
Gli oggetti hanno dimensioni molto diverse, quindi Deformable DETR campiona punti contemporaneamente su più mappe delle caratteristiche. Con L livelli, ogni testa prende K punti per livello e normalizza insieme i pesi su tutti gli L × K punti; in un solo passaggio combina così caratteristiche fini e grossolane, sostituendo la rete piramidale delle caratteristiche (FPN) del suo encoder. L'encoder la applica come self-attention, usando ogni pixel di ogni livello come query, mentre il decoder la applica come cross-attention dalle query degli oggetti alle caratteristiche dell'immagine.
RT-DETR, il Transformer di rilevamento in tempo reale di Baidu disponibile nel pacchetto Ultralytics, usa l'attenzione deformabile multiscala come cross-attention nei suoi sei livelli del decoder: ciascuna delle 300 query degli oggetti campiona 4 punti per testa in 8 teste sulle mappe delle caratteristiche stride-8, stride-16 e stride-32, per un totale di 96 posizioni; la cross-attention completa su quelle mappe di un'immagine da 640 pixel assegnerebbe invece un punteggio a 8.400 posizioni.
Applicazioni#
- Rilevamento degli oggetti: i successori di Deformable DETR, tra cui DINO e RT-DETR, mantengono la cross-attention deformabile nei decoder, che consente loro di leggere caratteristiche ad alta risoluzione per gli oggetti piccoli.
- Veicoli autonomi: BEVFormer proietta le immagini di più telecamere dell'auto in una griglia con vista dall'alto; ogni cella della griglia campiona punti deformabili nelle viste delle telecamere che la inquadrano.
- Segmentazione panottica: Mask2Former crea le proprie caratteristiche pixel multiscala con l'attenzione deformabile prima di prevedere le maschere.
Attenzione deformabile e concetti correlati#
- Attenzione a finestra scorrevole: presta attenzione a un insieme fisso di elementi vicini determinato dalla posizione, identico per ogni input.
- Attenzione sparsa: assegna punteggi a un sottoinsieme fisso di coppie di token selezionato in anticipo.
- FlashAttention: calcola più rapidamente l'attenzione densa ordinaria suddividendola in blocchi nella memoria GPU integrata, con lo stesso risultato dell'attenzione standard.
- Attenzione dei Transformer per la visione (ViT): confronta ogni patch dell'immagine con tutte le altre, quindi il costo cresce con il quadrato del numero di patch.










