Современные подходы
~30 мин

Vision Transformers (ViT)

Patch embeddings, ViT архитектура, position embeddings, сравнение с CNN по эффективности и качеству.

Vision Transformers — трансформеры покоряют CV

В 2020 году Google Brain опубликовал ViT (Vision Transformer) — и доказал, что трансформеры, изначально созданные для NLP, могут работать с изображениями не хуже (а часто лучше) CNN. Это перевернуло CV: с тех пор трансформерные архитектуры доминируют на бенчмарках классификации, детекции и сегментации.

Архитектура Vision Transformer: разбиение на патчи → linear projection → transformer encoder
Vision Transformer: изображение разбивается на патчи 16×16, каждый патч проецируется в эмбеддинг и подаётся в Transformer encoder

Как ViT видит изображение

Ключевая идея ViT — разбить изображение на патчи (обычно 16×16 пикселей) и подать их как последовательность токенов в стандартный Transformer encoder. Каждый патч проецируется в эмбеддинг фиксированной размерности. Добавляется [CLS] токен для классификации и positional embeddings для кодирования позиции.

  • Patch Embedding — изображение 224×224 → 196 патчей 16×16. Каждый патч → линейная проекция → вектор размерности D (768 для ViT-Base). Это аналог токенизации в NLP.
  • Positional Embeddings — обучаемые (learnable) позиционные эмбеддинги. Без них модель не знает, где расположен каждый патч. В отличие от CNN, ViT не имеет inductive bias про пространственную структуру.
  • [CLS] Token — специальный токен, prepend к последовательности. Его финальное представление используется для классификации (через MLP head).
  • Transformer Encoder — стандартные блоки: Multi-Head Self-Attention (MHSA) + FFN + LayerNorm + Residual connections. ViT-Base: 12 блоков, ViT-Large: 24, ViT-Huge: 32.

Достоинства и ограничения

ViT не имеет inductive bias CNN (locality, translation equivariance). Это и сила, и слабость:

  • Глобальный контекст с первого слоя — self-attention видит все патчи сразу, в отличие от CNN, где receptive field растёт постепенно.
  • Нужно МНОГО данных — оригинальный ViT обучался на JFT-300M (300M изображений). На ImageNet-1K без предобучения ViT уступал ResNet. DeiT решил эту проблему через knowledge distillation и аугментации.
  • Квадратичная сложность — self-attention O(n²) по числу патчей. Для 224×224 это 196 токенов — терпимо. Для 1024×1024 — уже 4096 токенов, что дорого.
  • Масштабируемость — ViT прекрасно масштабируется: больше данных и параметров → стабильный рост качества. Scaling laws работают для ViT так же хорошо, как для LLM.

DeiT — ViT для смертных

DeiT (Data-efficient Image Transformer) от Facebook показал, что ViT можно эффективно обучить на ImageNet-1K (без JFT). Ключевые ингредиенты: сильные аугментации (RandAugment, CutMix, Mixup), Stochastic Depth, knowledge distillation от RegNet. DeiT-Base достиг 81.8% top-1 на ImageNet — на уровне EfficientNet, но без предобучения на огромных данных.

ViT vs CNN — когда что использовать

  • Много данных (>10M) → ViT побеждает. Глобальный контекст + масштабируемость.
  • Мало данных (<100K) → CNN/гибриды лучше. Inductive bias CNN помогает при дефиците данных.
  • Edge / mobile → CNN (MobileNet) или гибриды (EfficientFormer). Чистый ViT слишком тяжёлый.
  • Dense prediction (detection, segmentation) → гибриды (Swin, ViTDet). Чистый ViT не имеет иерархии feature maps.
  • Практика: в 2024+ большинство SOTA моделей — гибриды или чистые трансформеры. Знание ViT обязательно.

🎯 На собеседовании

Частые вопросы

Как ViT обрабатывает изображение? Разбивает на патчи → линейная проекция → positional embeddings → Transformer encoder → [CLS] token → MLP head. • Почему ViT нужно больше данных чем CNN? Нет inductive bias (locality, translation equivariance). CNN "знает" что соседние пиксели связаны. ViT учит это из данных. • Какая сложность self-attention в ViT? O(n²) по числу патчей. Для 224×224 с патчами 16×16: n=196, это ~38K пар. Для высокого разрешения — проблема. • Чем DeiT отличается от ViT? DeiT обучается на ImageNet-1K (не JFT-300M) через сильные аугментации и knowledge distillation.