VIT

[2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

核心思想:将图像划分为多个固定大小的 patch,并将每个 patch 看作 NLP 中的 token,经过线性映射后输入标准 Transformer Encoder

传统 CNN:

1
2
3
4
5
6
7
Image
↓
Convolution
↓
Feature Map
↓
Classification

ViT

1
2
3
4
5
6
7
Image
↓
Patch Tokenization
↓
Transformer Encoder
↓
Classification

把图像理解问题转化为一个序列建模问题

Patch Embedding

给定输入图像

$$ \mathbf{x}\in\mathbb{R}^{H\times W\times C} $$
把图片切成 $P\times P$

patch 总数为

$$ N=\frac{HW}{P^2}=\frac{H}{P}\frac{W}{P} $$
在原文ViT-B/16:
$$ H = W = 224, P = 16 $$
则 $N = 196$

把每个 Patch 展平成一个向量

$$ {x}_p\in\mathbb{R}^{N\times(P^2C)} $$
为了使 patch 可以输入 Transformer,需要将其映射到固定隐藏维度 D

通过线性投影

$$ {z_i} = x_i {E}\qquad {E}\in\mathbb{R}^{(P^2C)\times D} $$
把每个 patch 的维度进行压缩得到 **Patch Embedding**
$$ P^2C\rightarrow D $$
每个 patch 就对应 Transformer 中的一个 token
$$ z \in \mathbb{R}^{N\times D} $$

Position Embedding

ViT 添加可学习的位置编码

原始 ViT 延续 BERT 的设计,在 patch token 前增加一个可学习的 [CLS] 用于聚合整张图片的信息

$$ z_0=[x_{cls};x_1E;x_2E;...;x_NE]+E_{pos} \qquad E_{pos}\in\mathbb R^{(N+1)\times D} $$

ViT-B/16

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
输入图片
[B, 3, 224, 224]

↓ Patchify: 16×16

[B, 196, 3, 16, 16]

↓ Flatten 每个 Patch

[B, 196, 768]

↓ Linear Projection [这里只是刚好语义维度也是768]

[B, 196, 768]

↓ 添加 CLS Token

[B, 197, 768]

↓ 加 Position Embedding

[B, 197, 768]

↓ Transformer Encoder × 12

[B, 197, 768]

↓ 取 CLS Token

[B, 768]

↓ Classification Head

[B, num_classes]

现代 VIT

对于视觉任务,Self-Attention 本身已经能够实现 patch 间的信息交互,因此 CLS 并不是必须

很多现代 ViT 使用平均池化代替 CLS

$$ z=\frac1N\sum_{i=1}^{N}z_i $$
优势:
  • 不需要额外学习 CLS token
  • 训练更加稳定
  • 与 CNN 的 Global Average Pooling 类似

VIT 的局限

虽然 ViT 将 Transformer 引入视觉领域,但存在两个问题:

  1. 计算复杂度随图片尺寸平方增长
  2. 缺少 CNN 的层次化结构

因此后续提出Swin Transformer:通过窗口注意力和层次化结构,让 Transformer 更适合视觉任务

Swin Transformer

[2103.14030] Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

核心设计:

  1. Window Attention 降低计算量
  2. Shifted Window 实现跨窗口通信
  3. Patch Merging 构建层次化结构

Patch Embedding

首先将图片划分为 patch

输入:

$$ {x}\in\mathbb{R}^{H\times W\times C} $$
Swin 原论文使用 $P=4$
$$ H\times W\rightarrow\frac H4\times\frac W4 $$
每个 Patch 原始维度为 $4\times4\times C$

再通过 Linear Projection 转换到定义的特征维度

1
2
3
4
5
6
7
8
9
10
输入
[B, 3, 224, 224]

↓ Patchify 4×4

[B, 56, 56, 48]

↓ Linear Projection

[B, 56, 56, 96]

与 ViT 最大区别:

  • VIT 在这里已经直接转化为 token sequence
  • Swin 保留二维空间结构 [B, H, W, C]

Window Partition

Swin 不进行全局 Attention,而是在二维 feature map 上划分窗口

例如

$$ M = 7 $$
每个 Window $7\times 7 = 49$ 个 token
1
2
3
4
5
6
7
8
9
10
11
12
13
[B, 56, 56, 96]

↓ Window Partition 7×7

[B,8,8,7,7,96]

↓ Window Flatten

[B, 64, 49, 96]

↓ 把 Window 合并到 Batch

[B×64, 49, 96]

W-MSA

W-MSA:Window Multi-head Self-Attention

第一个 Swin Block 使用 W-MSA

1
2
3
4
5
6
7
┌───────┬───────┐
│Window │Window │
│ A │ B │
├───────┼───────┤
│Window │Window │
│ C │ D │
└───────┴───────┘

不同窗口内部进行 Self-Attention,不同窗口之间不发生交互

SW-MSA

SW-MSA:Shifted Window Multi-head Self-Attention

问题:如果所有 Block 都使用固定窗口,不同窗口之间无法交互,模型只能理解局部区域,无法建立跨区域关系

解决方法:第二个 Block 对窗口进行移动,移动大小为 $\left\lfloor M/2\right\rfloor$

Shift 之后,一个新的 Window 就同时包含多个 Window 的一部分 token

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
原窗口

┌───┬───┐
│ A │ B │
├───┼───┤
│ C │ D │
└───┴───┘


移动后

┌───┬───┐
│A/B│B/C│
├───┼───┤
│C/D│D/A│
└───┴───┘

实现跨 Window 信息交流

Swin Block

一个完整 Swin Block 通常是 W-MSA 和 SW-MSA 成对出现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Block 1
LN
↓
W-MSA
↓
Residual
↓
LN
↓
MLP
↓
Residual


Block 2
LN
↓
SW-MSA
↓
Residual
↓
LN
↓
MLP
↓
Residual

Patch Merging

这是 Swin 和 ViT 非常大的另一个区别

ViT 基本一直保持 token 数不变,而 Swin 会逐阶段降低空间尺寸,提高通道数,类似 CNN

会在 Swin Block 后下采,下采采用拼接 + Linear 的实现方式

1
2
3
4
5
6
7
8
9
10
11
12
13
原特征图

x00 x01 x02 x03
x10 x11 x12 x13
x20 x21 x22 x23
x30 x31 x32 x33

取 2 × 2
x00 x01
x10 x11

拼接 Channel,再经过 Linear
4C -> 2C

Swin-T

Block shape
stage1 ×2 [B,56,56,48]
stage2 ×2 [B,28,28,192]
stage3 ×6 [B,14,14,384]
stage4 ×2 [B,7,7,768]

在 stage 后 再 Merge

对比 VIT

ViT Swin
Token形式 一维序列 二维Feature Map
Attention Global Attention Window Attention
复杂度 $O(N^2)$ $O(NM^2)$
空间结构 弱 强
多尺度 无 有
Patch数量 固定 逐层减少
适合任务 分类 分类/检测/分割

ConvNeXt

[2201.03545] A ConvNet for the 2020s

核心思想:以经典 ResNet 为基础,引入 Transformer 时代的设计思想,对 CNN 进行现代化改造,使纯 CNN 达到与 Swin Transformer 相近的性能

ConvNeXt 和 ResNeXt 没有直接继承关系。

  • ResNeXt:通过 Cardinality(多分支)增强 ResNet
  • ConvNeXt:重新设计 CNN Block,使其适应现代训练方式

Patchify Stem

传统 ResNet:

1
2
3
7×7 Conv, stride=2
↓
MaxPool

ConvNeXt 修改为

1
4×4 Conv stride=4

类似 ViT / Swin 的 Patch Embedding

ConvNeXt Block

传统 ResNet Block:

1
2
3
4
5
6
7
8
9
10
11
3×3 Conv
↓
BN
↓
ReLU
↓
3×3 Conv
↓
BN
↓
Residual

ConvNeXt Block:

1
2
3
4
5
6
7
8
9
10
11
12
13
Input
↓
7×7 Depthwise Conv
↓
LayerNorm
↓
1×1 Conv (C->4C)
↓
GELU
↓
1×1 Conv (4C->C)
↓
Residual

升维到 4C 就是借鉴 FFN 的思想,用 1 ×1 卷积代替FFN

Large Kernel Depthwise Convolution

ConvNeXt 使用 $7\times 7$ Depthwise Conv

通过扩大卷积核增加感受野

普通卷积同时完成:

  • 空间信息提取
  • 通道融合

相比普通卷积,Depthwise Conv在每个通道独立卷积,再通过 1 × 1 卷积完成通道融合

从参数量上来看

普通卷积:

$$ Params=K^2C_{in}C_{out} $$
Group Conv:
$$ Params=K^2C_{in}C_{out}/Cardinality $$
Depthwise Conv 其实可以看作是Group Conv 的极端情况
类型 groups
普通卷积 1
Group Conv Cardinality
Depthwise Conv $C_{in}$

所以相当于没有混合通道,默认情况下输出通道数等于输入通道数

$$ Params=K^2C_{in} $$

这一部分可以关联分组注意力

Depthwise Conv 负责空间建模,后续的 1×1 卷积负责通道混合

类似Transformer中 Attention 实现 token 空间交互,FFN 完成 channel 变换

普通Conv Depthwise Conv
空间信息 √ √
通道融合 √ ×
参数量 大 小
计算量 大 小
输出channel 可改变 通常不变

ConvNeXt-T

和 Swin 基本一致

Stage Feature Size Channel Block数量
Stage 1 56×56 96 3
Stage 2 28×28 192 3
Stage 3 14×14 384 9
Stage 4 7×7 768 3
Swin Transformer ConvNeXt
类型 Transformer CNN
核心操作 Window Attention Large Kernel Conv
信息交互 Self-Attention 卷积感受野
Stem Patch Embedding 4×4 Conv
Stage结构 有 有
Downsampling Patch Merging Conv Downsample
Norm LayerNorm LayerNorm

CLIP

[2103.00020] Learning Transferable Visual Models From Natural Language Supervision

传统视觉模型训练目标通常是 Image -> Label

这种方式存在问题:

  • 只能识别训练时出现的类别
  • 需要大量人工标注标签
  • 学到的是类别级别信息,而不是更通用的语义关系

CLIP(Contrastive Language-Image Pre-training)的核心思想:使用大量图像-文本对进行对比学习,让图像和文本映射到同一个语义空间

模型学习:图片和描述它的文字应该接近,不匹配的图片和文字应该远离

CLIP由两个独立 Encoder 组成:

  1. Image Encoder
  2. Text Encoder

CLIP 的关键:两个 Encoder 输出维度相同

Contrastive Learning

CLIP使用对比学习,训练数据是大量的 (image, text) 对

计算所有图片和文本之间的相似度

$$ S_{ij} = \frac{z_I^i\cdot z_T^j} {||z_I^i||||z_T^j||} $$
得到 $B \times B$ 的相似度矩阵

理论上对角线位置的相似度应该最高

CLIP Loss

CLIP同时优化两个方向:

Image → Text

给定图片找到正确文本

$$ L_I=-\frac1B \sum_i \log \frac{ e^{S_{ii}/\tau} } { \sum_j e^{S_{ij}/\tau} } $$
**Text → Image**

给定文本找到正确图片

$$ L_T=-\frac1B \sum_i \log \frac{ e^{S_{ii}/\tau} } { \sum_j e^{S_{ji}/\tau} } $$
最终
$$ L=\frac{L_I+L_T}{2} $$

Zero-shot Classification

CLIP最大的特点是不需要针对每个类别重新训练

传统 Image Classification如果出现训练时没有的类就会失效

Zero-shot Classification 并不学习 Image → Label,而是学习 Image → Embedding 和 Text → Embedding,最重要的是让图片和文字进入同一个语义空间

CLIP就是典型Zero-shot模型

传统分类 Zero-shot分类
输入 图片 图片+类别文本
输出 固定类别编号 文本类别
训练类别 必须固定 可以扩展
最后层 Linear classifier 相似度匹配
代表模型 ResNet CLIP

CLIP 和大语言模型(LLM)的 Zero-shot/Few-shot 是同一个范式,模型通过预训练获得通用能力,推理时不需要(或只需要少量)任务数据

CLIP LLM
输入 图片+文本 文本
预训练任务 图文对比学习 Next Token Prediction
学习目标 跨模态对齐 语言分布建模
知识表示 Embedding空间 参数+上下文
Zero-shot 文本类别直接分类 Prompt直接完成任务
Few-shot 少量图文示例 Prompt示例
是否训练参数 否 否

共同思想:不为每个任务训练一个模型,而是训练一个拥有通用表示能力的基础模型,通过提示或少量示例完成新任务

最终都走向:

1
2
3
4
5
预训练获得通用能力
↓
Prompt / 少量示例
↓
Zero-shot / Few-shot

可以把 CLIP 看成视觉领域的大模型雏形:

  • CLIP 让模型从“分类器”变成“视觉语义理解模型”
  • GPT 让模型从“语言模型”变成“通用任务模型”

因此 CLIP 成为了多模态模型的基础

补充思考

写于2026.9.6

现在的大模型都在追求 AGI(通用人工智能),但距离严格意义上的还有差距

目前已经能够有一定的迁移能力,但跨任务迁移还不稳定

争议:模型是真的理解语义还是学习了大量文本中的统计规律

当前大模型距离 AGI 的主要差距:

  1. 缺少持续学习能力,如何让 AI 像人一样持续成长?
  2. 缺少自主规划能力,目前Agent在多步任务中容易偏离目标、忘记目标或者规划错误
  3. 缺少真实世界交互能力,期待世界模型的效果