39 Vision Transformer
Контекст
В зрении царили CNN, Transformer покорил NLP. Досовицкий и др. приносят чистый Transformer в зрение.
Идея и механизм
Режем изображение на патчи 16×16, каждый линейно проецируем в вектор (как эмбеддинг токена-слова), добавляем позиционные эмбеддинги и class-токен, и подаём последовательность патчей в стандартный трансформер-энкодер. Никаких свёрток. Self-attention даёт глобальный контекст уже с первого слоя.
линейная алгебра Патчи как токены — и почему нужны данные
Картинку H×W×C режут на N = HW/P² патчей P×P. Каждый патч вытягивают в вектор P²C и линейно проецируют в размерность d; добавляют позиционные эмбеддинги:
Дальше — обычный энкодер-трансформер. Ключевой нюанс: у свёртки зашиты локальность и трансляционная эквивариантность (сильные априорные предположения об изображениях). У ViT их НЕТ — он должен выучить их из данных. Поэтому на средних наборах ViT уступает CNN, и обгоняет только при предобучении на очень больших данных (JFT-300M): масштаб данных заменяет индуктивные смещения. Это формулировка фундаментального размена «встроенные предположения vs выучить из данных».
PyTorch Патчификация и линейный эмбеддинг
import torch
# картинку (C,H,W) режем на патчи P×P и линейно эмбеддим
def patchify(x, P, E): # E: (P*P*C, d)
C, H, W = x.shape
p = x.unfold(1, P, P).unfold(2, P, P) # (C, H/P, W/P, P, P)
p = p.permute(1, 2, 0, 3, 4).reshape(-1, C * P * P)
return p @ E # (N, d) — токены-патчи
Почему это важно
Показал универсальность Transformer (одна архитектура для текста и зрения), открыл дорогу мультимодальным моделям (CLIP, мультимодальные LLM). И заострил спор «встроенные смещения vs масштаб данных», который проходит через весь современный ML.
Связи
ViT — это буквально энкодер-трансформер, которому вместо слов скармливают патчи. Никаких новых механизмов: вся сила берётся из self-attention, перенесённого из NLP в зрение без изменений.
Полюса одного спора. CNN знает про локальность с рождения (свёртка), ViT выучивает её — но только на больших данных. На малых данных встроенные смещения CNN выигрывают; на больших — гибкость ViT.
Единая трансформер-архитектура для зрения и языка — необходимое условие мультимодальности. CLIP связывает визуальный и текстовый энкодеры, и трансформер-зрение (как ViT) — естественный визуальный backbone для этого.
Вопросы пытливого ума
Если ViT нужен огромный датасет, в чём тогда его практический смысл?
В переносе. Предобучив ViT один раз на гигантских данных, его дообучают на маленьких целевых наборах — и там он отлично работает. Плюс гибридные/улучшенные варианты (DeiT с дистилляцией, Swin с локальными окнами) снижают аппетит к данным, частично возвращая индуктивные смещения. Так что «нужны данные» — про предобучение, а не про каждое применение.
Что ViT «теряет», отказавшись от свёрток?
Гарантированную трансляционную эквивариантность и эффективность на малых данных — то, что свёртка даёт бесплатно. Взамен получает глобальный контекст с первого слоя и гибкость без жёстких предположений. Это не «лучше/хуже», а другой компромисс: априорные знания (CNN) против выучивания всего из данных (ViT).
Почему именно патчи 16×16, а не пиксели по одному?
Self-attention стоит O(N²) по числу токенов. Картинка 224×224 — это ~50k пикселей; attention на них неподъёмен. Патчи 16×16 дают всего ~196 токенов — вычислимо, и заодно каждый токен несёт локальный кусочек структуры. Это инженерный компромисс между разрешением и стоимостью внимания.
Что читать в оригинале
Читать ключевое — patch embedding и вывод «нужны большие данные»; transfer-таблицы пролистать.