Deformable Attention
Деформируемое внимание позволяет каждому запросу учитывать несколько обучаемых точек выборки вокруг опорной позиции, а не каждую позицию на карте признаков.
Деформируемое внимание — это механизм внимания для компьютерного зрения, при котором каждый запрос обращается к небольшому фиксированному количеству точек выборки вокруг опорной позиции, а не ко всем позициям карты признаков. Сам запрос предсказывает положение этих точек — как смещения относительно опорной позиции — и вес каждой из них, поэтому вычислительные затраты растут с количеством запросов и точек, а не с разрешением изображения. Xizhou Zhu, Jifeng Dai и их коллеги из SenseTime, Университета науки и технологий Китая и Китайского университета Гонконга представили этот метод в Deformable DETR, статье, удостоенной устного доклада на ICLR 2021. Метод устранил два недостатка исходного детекционного Transformer DETR: полное внимание ограничивало его низким разрешением признаков, а обучение занимало 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 из 4096 позиций. Во время обучения корректируются слои смещений и весов, поэтому точки перемещаются к тем частям изображения, которые важны для задачи.
Деформируемое внимание с несколькими масштабами#
Объекты бывают очень разного размера, поэтому Deformable DETR одновременно выбирает точки на нескольких картах признаков. При L уровнях каждая голова берёт K точек на каждом уровне и нормализует веса сразу по всем L × K точкам. Так за один шаг объединяются признаки высокого и низкого разрешения; в энкодере это заменило пирамиду признаков (FPN). В энкодере этот механизм применяется как самовнимание, где запросом служит каждый пиксель каждого уровня, а в декодере — как перекрёстное внимание между запросами объектов и признаками изображения.
RT-DETR — трансформер для детекции в реальном времени от Baidu, доступный в пакете Ultralytics, — использует деформируемое внимание с несколькими масштабами в качестве перекрёстного внимания шести слоёв декодера: каждый из 300 запросов объектов выбирает по 4 точки на каждой из 8 голов на картах признаков с шагом 8, 16 и 32 — всего 96 позиций. Для полного перекрёстного внимания к этим картам изображения размером 640 пикселей пришлось бы оценить 8400 позиций.
Применение#
- Обнаружение объектов: преемники Deformable DETR, включая DINO и RT-DETR, сохраняют деформируемое перекрёстное внимание в декодерах, что позволяет им считывать признаки высокого разрешения для мелких объектов.
- Автономные автомобили: BEVFormer преобразует изображения с нескольких автомобильных камер в сетку вида сверху, где каждая ячейка выбирает деформируемые точки на тех изображениях с камер, на которых она видна.
- Паноптическая сегментация: Mask2Former формирует многомасштабные пиксельные признаки с помощью деформируемого внимания, а затем предсказывает маски.
Деформируемое внимание и смежные понятия#
- Внимание со скользящим окном: обращается к фиксированному соседству, заданному положением и одинаковому для каждого входного примера.
- Разреженное внимание: оценивает заранее выбранное фиксированное подмножество пар токенов.
- Flash Attention: ускоряет обычное плотное внимание, разбивая вычисления на блоки во внутрикристальной памяти GPU, и даёт тот же результат, что и стандартное внимание.
- Внимание визуального трансформера (ViT): сравнивает каждый фрагмент изображения со всеми остальными, поэтому вычислительные затраты растут пропорционально квадрату количества фрагментов.










