先记住一句话
ResNet 让深网络学习“在输入上改多少”;ViT 把图片变成 patch token 后做全局 attention;Swin 又加入局部窗口和层级结构,让 Transformer 更适合高分辨率 dense vision。
0. 三种骨架把计算放在哪里?
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,则输出标量:
同一个 K 滑到所有位置,体现参数共享;它对局部对角差异产生响应。
2. ResNet:为什么“学习残差”更容易?
深 plain network 即使有 BatchNorm,也出现 degradation problem:增加层数后,训练误差反而更高。关键不是新层表达能力不足——额外层至少可以学 identity——而是优化器很难让一串非线性层精确学成 identity。
Residual block 把目标映射写成:
如果这几层暂时不需要改变输入,只要把 $F(x)$ 学到接近 0。反向传播也有一条 identity 路径:
这不保证梯度永不消失或爆炸,但给信息和梯度提供了更直接的通路,使数十到数百层网络更易优化。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$ 不重叠窗口切块,可得到:
个 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。