ViT
3 秒看懂
一句話: ViT 把一張圖片切成固定大小的小塊(patch),每個小塊當作一個”token”,直接餵給標準 Transformer 編碼器做視覺理解——不靠卷積,純靠注意力。
類比: 就像把一本書的每一頁撕成等大格子,每個格子是一個詞,然後用 NLP 那套方法去”讀圖”。
3 分鐘產業解釋
為什麼 ViT 重要?
在 ViT(2020)之前,計算機視覺的”主幹”幾乎被 CNN(卷積神經網路)壟斷了十年:AlexNet → VGG → ResNet → EfficientNet。ViT 證明了一件事情——拋棄歸納偏置(inductive bias),純靠海量資料 + 自注意力機制,Transformer 同樣能在視覺任務上做到 SOTA,甚至更優。
這對產業意味著三件事:
- 架構統一化: NLP 和 CV 可以共享同一套 Transformer backbone,降低工程複雜度,為多模態大型模型(GPT-4V、Gemini 等)鋪路。
- 規模化定律(Scaling Law): ViT 的效能與模型規模、資料規模、計算量之間呈現可預測的冪律關係(類比 LLM 的 Chinchilla 定律),這使得算力投資可量化。
- 生態遷移: 預訓練-微調範式從 NLP 遷移到 CV,視覺基礎模型(Foundation Model for Vision)賽道由此開啟,催生了 DINO、MAE、SAM 等一系列里程碑工作。
關鍵數字(速覽)
| 維度 | 資料 |
|---|---|
| 提出時間 | 2020 年(Dosovitskiy et al.,ICLR 2021 正式發表) |
| 提出機構 | Google Brain(核心作者 Dosovitskiy、Beyer、Kolesnikov 等) |
| 基本思想 | 影像 patch → 線性嵌入 → 位置編碼 → 標準 Transformer Encoder |
| 典型 patch size | 16×16 或 14×14 畫素 |
| 引數量(ViT-B/16) | ~86M [原始論文] |
| 引數量(ViT-L/16) | ~307M [原始論文] |
| 引數量(ViT-H/14) | ~632M [原始論文] |
| 原始預訓練資料 | JFT-300M(~3 億張圖片)[Google 內部資料集] |
15 分鐘專家深入
核心創新:Patch Embedding + 純 Transformer Encoder
CNN 通過卷積核的區域性感受野逐層擴大來獲取全域性資訊,這個過程天然帶有平移等變性和區域性性兩種歸納偏置。ViT 的核心論點是:當資料量足夠大時,這些歸納偏置反而是限制——模型自己從資料中學到的模式比人類預設的更優。
前向傳播全鏈路
輸入影像 (H × W × C)
│
▼
Patch 分割 → (N 個 patch, 每個 P × P × C)
│ N = (H/P) × (W/P)
│ 例如 224×224 影像、P=16 → N = 196 個 patch
▼
線性投影嵌入 → (N × D) [D = 隱藏維度]
│
▼
拼接 [CLS] token → ((N+1) × D)
│ [CLS] 是可學習的向量,用於全域性表徵
▼
加上位置編碼 → ((N+1) × D) [可學習的 1D 位置嵌入]
│
▼
L 層 Transformer Encoder Block
│ 每層包含:
│ ┌─ LayerNorm → Multi-Head Self-Attention → 殘差連線
│ └─ LayerNorm → MLP (2 層 FFN, GELU 啟用) → 殘差連線
│
▼
取 [CLS] token 的輸出 → 線性分類頭 → 預測
關鍵技術細節
1) Patch Embedding 的本質
將一個 P×P×C 的 patch 展平為長度為 P²C 的向量,再乘以一個可訓練的投影矩陣 E ∈ ℝ^{(P²C)×D}。這等價於一個 kernel size = P、stride = P、無重疊的卷積——這是 ViT 中唯一”卷積”的地方(實現層面)。
2) 位置編碼
原始 ViT 使用 可學習的 1D 位置嵌入(而非 2D 結構化位置編碼)。實驗表明,模型自己學到了隱式的 2D 空間結構——注意力圖視覺化中可以看到行/列方向的注意力模式 [原始論文 Figure 7]。
3) [CLS] Token vs Global Average Pooling
原始 ViT 用 [CLS] token 做分類。後續工作(如MAE)發現用 全域性平均池化(GAP) 替代 [CLS] token 效果相當甚至更優。
4) 注意力複雜度
Self-attention 的計算和記憶體複雜度為 O(N²D),其中 N = patch 數量。對於 224×224 / P=16,N=196,複雜度可控。但當解析度提升到 1024×1024 且 P=16 時,N=4096,計算量急劇膨脹——這是後續 Swin Transformer 等工作的改進動因。
5) 訓練穩定性
原始 ViT 訓練需要非常精細的學習率策略(linear warmup + cosine decay)和較大的 batch size(4096),否則容易發散。這是因為 Transformer 缺少 CNN 的 BatchNorm 歸一化慣性和區域性性約束。
技術原理
架構全景(ASCII)
┌─────────────────────────────────────────────────────┐
│ Vision Transformer │
│ │
│ Image (224×224×3) │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Patch Embed │ Conv2d(3, D, kernel=P, stride=P) │
│ └──────┬───────┘ → (N=196, D=768) for ViT-B/16 │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Prepend [CLS] │ → (197, D=768) │
│ │ + Pos Embed │ 可學習引數 ∈ ℝ^{197×768} │
│ └──────┬───────┘ │
│ │ │
│ ┌──────▼────────────────────────────────────────┐ │
│ │ Transformer Encoder × L │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ LN → Multi-Head Self-Attention → + res │ │ │
│ │ │ LN → MLP(GELU) → + res │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ × L 層 (B=12, L=24, H=32) │ │
│ └──────┬─────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ [CLS] 輸出 │ │
│ │ → Linear Head │ → 類別 logits │
│ └──────────────┘ │
└─────────────────────────────────────────────────────┘
規格表:原始 ViT 變體
| 變體 | 層數 L | 隱藏維度 D | 注意力頭數 | MLP 隱層 | 引數量 | Patch |
|---|---|---|---|---|---|---|
| ViT-B/16 | 12 | 768 | 12 | 3072 | ~86M | 16×16 |
| ViT-L/16 | 24 | 1024 | 16 | 4096 | ~307M | 16×16 |
| ViT-H/14 | 32 | 1280 | 16 | 5120 | ~632M | 14×14 |
| ViT-L/16 @384 | 24 | 1024 | 16 | 4096 | ~307M | 16×16 |
[來源:Dosovitskiy et al., “An Image is Worth 16x16 Words”, ICLR 2021]
Self-Attention 核心公式
Attention(Q, K, V) = softmax(QK^T / √d_k) · V
其中:
Q = XW_Q, K = XW_K, V = XW_V
W_Q, W_K, W_V ∈ ℝ^{D × d_k}
d_k = D / h (h = 注意力頭數)
Multi-Head Self-Attention (MHSA):
MultiHead(X) = Concat(head_1, ..., head_h) · W_O
其中 head_i = Attention(XW_Qi, XW_Ki, XW_Vi)
W_O ∈ ℝ^{D × D}
MLP Block:
MLP(x) = Linear(GELU(Linear(x)))
第一層: D → 4D (ViT 中 MLP 隱層 = 4D)
第二層: 4D → D
計算量估算
以 ViT-B/16 處理單張 224×224 影像為例 [估算]:
| 元件 | FLOPs 近似 |
|---|---|
| Patch Embedding | ~0.14G |
| 單層 MHSA | ~0.52G(N=197, D=768) |
| 單層 MLP | ~0.93G(D→3072→D) |
| 12 層合計 | ~17.6G |
| 分類頭 | 可忽略 |
對比:ResNet-50 約 4G FLOPs;ViT-B/16 的單次推論計算量約為 ResNet-50 的 ~4.4 倍 [粗略估算]。
技術演進史
時間線
═══════════════════════════════════════════════════════════
2012 AlexNet ← CNN 稱霸視覺
│
2015 ResNet ← 殘差連線,深度 CNN 標杆
│
2017 Transformer ← Vaswani et al., NLP 革命
│ "Attention Is All You Need"
│
2019 ┌─ iGPT (Chen et al.) ← 最早將 GPT 引入影像(自迴歸)
│ └─ Set Transformer ← 集合上的注意力
│
2020 ★ ViT ★ ← Dosovitskiy et al. (Google Brain)
│ 首次證明:純 Transformer + 足夠資料
│ → 在 ImageNet 上超越 CNN SOTA
│
2021 ─┬─ DeiT (Touvron et al.) ← 僅用 ImageNet-1K 訓練 ViT
│ │ 引入知識蒸餾 token
│ ├─ Swin Transformer (Liu et al.) ← 視窗注意力,層級結構
│ ├─ BEiT (Bao et al.) ← 視覺 BERT,掩碼影像建模預訓練
│ ├─ MLP-Mixer (Tolstikhin et al.) ← 用 MLP 替代注意力
│ └─ PVT (Wang et al.) ← 金字塔 ViT
│
2022 ─┬─ MAE (He et al.) ← 掩碼自編碼器,75% 掩位元速率
│ │ ImageNet-1K 上達到 87.8% top-1
│ ├─ EVA / EVA-02 ← 規模化視覺預訓練
│ └─ SigLIP (Zhai et al.) ← ViT + CLIP 改進
│
2023 ─┬─ SAM (Kirillov et al.) ← ViT-H 作為影像編碼器
│ ├─ InternImage ← 大規模視覺基礎模型
│ └─ ViT-22B (Dehghani et al.) ← Google 最大 ViT
│
2024 ─┬─ DINOv2 大規模部署
│ └─ ViT 成為多模態 LLM 的標準視覺編碼器
│ (GPT-4V, LLaVA, InternVL 等)
═══════════════════════════════════════════════════════════
關鍵轉折點
- DeiT (2021): 證明 ViT 不一定需要 JFT-300M 那樣的海量資料。通過資料增強(RandAugment、Mixup、CutMix)+ 知識蒸餾 + 更強的正則化(Stochastic Depth),在 ImageNet-1K(~1.28M 張圖)上也能訓練出有競爭力的 ViT。
- Swin Transformer (2021): 引入層級結構和移位視窗注意力,將複雜度從 O(N²) 降到 O(N),在密集預測(檢測、分割)任務上全面超越原始 ViT。
- MAE (2022): 隨機掩碼 75% 的 patch,用 ViT 編碼器-解碼器重建畫素,實現了高效的自監督預訓練。
技術路線對比
ViT vs CNN vs 混合方案
| 維度 | 原始 ViT | CNN (ResNet) | Swin Transformer | MAE (ViT) |
|---|---|---|---|---|
| 歸納偏置 | 幾乎無(僅 patch 劃分含區域性性) | 平移等變性 + 區域性性 | 視窗區域性性 + 層級結構 | 同 ViT |
| 注意力範圍 | 全域性(每層每個 token 看所有 token) | 區域性(卷積核大小) | 視窗內全域性 + 跨視窗(移位) | 全域性 |
| 序列長度 | N = (H/P)×(W/P),固定 | 隨層逐級縮小 | 分階段縮小(類似 CNN) | 同 ViT |
| 複雜度 | O(N²D) | O(K²·C²·H·W) | O(N·w²·D),w = 視窗大小 | O(N²D),但僅處理未掩碼 token |
| 小資料表現 | 弱(需大數據或強正則) | 強 | 較強 | 中等(預訓練後微調強) |
| 密集預測適配 | 需額外設計(如 ViTDet) | 天然金字塔 | 天然金字塔 | 需額外設計 |
| 預訓練效率 | 中 | 高 | 高 | 非常高(75% 掩碼) |
| 典型 ImageNet top-1 | ~77-79%(B/16, IN-1K 直接訓練) | ~76-80%(R50-R152) | ~83-86%(Swin-B/L) | ~83-87%(MAE ViT-L/H) |
注:具體準確率依賴訓練配置(資料增強、解析度、epoch 數等),此處為 [原始論文報告值 / 社群復現近似值],僅供參考量級。
自注意力 vs 卷積的核心區別
卷積(區域性、固定權重):
┌───┐
│ K │ ← 固定大小核(如 3×3),權重不隨輸入變化
└───┘ → 複雜度 O(K²·C·H·W),K 遠小於 H,W
自注意力(全域性、動態權重):
每個 token 與所有 token 計算相似度
→ 權重由輸入內容動態決定
→ 複雜度 O(N²·D),N = token 數
上下游
上游(ViT 依賴什麼)
| 環節 | 具體內容 |
|---|---|
| 算力硬體 | GPU/TPU 訓練叢集;ViT-B 通常用 8-64 塊 V100/A100 訓練數天 [估算] |
| 訓練資料 | ImageNet-1K(~1.28M)、ImageNet-21K(~14M)、JFT-300M(~300M)等 |
| 架構 | PyTorch(主流)、JAX/Flax(Google 原始實現)、HuggingFace Transformers |
| 正則化技術 | Stochastic Depth、Label Smoothing、Mixup、CutMix、RandAugment |
下游(ViT 用在哪)
| 方向 | 代表工作 | 說明 |
|---|---|---|
| 影像分類 | ViT、DeiT、DINO | 直接替代 ResNet 做 backbone |
| 目標檢測 | ViTDet、DINO-DETR | ViT 作為檢測器 backbone |
| 語義分割 | SegFormer、Segmenter | ViT backbone + 解碼頭 |
| 自監督學習 | MAE、DINO、DINOv2 | 預訓練範式,下游微調 |
| 多模態 | CLIP、SigLIP、LLaVA、GPT-4V | ViT 作為視覺編碼器,與文本對齊 |
| 影片理解 | ViViT、TimeSformer | 將 ViT 擴充套件到時空維度 |
| 影像生成 | DiT (Scalable Diffusion Transformer) | ViT 作為擴散模型 backbone |
| 3D 視覺 | Point Transformer | 點雲端上的 Transformer |
關鍵指標
| 指標 | 含義 | 典型值/範圍 |
|---|---|---|
| ImageNet top-1 準確率 | 在 ImageNet 驗證集上的分類準確率 | ViT-B: 77-84%;ViT-L: 80-87%(取決於預訓練資料和策略) |
| Params | 模型引數量 | B=86M, L=307M, H=632M |
| FLOPs | 單次前向推論浮點運算次數 | B/16: ~17-80G(取決於解析度) |
| Throughput | 每秒處理圖片數(images/sec) | 取決於硬體和解析度;B/16 @224: 數百張/秒/A100 [估算] |
| Attention 層數 × 頭數 | 注意力頭的總數 | B: 12層×12頭=144; L: 24層×16頭=384 |
| Patch 數 N | 序列長度 | 224/16→196; 384/16→576; 518/14→1369 |
| Pre-training 資料量 | 預訓練圖片數 | IN-1K: 1.28M; IN-21K: 14M; JFT-300M: 300M |
| Transfer 效能 | 遷移到下游任務的準確率 | 在 VTAB-19 等 benchmark 上評估 |
供需與市場資料
需求側
ViT 及其變體已從學術研究走向工業標配:
- 多模態大型模型: GPT-4V、Gemini、Claude 3.5 等多模態 LLM 的視覺編碼器,主流採用 ViT 架構(或 ViT 變體如 SigLIP ViT、InternViT)。每個多模態 API 呼叫背後都是 ViT 的推論。
- 自動駕駛: BEV(鳥瞰圖)感知管線中,ViT backbone 逐漸替代 CNN。
- 醫療影像: ViT 在病理切片、CT/MRI 分析中表現優異。
- 工業質檢: 基於預訓練 ViT 的少樣本/零樣本檢測。
供給側
| 維度 | 現狀 |
|---|---|
| 推論晶片 | NVIDIA GPU(A100/H100)、Google TPU、高通/聯發科端側 NPU |
| 模型規模 | 從 ViT-Ti(~5M)到 ViT-22B(220億引數)[Dehghani et al., 2023] |
| 部署 | 雲端端推論(主力)、邊緣推論(ViT-Ti/S 量化後可上手機端) |
| 開源生態 | HuggingFace timm 庫提供 1000+ ViT 預訓練權重;MAE/DINOv2 權重廣泛使用 |
市場規模(估算)
嚴格來說,“ViT”不是一個獨立市場品類,而是嵌入在 AI 晶片 + 視覺 AI 軟體 + 多模態應用中的核心技術元件。根據 [第三方行業報告估算],計算機視覺 AI 市場 2024 年規模約 $20-30B,其中 Transformer-based 視覺模型滲透率快速提升但仍與 CNN 共存。
代表公司與資本對映
| 公司/機構 | 角色 | 關鍵產品/工作 |
|---|---|---|
| Google / DeepMind | 原始發明者 | ViT、MAE (Kaiming He 在 FAIR 但與 Google 緊密關聯)、ViT-22B、SigLIP |
| Meta / FAIR | 重要貢獻者 | DINO、DINOv2、MAE、Segment Anything (SAM) |
| Microsoft | 應用落地 | Florence (ViT-based CLIP 改進)、Swin Transformer (MSRA) |
| OpenAI | 多模態應用 | CLIP (ViT 作為視覺編碼器之一)、GPT-4V 的視覺前端 |
| Hugging Face | 生態基礎設施 | transformers 庫、timm 庫,ViT 模型分發平台 |
| NVIDIA | 硬體+架構 | Triton 推論最佳化中的 ViT 最佳化、TensorRT-LLM 對多模態模型支援 |
| 中國科技公司 | 追趕與創新 | 阿里 EVA 系列、商湯 InternImage、智譜 CogVLM(ViT 編碼器) |
資本對映
- 直接受益: AI 晶片廠商(NVIDIA、AMD、Google TPU 業務)——ViT 的計算密集特性驅動高階 GPU 需求。
- 間接受益: 多模態 AI 應用公司(OpenAI、Anthropic、字節跳動等)——ViT 是多模態能力的基礎設施。
- 資料標註/資料服務: ViT 預訓練依賴大規模標註/未標註資料。
投資邏輯
核心判斷
- ViT 已成為視覺 AI 的”公地基”。 不是可選項,而是必選項。任何做視覺 AI 的公司都離不開 ViT 或其變體。
- 計算需求持續增長。 從 ViT-B(86M)到 ViT-22B,引數量增長 250 倍。多模態大型模型中,視覺編碼器的推論頻次與文本 LLM 掛鉤,且每次對話都需處理影像輸入。
- 端側部署是增量市場。 ViT-Ti/S + INT8 量化在手機/車載晶片上的部署正在加速,推動端側 AI 晶片升級。
- 多模態大型模型 = ViT 的殺手級應用。 GPT-4V、Gemini 等產品的爆發,直接帶動 ViT 推論算力需求。
風險
- 架構替代風險: Mamba(狀態空間模型)等新架構可能在長序列場景下挑戰 ViT。
- 同質化競爭: ViT 架構開源且成熟,差異化壁壘在於資料和工程最佳化,而非架構本身。
- 推論成本: ViT 在端側的計算量仍顯著高於 MobileNet 等輕量 CNN,可能限制某些場景的滲透。
常見誤讀糾偏
❌ 誤讀 1:“ViT 不需要大數據就能訓練好”
事實: 原始 ViT 論文明確指出,當僅用 ImageNet-1K(128 萬張)訓練時,ViT 不如同等規模的 ResNet。ViT 的效能優勢是在 JFT-300M(3 億張)預訓練後才體現的 [原始論文 Table 2]。DeiT 後續證明通過極強的資料增強和知識蒸餾可以在 IN-1K 上訓練好 ViT,但這恰恰說明 ViT 對資料增強策略高度敏感——缺乏 CNN 的歸納偏置是一把雙刃劍。
❌ 誤讀 2:“ViT 的自注意力是全域性的,所以一定比 CNN 好”
事實: 全域性注意力 ≠ 一定更優。在資料量有限的情況下,CNN 的區域性性先驗反而是優勢。此外,全域性注意力的 O(N²) 複雜度在高解析度場景下是嚴重的效率瓶頸。Swin Transformer 之所以在檢測/分割任務上大幅領先原始 ViT,正是因為引入了區域性視窗注意力——本質上是把 CNN 的區域性性偏置重新引入了 Transformer。
❌ 誤讀 3:“ViT 就是把 CNN 替換掉”
事實: 更準確的表述是:ViT 證明了注意力機制可以獨立完成視覺表徵學習,但這不意味著 CNN 已被淘汰。實際上:
- ConvNeXt(2022)證明將 CNN 現代化後效能與 Swin 相當。
- 工業部署中,CNN 在效率敏感場景(手機端即時檢測等)仍廣泛使用。
- 最新趨勢是 CNN + Transformer 混合架構(如 ConvNeXt V2 + MAE)。
❌ 誤讀 4:“ViT 的 [CLS] token 是必須的”
事實: [CLS] token 來自 BERT 的設計慣性。後續實驗表明,使用 全域性平均池化(GAP) 或 自適應池化 取代 [CLS] token,分類效果基本持平甚至更優 [Touvron et al., 2021; He et al., 2022 MAE]。在 DINOv2 等先進自監督方法中,[CLS] token 和 patch token 都被利用。
學習路徑
入門(2-4 周)
- 前置知識: 基礎線性代數(矩陣乘法、softmax)、基礎深度學習(CNN、反向傳播)、PyTorch 基礎。
- 論文: 讀 Dosovitskiy et al. (2020) 原文,重點理解 Section 3(Method)和 Figure 1(架構圖)。
- 程式碼實戰: 用
timm庫載入預訓練 ViT-B/16,在自己的影像分類資料集上微調。 - 視覺化: 用注意力視覺化工具觀察 ViT 的注意力圖,理解它”看”圖的方式。
進階(1-2 月)
- 對比實驗: 對比 ViT vs ResNet-50 在小資料集(如 CIFAR-10)和大數據集上的表現差異。
- 關鍵論文:
- DeiT [Touvron et al., 2021] — 資料高效訓練
- Swin Transformer [Liu et al., 2021] — 層級結構
- MAE [He et al., 2022] — 自監督預訓練
- 程式碼實踐: 從零實現一個 ViT-Small,包括 patch embedding、position encoding、MHSA。
專家(3-6 月)
- 深度論文:
- DINO/DINOv2 — 自監督視覺表徵
- Scaling Vision Transformers [Zhai et al., 2022] — ViT 的 scaling law
- An Image is Worth 16x16 Words: What about 4x4? — Patch size 的影響
- 工程實踐: 用 TensorRT/ONNX 部署 ViT 到邊緣裝置;研究 ViT 的 INT8 量化。
- 前沿追蹤: 關注多模態 LLM 中 ViT 的角色(SigLIP、InternViT、EVA)。
一句話總結
ViT 證明了”一張圖就是一串 token”——拋棄卷積的歸納偏置,用純自注意力 + 海量資料,讓 Transformer 在視覺領域實現了與 NLP 同等的架構統一和規模化擴充套件,成為多模態 AI 時代不可或缺的視覺基座。
延伸閱讀與來源
核心論文
- Dosovitskiy, A., et al. (2020). “An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale.” ICLR 2021. [arXiv:2010.11929]
- Touvron, H., et al. (2021). *“Training Data-Efficient Image Transformers & Distilla