Эпоха 5 · Эра LLM · 2020

39 Vision Transformer

An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale · Dosovitskiy и др. · Google · ICLR 2021
🟧 оригинал выборочно~1.5 чоригинал ↗
Суть за 20 секунд. Чистый Transformer на последовательности патчей изображения (без свёрток) бьёт CNN — но только при достаточном предобучении. На средних данных уступает: у него нет встроенных индуктивных смещений свёрток, и их заменяет масштаб данных.

Контекст

В зрении царили CNN, Transformer покорил NLP. Досовицкий и др. приносят чистый Transformer в зрение.

Идея и механизм

Режем изображение на патчи 16×16, каждый линейно проецируем в вектор (как эмбеддинг токена-слова), добавляем позиционные эмбеддинги и class-токен, и подаём последовательность патчей в стандартный трансформер-энкодер. Никаких свёрток. Self-attention даёт глобальный контекст уже с первого слоя.

линейная алгебра Патчи как токены — и почему нужны данные

Картинку H×W×C режут на N = HW/P² патчей P×P. Каждый патч вытягивают в вектор P²C и линейно проецируют в размерность d; добавляют позиционные эмбеддинги:

z0 = [xclass; xp1E; …; xpNE] + Epos

Дальше — обычный энкодер-трансформер. Ключевой нюанс: у свёртки зашиты локальность и трансляционная эквивариантность (сильные априорные предположения об изображениях). У 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) — токены-патчи
патчи 16×16 токены Transformer класс
Изображение превращается в последовательность патчей-токенов и подаётся в обычный трансформер — как предложение из слов.
Аналогия. Читать картину не «глазами художника» (который знает про края и формы — это CNN с её встроенными правилами), а как текст из плиток-патчей, в котором правила композиции нужно вывести самому. Это сложнее и требует «прочитать» гораздо больше картин (огромные данные), но зато не ограничивает модель чужими предположениями о том, как устроено зрение.

Почему это важно

Показал универсальность Transformer (одна архитектура для текста и зрения), открыл дорогу мультимодальным моделям (CLIP, мультимодальные LLM). И заострил спор «встроенные смещения vs масштаб данных», который проходит через весь современный ML.

Связи

← опирается на32. Transformer

ViT — это буквально энкодер-трансформер, которому вместо слов скармливают патчи. Никаких новых механизмов: вся сила берётся из self-attention, перенесённого из NLP в зрение без изменений.

↔ контраст9. LeNet / CNN

Полюса одного спора. CNN знает про локальность с рождения (свёртка), ViT выучивает её — но только на больших данных. На малых данных встроенные смещения CNN выигрывают; на больших — гибкость ViT.

→ ведёт к40. CLIP

Единая трансформер-архитектура для зрения и языка — необходимое условие мультимодальности. 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-таблицы пролистать.