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精度数据来自论文报告,不同训练策略下结果存在差异
- 市场数据为行业公开报告估算,非精确统计