先记住一句话

ResNet 让深网络学习“在输入上改多少”;ViT 把图片变成 patch token 后做全局 attention;Swin 又加入局部窗口和层级结构,让 Transformer 更适合高分辨率 dense vision。

Pixels局部卷积 / patchify空间混合下采样 / patch merge任务 head

0. 三种骨架把计算放在哪里?

ResNet3×3 局部卷积 → residual
|
ViTpatchify → 全局 attention
|
Swin窗口 attention → shift → merge
三者都把像素逐步变成语义特征;差别是空间交互范围与分辨率层级如何组织。

1. CNN 带着哪些视觉先验?

卷积核在整张图上共享参数,只看局部邻域。这自带两个重要 inductive bias:

  • 局部性:相邻像素通常比远处像素关系更直接。
  • 平移等变性:输入平移时,feature map 也相应平移。

多层卷积逐步扩大 receptive field,并通过下采样形成从边缘、纹理到部件、对象的层级表示。这些先验让 CNN 在数据不特别大时也很有效。

例 1:手算一个 2×2 卷积

输入 patch $X=\begin{bmatrix}1&2\\3&4\end{bmatrix}$,卷积核 $K=\begin{bmatrix}1&0\\0&-1\end{bmatrix}$,无 bias,则输出标量:

$$1\times1+2\times0+3\times0+4\times(-1)=-3$$

同一个 K 滑到所有位置,体现参数共享;它对局部对角差异产生响应。

2. ResNet:为什么“学习残差”更容易?

深 plain network 即使有 BatchNorm,也出现 degradation problem:增加层数后,训练误差反而更高。关键不是新层表达能力不足——额外层至少可以学 identity——而是优化器很难让一串非线性层精确学成 identity。

Residual block 把目标映射写成:

$$y=x+F(x;\theta)$$

如果这几层暂时不需要改变输入,只要把 $F(x)$ 学到接近 0。反向传播也有一条 identity 路径:

$$\frac{\partial y}{\partial x}=I+\frac{\partial F}{\partial x}$$

这不保证梯度永不消失或爆炸,但给信息和梯度提供了更直接的通路,使数十到数百层网络更易优化。Residual connection 后来成为 Transformer、扩散模型等深网络的基础部件。

例 2:残差与梯度的数字直觉

$x=2$,残差分支 $F(x)=0.1x^2$,则 $y=2+0.4=2.4$。局部梯度为 $dy/dx=1+0.2x=1.4$;若没有 shortcut,仅 $dF/dx=0.4$。恒等项 1 给梯度一条直接通路。

3. ViT:怎样把图片变成 token?

对 $H\times W\times C$ 图片,用 $P\times P$ 不重叠窗口切块,可得到:

$$N=\frac{HW}{P^2}$$

个 patch。每个 patch 展平后经线性层投影成 $d$ 维 token,再加入位置 embedding。分类版 ViT 常在开头加入可学习的 [CLS] token,最终用它的 hidden state 分类。

image 224×224
  → 16×16 patches
  → 14×14 = 196 visual tokens
  → position embedding
  → Transformer encoder
  → classifier

ViT 的全局 self-attention 让任意 patch 一层内交流,但弱化了 CNN 的局部和尺度先验。原论文的重要结论不是“小数据上 Transformer 天然更强”,而是在大规模预训练后,较少视觉先验的模型能学出强表示并有效迁移

例 3:patchify 的 shape 与参数

$224\times224\times3$ 图像、$P=16$:每行 14 个 patch,总计 $N=196$。每个 patch 展平维度 $16\times16\times3=768$;若投影到 $d=768$,线性层权重有 $768\times768=589{,}824$ 个参数(另加 bias)。加入 CLS 后 attention 序列长 197。

4. Patch size 是精度与成本旋钮

patch 越小,空间细节越多,但 token 数按 $1/P^2$ 增长,而标准 attention score 按 $N^2$ 增长。把 patch 从 16 减到 8,token 数约变 4 倍,attention 矩阵约变 16 倍。

所以高分辨率检测与分割不能只把分类 ViT 原样放大;需要窗口、稀疏 attention、层级 feature map 或其他高效机制。

例 4:patch 16 与 patch 8 的成本

224 图像:$P=16$ 得 196 tokens、score 数 $196^2=38{,}416$;$P=8$ 得 784 tokens、score 数 $784^2=614{,}656$,正好约 16 倍。

5. Swin:为什么重新引入局部与层级?

Swin 把 attention 限制在固定大小的局部 window 内。若 window 大小固定,计算量对图像像素数近似线性增长。问题是不同 window 之间无法交流,因此相邻 block 把窗口平移半格:

Block A: [window][window][window]
Block B:    [ shifted windows ]

Shifted windows 让上一层不同窗口中的 token 在下一层相遇。Swin 还通过 patch merging 逐阶段降低分辨率、提高通道数,形成类似 CNN/FPN 的层级 feature maps,便于 detection 和 segmentation。

例 5:窗口 attention 为什么近似线性

56×56 feature map 有 $N=3136$ tokens。全局 score 数是 $3136^2=9{,}834{,}496$。若用 7×7 windows,每窗 49 tokens,共 $(56/7)^2=64$ 窗,score 总数 $64\times49^2=153{,}664$,约少 64 倍。

Patch merging 把相邻 2×2 token 合并:56×56 → 28×28,token 数变为四分之一,再提升通道数。

6. 三者的真正关系

骨架主要先验全局交互多尺度输出
ResNet强局部性、共享卷积靠深层 receptive field天然分阶段
ViT较弱,patch + position每层全局 attention原始版本较单一
Swin窗口局部性靠 shifted window 跨区传播天然分阶段
常见误解:

ViT 没有“消灭 CNN”。视觉系统常把卷积、attention、层级表示混合使用;选择取决于数据规模、分辨率、延迟和任务输出。

自测:先算后展开

1. Residual block 为什么比直接学 $H(x)$ 容易?

它改为学习 $F(x)=H(x)-x$;若理想映射接近 identity,残差只需接近零,同时 identity shortcut 提供直接信息和梯度通路。

2. ViT patch 变小为什么很贵?

patch 边长减半会使 token 数约四倍,而全局 attention 矩阵大小约增加十六倍。

3. Swin 的 shifted window 解决什么?

固定窗口降低计算,但隔离窗口;交替平移窗口使跨窗口 token 在后续 block 中交换信息。

4. 384×384 图像用 16×16 patch 有多少 token(不计 CLS)?

每边 $384/16=24$,共 $24^2=576$。

5. 三个 stride-1 的 3×3 卷积 receptive field 多大?

每层每边扩大 2,依次 3、5、7,所以为 7×7。