Deformable Attention
可变形注意力让每个查询关注参考位置周围少量经过学习的采样点,而非特征图中的所有位置。
可变形注意力是一种用于计算机视觉的注意力机制:每个查询只关注参考位置周围固定数量的采样点,而不是特征图上的所有位置。查询本身会预测这些点相对于参考位置的偏移量,以及每个点的权重,因此计算成本随查询和采样点数量增长,而不随图像分辨率增长。SenseTime、中国科学技术大学和香港中文大学的 Xizhou Zhu、Jifeng Dai 等人提出了这项技术,并发表了论文 Deformable DETR,该论文入选 ICLR 2021 口头报告。它解决了原始 DETR 检测Transformer的两个缺点:完整注意力将其限制在低分辨率特征上,而训练需要 500 个轮次。Deformable DETR 所需轮次减少了 10 倍,并且对小目标的检测效果更好。
可变形注意力的工作原理#
这一思路扩展自可变形卷积,Dai 也参与了该技术的开发;可变形卷积会学习卷积核采样点的偏移量。对于具有参考点的每个查询,每个注意力头都会对查询特征应用两个线性层:一个预测 K 个采样偏移量,另一个预测 K 个注意力权重,并通过 softmax 进行归一化。由于偏移量可能是小数,因此会使用双线性插值读取每个偏移点上的值特征,随后注意力头返回这些特征的加权和。论文使用 8 个头和 K = 4 个采样点,因此每个查询在每张特征图上读取 32 个位置,而标准自注意力会为每个像素计算分数。下面用几行 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")它会打印 Output (100, 32) from 400 samples, not 409,600 dense scores:100 个查询中的每个查询都会读取 4,096 个位置中的 4 个。训练会调整偏移量层和权重层,使采样点逐渐移向有助于完成任务的图像区域。
多尺度可变形注意力#
对象的大小差异很大,因此 Deformable DETR 会同时在多张特征图上采样点。对于 L 个层级,每个注意力头都会在每个层级上选取 K 个点,并对全部 L × K 个点的权重统一归一化,从而一步混合细粒度与粗粒度特征,并在其编码器中取代了特征金字塔网络(FPN)。编码器会将其用作自注意力,把每个层级的每个像素都作为查询;解码器则会将其用作交叉注意力,让对象查询关注图像特征。
RT-DETR是百度推出、可在 Ultralytics 软件包中使用的实时检测 Transformer,它将多尺度可变形注意力用作六个解码器层中的交叉注意力:300 个对象查询中的每一个都会在步幅为 8、16 和 32 的特征图上,通过 8 个头分别采样 4 个点,总计 96 个位置;而对于 640 像素图像,这些特征图上的完整交叉注意力需要为 8,400 个位置计算分数。
应用场景#
- 目标检测:包括 DINO 和 RT-DETR 在内的 Deformable DETR 后续模型,在解码器中保留了可变形交叉注意力,使它们能够读取小目标所需的高分辨率特征。
- 自动驾驶汽车:BEVFormer 会将多个车载摄像头的图像投影到鸟瞰视角网格中,每个网格单元都会在能够看到该单元的摄像头视图中采样可变形点。
- 全景分割:Mask2Former 会先使用可变形注意力构建多尺度像素特征,然后再预测掩码。
可变形注意力与相关术语的区别#
- 滑动窗口注意力:关注由位置决定的固定邻域,对每个输入都相同。
- 稀疏注意力:为预先选定的固定词元位置对计算分数。
- Flash attention:通过在 GPU 片上内存中分块处理,加速常规密集注意力计算,结果与标准注意力相同。
- 视觉 Transformer(ViT)注意力:比较每个图像块与其他所有图像块,因此计算成本随图像块数量的平方增长。










