Patch Embedding
3秒看懂
一句話:Patch Embedding是將2D影像切成小方塊、展平成向量序列的過程——它是CNN視覺模型向Transformer架構遷移的”橋樑”。
一個類比:把一幅畫剪成拼圖碎片,每塊碎片按順序編號貼上標籤,然後送入一個”文字閱讀器”(Transformer)來理解整幅畫。
┌─────────────────────┐
│ 原始影像 (H×W×C) │
└─────────┬───────────┘
│ 切塊 + 展平 + 線性投影
▼
┌─────────────────────┐
│ Token序列 [z₁,z₂,...,zₙ] │
└─────────┬───────────┘
│ + 位置編碼
▼
┌─────────────────────┐
│ Transformer編碼器 │
└─────────────────────┘
3分鐘產業解釋
為什麼重要?
在Vision Transformer(ViT)出現之前,計算機視覺(CV)主要依賴卷積神經網路(CNN)。CNN擅長捕捉區域性特徵(邊緣、紋理),但對全域性關係(物體間的空間位置、長距離依賴)處理效率較低。
Patch Embedding的出現,使得影像可以直接”翻譯”成Transformer能理解的序列格式,從而引入NLP領域成熟的自注意力機制到視覺任務。
產業影響
| 維度 | 影響 |
|---|---|
| 模型統一 | 視覺與語言共用Transformer骨架,為多模態大型模型(如GPT-4V、Gemini)奠基 |
| 訓練範式 | ViT預訓練+下游微調成為主流,降低CV任務的資料標註成本 |
| 硬體需求 | 自注意力的O(n²)複雜度對算力需求高,推動GPU/TPU/AI加速卡市場 |
| 應用落地 | 自動駕駛、醫療影像、工業檢測、衛星影像分析等領域受益 |
關鍵資料點
- ViT-Base(約86M引數)在ImageNet上僅用公開資料訓練,精度已接近CNN-SOTA [Google Research, 2020]
- 全球CV市場預計從2023年的百億美金級增長至2030年的數百億美金級 [行業報告估算,口徑不同]
15分鐘專家深入
核心機制拆解
Patch Embedding並非簡單的”切圖”,而是一個包含空間重組和特徵對映的複合操作。
輸入假設
- 影像尺寸:
H × W × C(高 × 寬 × 通道數) - Patch大小:
P × P畫素 - 嵌入維度:
D(通常是768、1024、1280等)
序列長度計算
N = \frac{H \times W}{P^2}
示例:224×224影像,Patch=16×16 → N=196個token
兩種實現方式
方式一:手動展平+線性層(原ViT論文)
# 虛擬碼
patches = image.unfold(2, P, P).unfold(3, P, P) # 切塊
patches = patches.reshape(B, N, P*P*C) # 展平
embeddings = linear_projection(patches) # 線性投影: (P²C) → D
方式二:卷積等價實現(主流工程實踐)
# 等價於一個kernel_size=P, stride=P, out_channels=D的卷積
patch_embed = nn.Conv2d(C, D, kernel_size=P, stride=P)
embeddings = patch_embed(image) # (B, D, H/P, W/P)
embeddings = embeddings.flatten(2).transpose(1, 2) # (B, N, D)
重要說明:數學上,卷積實現與手動展平+線性投影完全等價,但卷積利用GPU的平行計算最佳化,工程效率更高。
位置編碼的必要性
Transformer的自注意力機制本身是置換不變的(permutation invariant),即打亂token順序不會影響輸出。對於影像,空間位置資訊至關重要,因此必須額外注入位置資訊。
常見方案
| 型別 | 代表工作 | 特點 |
|---|---|---|
| 可學習絕對位置 | ViT | 與patch embedding相加,引數量小 |
| 正弦位置編碼 | 原始Transformer | 固定函式,可泛化到任意長度 |
| 相對位置編碼 | Swin Transformer | 注意力分數中加入相對距離偏置 |
| 旋轉位置編碼(RoPE) | 擴充套件到視覺的嘗試 | 通過旋轉矩陣編碼位置 |
CLS Token
ViT在patch序列前拼接一個可學習的**[CLS]**標記,用於聚合全域性資訊並做分類。這直接沿用了BERT的設計。
輸入序列: [CLS] + patch_1 + patch_2 + ... + patch_N
↓
[CLS]的輸出 → 分類頭
與CNN的感受野對比
| 特性 | CNN | ViT |
|---|---|---|
| 感受野增長 | 逐層堆疊,區域性→全域性 | 第一層即”全域性”(任意兩patch可直接互動) |
| 歸納偏置 | 強(平移不變性、區域性性) | 弱(需更多資料學習) |
| 小資料表現 | 較好 | 較差(需大規模預訓練) |
技術原理
數學形式化
輸入:影像 \mathbf{x} \in \mathbb{R}^{H \times W \times C}
Step 1:切塊與展平
將影像分割為 N = HW/P^2 個patch:
\mathbf{x}_p^i \in \mathbb{R}^{P^2 \cdot C}, \quad i = 1, 2, ..., N
Step 2:線性投影
通過可學習矩陣 \mathbf{E} \in \mathbb{R}^{(P^2C) \times D}:
\mathbf{z}_0^i = \mathbf{x}_p^i \mathbf{E}
Step 3:拼接CLS與位置編碼
\mathbf{Z}_0 = [\mathbf{z}_{cls}; \mathbf{z}_0^1; \mathbf{z}_0^2; ...; \mathbf{z}_0^N] + \mathbf{E}_{pos}
其中 \mathbf{E}_{pos} \in \mathbb{R}^{(N+1) \times D}
維度流轉圖(ViT-Base, 224×224, Patch=16)
輸入: (B, 3, 224, 224)
↓ patch_embed (Conv2d: 3→768, k=16, s=16)
↓ reshape + transpose
(B, 196, 768)
↓ prepend CLS token
(B, 197, 768)
↓ + position embedding (197, 768)
(B, 197, 768)
↓ transformer encoder × 12層
(B, 197, 768)
↓ 取CLS位置輸出
(B, 768)
↓ classification head
(B, num_classes)
計算量分析(Patch Embedding階段)
以ViT-Base為例:
- 引數量:
P^2 \times C \times D = 16^2 \times 3 \times 768 = 589,824(約0.59M) - FLOPs:引數量 × N(序列長度)≈ 0.59M × 196 ≈ 116M
注:相比整個ViT-Base的約17.6G FLOPs,Patch Embedding佔比很小,瓶頸在自注意力層。
混合架構(Hybrid)
部分工作在patch embedding前加入淺層CNN,增強區域性特徵提取:
影像 → Conv層(small stride) → 特徵圖 → Patch Embedding → Transformer
代表性工作:[未充分檢索到具體論文,定性表述] 這類混合架構在小資料集上表現更優。
技術演進史
2017 "Attention Is All You Need" - Transformer誕生 (NLP)
│
▼
2020.06 iGPT - 將影像展平為畫素序列,用GPT建模 (OpenAI)
問題:畫素級序列過長,計算量爆炸
│
▼
2020.10 ViT - Patch Embedding正式提出 (Google Research, Dosovitskiy et al.)
核心創新:將影像切塊降低序列長度
│
├──→ 2021.03 DeiT - 引入知識蒸餾,減少對大數據的依賴 (Facebook/Meta)
│
├──→ 2021.03 Swin Transformer - 視窗注意力+層次結構,降低計算複雜度 (Microsoft)
│ Patch Merging: 逐層合併相鄰patch,建置多尺度特徵
│
├──→ 2021 BEiT - 影像Token的掩碼預訓練 (Microsoft)
│
├──→ 2022 MAE - 掩碼自編碼器預訓練,掩位元速率高達75% (Meta FAIR)
│
├──→ 2022 EVA/EVA-02 - 擴充套件到更大規模 (BAAI)
│
└──→ 2023-至今 多模態大型模型時代的廣泛應用
GPT-4V、LLaVA、InternVL等均使用視覺編碼器+Patch Embedding
關鍵里程碑的Patch設計演變
| 時間 | 模型 | Patch策略 | 影響 |
|---|---|---|---|
| 2020 | ViT | 固定16×16或14×14 | 開創性,但小資料表現差 |
| 2021 | Swin | 4×4起始 + Patch Merging | 引入多尺度,CNN-like |
| 2022 | MAE | 同ViT,但75%patch被mask | 預訓練範式革新 |
| 2023+ | 多模態 | 通常14×14或16×16 | 與語言模型對齊 |
技術路線對比
Patch尺寸選擇
| Patch大小 | 序列長度(224²影像) | 計算複雜度 | 適合場景 |
|---|---|---|---|
| 32×32 | 49 | 低 | 資源受限、即時推論 |
| 16×16 | 196 | 中 | 主流選擇,ViT預設 |
| 14×14 | 256 | 中高 | DINOv2、EVA系列 |
| 8×8 | 784 | 高 | 需要細粒度特徵的任務 |
| 動態/自適應 | 可變 | 可變 | 研究探索階段 |
與其他視覺Token化方法對比
| 方法 | 代表工作 | 原理 | 優勢 | 劣勢 |
|---|---|---|---|---|
| Patch Embedding | ViT | 固定網格切塊 | 簡單、高效 | 忽略語義邊界 |
| 可變形注意力 | Deformable DETR | 學習取樣點位置 | 聚焦關鍵區域 | 實現複雜 |
| Token Merging | ToMe | 合併相似token | 動態減少序列長度 | 需要訓練策略配合 |
| VQ-VAE | DALL-E | 向量量化碼本 | 離散表示,可生成 | 碼本學習困難 |
多尺度Patch策略
| 策略 | 代表 | 機制 |
|---|---|---|
| 層次化Patch Merging | Swin Transformer | 每階段合併2×2相鄰patch |
| 多解析度輸入 | FlexiViT | 同一模型支援不同patch大小 |
| 金字塔結構 | PVT, MViT | 不同層使用不同patch大小 |
上下游
上游:資料與預處理
原始影像 → Resize/Crop → Normalize → [Patch Embedding]
- 資料增強:RandAugment、MixUp、CutMix等對ViT訓練效果顯著
- 解析度影響:更高解析度 → 更長序列 → 更高計算成本
核心元件依賴
| 元件 | 作用 | 關鍵引數 |
|---|---|---|
| 線性投影層 | patch→embedding | (P²C, D)矩陣 |
| 位置編碼 | 注入空間資訊 | (N+1, D)矩陣 |
| CLS Token | 全域性聚合 | (1, D)向量 |
下游任務與適配
| 任務型別 | 輸出處理 | 代表工作 |
|---|---|---|
| 影像分類 | CLS token → MLP頭 | ViT |
| 目標檢測 | 多層特徵 → 檢測頭 | DETR |
| 語義分割 | 畫素級上取樣 | SegFormer |
| 多模態理解 | 視覺token與文本token拼接 | LLaVA, InternVL |
| 影像生成 | 視覺token → 解碼器 | DALL-E |
與語言模型的融合
影像 → Patch Embedding → 視覺Token序列
↓ 拼接
文本 → Token Embedding → 文本Token序列
↓
大語言模型 (LLM)
↓
多模態輸出
關鍵指標
模型效率指標
| 指標 | 說明 | ViT-Base參考值[Google論文] |
|---|---|---|
| 序列長度N | patch數量 | 196(224²/16²) |
| 嵌入維度D | 每個token的特徵維度 | 768 |
| Patch Embedding引數量 | 線性投影矩陣 | ~0.59M |
| Patch Embedding FLOPs | 前向計算量 | ~116M |
精度-效率權衡
| 模型規模 | 引數量[論文] | ImageNet Top-1[論文] | 輸入解析度 |
|---|---|---|---|
| ViT-S/16 | ~22M | ~79-81% | 224 |
| ViT-B/16 | ~86M | ~81-84% | 224/384 |
| ViT-L/16 | ~304M | ~85-87% | 224/384 |
| ViT-H/14 | ~632M | ~88%+ | 224 |
注:精度資料依賴訓練資料規模、資料增強、訓練時長等因素,不同論文存在差異。
與CNN對比的效率指標
| 對比項 | ResNet-50 | ViT-B/16 |
|---|---|---|
| 引數量 | ~25M | ~86M |
| FLOPs | ~4G | ~17.6G |
| ImageNet (僅公開資料) | ~76% | ~77.9% |
| ImageNet (JFT-300M預訓練) | N/A | ~88% |
| 推論吞吐量 | 更高 | 較低(同等硬體) |
供需與市場資料
技術採納現狀
Patch Embedding作為ViT的核心元件,其應用範圍隨以下趨勢擴張:
| 驅動因素 | 狀態 | 估算口徑 |
|---|---|---|
| 多模態大型模型爆發 | 2023-2024快速擴張 | GPT-4V、Gemini等產品上線 |
| CV研究範式轉變 | ViT論文被引數萬次 | 學術影響力指標 |
| 工業部署 | 端側/雲端側均有應用 | 高通、聯發科等晶片支援 |
訓練算力需求(估算)
以ViT-L在ImageNet-1K訓練為例:
- 訓練epochs:300+
- GPU需求:多卡(8×A100級別),訓練時間數小時至數天
- 預訓練(如MAE、DINO):更大規模資料,更多算力
硬體相關性
Patch Embedding本身計算量小,但下游Transformer對硬體要求高:
| 硬體需求 | 說明 |
|---|---|
| 矩陣乘法算力 | 自注意力和FFN是瓶頸 |
| 視訊記憶體 | 注意力矩陣O(N²),長序列需更大視訊記憶體 |
| 頻寬 | KV cache等資料搬運 |
代表公司與資本對映
學術/研究機構
| 機構 | 代表貢獻 | 地位 |
|---|---|---|
| Google Research | 原始ViT論文 | 開創者 |
| Meta FAIR | MAE、DINO、DINOv2 | 自監督預訓練領軍 |
| Microsoft Research | Swin Transformer、BEiT | 層次化設計開創 |
| BAAI(智源) | EVA、EVA-02 | 大規模視覺模型 |
| OpenAI | iGPT、CLIP | 跨模態對齊 |
產業應用方
| 公司 | 應用場景 | Patch相關 |
|---|---|---|
| Meta | 內容理解、推薦 | MAE/DINOv2作為視覺backbone |
| 搜尋、多模態 | ViT集成於多個產品 | |
| Tesla | 自動駕駛 | 採用Transformer視覺架構(細節未充分揭露) |
| 字節跳動 | 內容理解 | 多模態模型視覺編碼器 |
| 商湯/曠視/雲端從 | 安防、商業分析 | ViT系列模型部署 |
開源生態
| 模型庫 | 維護方 | 特點 |
|---|---|---|
| timm | Ross Wightman (Hugging Face) | 最全面的ViT實現集合 |
| HuggingFace Transformers | Hugging Face | ViT模型標準化介面 |
| mmsegmentation/mmdetection | OpenMMLab | 視覺任務ViT整合 |
| DINOv2程式碼 | Meta | 原創實現 |
投資邏輯
核心判斷
Patch Embedding本身是技術元件而非獨立產品,投資邏輯需從更宏觀視角理解:
1. 多模態大型模型基礎設施
- 邏輯:ViT/Patch Embedding是多模態模型的視覺入口,隨產品落地而確定性增長
- 標的型別:算力提供商(GPU/加速卡)、模型API服務
- 風險:技術路徑可能被新方法替代
2. 視覺AI應用場景
- 自動駕駛:Transformer視覺backbone逐步替代CNN
- 工業視覺:缺陷檢測、質量控制
- 醫療影像:病理分析、輔助診斷
- 衛星遙感:大尺度影像理解
3. 邊緣部署
- 挑戰:ViT計算量大,邊緣裝置部署仍有瓶頸
- 機會:輕量化ViT(如MobileViT、EfficientViT)、模型壓縮
- 硬體:NPU/端側AI晶片支援ViT的最佳化
風險提示
- 技術迭代快:新架構(如Mamba、狀態空間模型)可能挑戰Transformer地位
- 開源競爭:核心演算法開源,商業化壁壘較低
- 資料依賴:ViT對大規模資料敏感,資料壁壘仍是護城河
常見誤讀糾偏
誤讀一:“Patch Embedding就是把圖片切成小塊”
糾偏:
- 切塊只是第一步,線性投影才是核心——它將高維畫素空間對映到語義嵌入空間
- 沒有線性投影的raw patch包含大量冗餘資訊,Transformer難以高效學習
- 工程實現上常用卷積等價操作,而非手動切塊
誤讀二:“Patch越大越好,序列越短越高效”
糾偏:
- Patch越大 → 序列越短 → 計算越快,但資訊損失越大
- 32×32 patch在細粒度任務(如小目標檢測)上表現明顯差於16×16
- 選擇patch大小是精度-效率權衡,沒有絕對最優
- Swin Transformer通過層次化設計在一定程度上緩解了這一矛盾
誤讀三:“ViT在小資料上也能工作,和CNN差不多”
糾偏:
- 原始ViT論文明確指出,在ImageNet-1K(約100萬張)從頭訓練時,ViT不如同等規模CNN
- 需要在JFT-300M等大規模資料集上預訓練才能發揮優勢
- DeiT通過知識蒸餾、強資料增強緩解了這一問題,但歸納偏置弱的本質未變
- DINO、MAE等自監督方法進一步降低了資料需求
誤讀四:“Patch Embedding不包含位置資訊,所以丟失了空間結構”
糾偏:
- Patch Embedding本身確實不包含位置資訊
- 但通過加法注入位置編碼(Position Embedding),空間資訊被顯式補充
- 部分相對位置編碼方案將位置資訊整合在注意力計算中
- 真正的問題是固定網格切塊可能割裂物體邊界,但這與”位置資訊”是不同問題
學習路徑
入門級(理解概念)
- 閱讀ViT論文摘要與Introduction:[Dosovitskiy et al., 2020] “An Image is Worth 16x16 Words”
- 視覺化Patch切分:使用torchvision將圖片切成patch並可視化
- 執行HuggingFace ViT示例程式碼:體驗端到端流程
進階級(掌握實現)
- 手寫Patch Embedding層:用PyTorch實現Conv2d等價和手動展平兩種方式
- 對比不同patch大小:在CIFAR-10上實驗8×8, 16×16, 32×32的效果差異
- 閱讀timm庫的ViT實現:理解工程最佳化細節
專家級(理解前沿)
- 研究位置編碼方案:絕對/相對/RoPE的原理與實現
- 閱讀Swin Transformer:理解層次化Patch Merging
- 研究MAE/DINOv2:理解自監督預訓練如何增強Patch Embedding
- 追蹤多模態論文:視覺token如何與語言模型對接
推薦資源
| 資源 | 型別 | 適合階段 |
|---|---|---|
| 李沐《動手學深度學習》ViT章節 | 教程 | 入門 |
| Harvard “The Annotated Transformer” | 程式碼註釋 | 入門-進階 |
| lucidrains/vit-pytorch (GitHub) | 簡潔實現 | 進階 |
| timm/models/vision_transformer.py | 工業級實現 | 進階-專家 |
| arXiv最新ViT相關論文 | 論文 | 專家 |
一句話總結
Patch Embedding是視覺Transformer的”入場券”——它將連續的畫素網格離散化為token序列,使強大的自注意力機制得以在視覺領域施展拳腳,但它的設計選擇(patch大小、位置編碼、層次結構)直接決定了模型的效率與精度上限。
延伸閱讀與來源
核心論文
- Dosovitskiy et al., 2020. “An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale.” ICLR 2021.
- Liu et al., 2021. “Swin Transformer: Hierarchical Vision Transformer using Shifted Windows.” ICCV 2021.
- He et al., 2022. “Masked Autoencoders Are Scalable Vision Learners.” CVPR 2022.
- Caron et al., 2021. “Emerging Properties in Self-Supervised Vision Transformers.” ICCV 2021.
技術部落格
- Google AI Blog: “ViT: A Vision Transformer”
- Papers With Code: Vision Transformer系列頁面
- Hugging Face Blog: ViT相關教程
資料來源說明
- 本文中模型引數量、FLOPs等資料均來自原論文或官方程式碼庫
- ImageNet精度資料來自論文報告,不同訓練策略下結果存在差異
- 市場資料為行業公開報告估算,非精確統計