Krok 1 — Patchowanie: obraz H × W × C dzielony na N patchy P × P (np. 224 × 224 → 14 × 14 = 196 patchy po 16 × 16). Implementacyjnie realizowane jako konwolucja Conv2d(in=C, out=d_model, kernel=P, stride=P) — efektywne na GPU. Krok 2 — Patch embedding: każdy patch (P²·C wymiarów) liniowo rzutowany na d_model. Krok 3 — Token [CLS]: uczony wektor d_model doklejany na początek sekwencji jako token klasyfikacyjny (analogicznie do BERT). Krok 4 — Pozycyjny embedding: uczony wektor pozycji 1D (długość N+1) dodawany do każdego tokenu, by nieść informację przestrzenną (sama self-attention jest permutacyjnie niezmiennicza). Krok 5 — Stos enkodera Transformer: L warstw, każda z LayerNorm → Multi-Head Self-Attention → residual → LayerNorm → FFN (gelu) → residual. ViT używa pre-norm (LN przed atencją). Krok 6 — Klasyfikacja: ostatnia reprezentacja tokenu [CLS] przechodzi przez głowicę MLP / linear → softmax po klasach. W treningu standardowym używa się supervised cross-entropy; w nowoczesnych wariantach pretraining może być masked image modeling (MAE), kontrastywny (CLIP/DINO) lub self-distillation (DINOv2). Inferencja na nowej rozdzielczości wymaga interpolacji pozycyjnych embeddingów.
Jak osiągnąć stan-of-the-art w klasyfikacji obrazów bez polegania na ręcznie zaprojektowanych indukcyjnych uprzedzeniach konwolucji (lokalność, translation equivariance, hierarchia pól receptywnych), oraz jak ujednolicić architekturę między NLP i wizją, otwierając drogę do multimodalnych modeli z jednym backbone.
Podział obrazu na N niezachodzących patchy P × P i ich liniowa projekcja na wymiar d_model. Implementowana zwykle jako Conv2d(C, d_model, kernel=P, stride=P).
Oficjalna
Uczony wektor d_model doklejany na początek sekwencji. Jego reprezentacja z ostatniej warstwy używana jest jako globalny deskryptor obrazu do klasyfikacji.
Oficjalna
Uczony tensor [N+1, d_model] dodawany do tokenów, bo self-attention jest permutacyjnie niezmiennicza i sama nie zna pozycji patchy w obrazie.
Oficjalna
L warstw — każda: LN → MHSA → residual → LN → FFN(GELU) → residual. Identyczne jak w BERT/GPT, bez maski przyczynowej (wszyscy-do-wszystkich).
MLP lub liniowa warstwa rzutująca reprezentację [CLS] na logity klas. W self-supervised pretrainingu zastępowana przez projection head (np. DINO MLP).
Oficjalna
Trening ViT od zera na ImageNet-1k daje gorsze accuracy niż ResNet — brak indukcyjnych uprzedzeń konwolucji wymaga znacznie więcej danych.
Uczone 1D positional embeddings są specyficzne dla pretreningowego N. Fine-tuning na 384×384 po pretrainingu na 224×224 wymaga interpolacji 2D, inaczej model traci wydajność.
Dla zadań gęstych (segmentacja, detekcja) potrzebne są wysokie rozdzielczości; standardowy ViT skaluje się O(N²) w liczbie patchy.
CNN naturalnie buduje hierarchię feature map od lokalnych do globalnych; standardowy ViT operuje na jednej skali, co bywa problemem dla detekcji obiektów różnej wielkości.
Bardzo głębokie/duże ViT-y (ViT-H/22B) cierpią na divergencję attention w głębokich warstwach.
Self-attention bez rekurencji powstaje w NLP — fundament późniejszego ViT.
Pierwsza wpływowa demonstracja czystego Transformera na obrazach (na pojedynczych pikselach), prekursor ViT.
Pełne sformułowanie ViT: patchowanie 16×16, czysty Transformer, pretrening na JFT-300M. Wynik na ImageNet bije najlepsze CNN.
Pokazuje, że ViT można wytrenować na ImageNet-1k bez wielkiego pretreningu dzięki destylacji i ulepszonej augmentacji.
Lokalne okienka self-attention + shifted windows + hierarchia rozdzielczości — czynią ViT konkurencyjnym jako general-purpose backbone (detekcja, segmentacja).
ViT staje się standardowym backbone dla kontrastywnego pretreningu obraz-tekst; otwiera erę zero-shot wizji.
Maskowanie ~75% patchy i rekonstrukcja — bardzo wydajny self-supervised pretraining dla ViT.
Self-supervised pretraining ViT ujawnia emergentne właściwości segmentacyjne w mapach attention.
Pokazuje, że ViT skaluje się analogicznie do LLM; ujawnia nowe behawioralne właściwości na dużej skali.
ViT staje się fundamentem otwartych foundation models wizyjnych: features general-purpose (DINOv2) i segmentacja promptowalna (SAM).
Złożoność czasowa: O(N² · d) + O(N · d²) per warstwa. Złożoność przestrzenna: O(N² + N · d).
Standardowy ViT to model gęsty — wszystkie parametry aktywne dla każdego patcha. Warianty MoE (V-MoE) wprowadzają conditional computation, ale nie są częścią rdzennej definicji.
ViT jest enkoderem (bez maski przyczynowej) — wszystkie patche są przetwarzane równolegle zarówno w treningu, jak i w inferencji. Idealny pod tensor parallelism i sequence parallelism dla bardzo dużych modeli (ViT-22B).
Liczba pikseli na patch (16, 14, 8). Mniejszy P → więcej tokenów → kwadratowo droższa attention, ale lepsza rozdzielczość przestrzenna.
Standardowe warianty: ViT-Ti, ViT-S, ViT-B (Base, ~86M), ViT-L (Large, ~307M), ViT-H (Huge, ~632M), ViT-g/G, ViT-22B.
Najczęściej 224×224 (pretraining), 384×384 (fine-tuning). Zmiana rozdzielczości wymaga interpolacji positional embeddings.
Standardowo 12 (ViT-B), 16 (ViT-L), 16 (ViT-H). Wymiar głowy d_model / num_heads.
Krytyczna oś według oryginalnego papieru: ViT przegrywa z ResNet na ImageNet-1k, ale wygrywa na ImageNet-21k i JFT-300M.
1D learned (oryginał), 2D learned, sinusoidal, relative, RoPE — wpływa na zdolność do zmiany rozdzielczości.
ViT to gęsty Transformer — wszystkie operacje (patch embedding, MHSA, FFN) mapują się na matmul i są idealne dla tensor cores (FP16/BF16/FP8).
ViT powstał w Google na TPU i jest tam treniwany do skali 22B; systolic array doskonale obsługuje MHSA i FFN.
Inferencja ViT-B/S na CPU AVX/AVX-512 (ONNX Runtime, OpenVINO) jest praktyczna dla wsadowych zastosowań, choć wolniejsza niż na GPU.
Istnieją akademickie akceleratory FPGA dla ViT, ale brak szerokiego ekosystemu produkcyjnego.