10.1 卷积、感受野与残差连接:把空间结构写进参数共享方式
图像宽高增加,flatten 后全连接层的输入与参数量也随之增加。左上角与右下角即使出现相同边缘,也分别占用连接权重。卷积把局部检测器放到不同位置复用,减少重复参数化。
卷积把两个假设写进架构:局部邻域更相关,同一局部模式可以出现在不同位置。它不是让模型“看懂图像”,而是用局部连接和权重共享提高样本与参数效率。
本课目标
- 写出
Conv2d的 input/weight/output shape 与参数量; - 计算 kernel、stride、padding、dilation 对输出尺寸的影响;
- 区分 translation equivariance 与 invariance;
- 递推计算 theoretical receptive field;
- 理解 pooling、group/depthwise convolution 和 residual connection。
1. PyTorch Conv2d 实际计算 Cross-correlation
输入通常为:
X: [batch, in_channels, height, width]
W: [out_channels, in_channels / groups, kernel_h, kernel_w]
Y: [batch, out_channels, out_height, out_width]每个 output channel 有一组跨 input channels 的局部 filters,在所有空间位置共享。深度学习库通常不把 kernel 翻转,因此实现的是 cross-correlation;训练会直接学到所需权重,日常仍习惯称 convolution。
groups=1 时参数数:
它与输入图像
2. 输出尺寸不能靠目测
单个空间维度的输出:
其中
例如
Even kernel、asymmetric padding、framework 的 same 规则会影响边界,部署前用 shape test 验证。
3. Channels 不是固定的“边缘语义”
第一层 filter 可能呈现方向/颜色模式,深层 channel 是训练目标下的分布式表示。不能预设 channel 17 必然是“猫耳朵检测器”。同一功能可能分散在多个 channels,不同 seed 还会旋转/置换表示。
卷积参数共享带来近似 translation equivariance:输入平移,feature map 相应平移。但 padding、stride、pooling、边界裁剪和离散采样都会破坏严格等变。
Classification 希望一定程度 translation invariance,常通过 pooling、downsampling、global aggregation 和 augmentation 获得;卷积本身更接近 equivariance,不是 invariance。
4. Stride、Padding、Dilation 分别改变什么
- padding:控制边界和尺寸,也注入边界值假设(zero/reflect/replicate 等);
- stride:跳步采样并下采样,可能产生 aliasing;
- dilation:拉开 kernel taps,在不增加参数的情况下扩大视野;
- kernel size:改变局部支持与参数/FLOPs。
先低通再下采样可减少 aliasing,但具体 anti-aliasing 设计要结合任务。padding=1 不是所有
5. Receptive Field 要同时追踪 Jump
令第
初始
Theoretical RF 只说明可能依赖哪些输入。实际/effective receptive field 受 weights、nonlinearity、normalization 和训练影响,中心位置贡献常不均匀。
例如 conv3/s1 → pool2/s2 → conv3/s1 → pool2/s2,(r, j) 依次是 (3,1) → (4,2) → (8,2) → (10,4)。这个递推描述局部卷积/池化路径;跨空间聚合的操作,包括训练时的空间 BatchNorm,会引入更广的依赖。
6. Pooling 与 Learnable Downsampling
- max pooling 保留窗口最大值,提供局部不敏感性但丢细节;
- average pooling 做局部平均;
- strided convolution 学习下采样 filter;
- adaptive/global average pooling 把任意空间尺寸聚合到固定输出。
Segmentation、detection 等 dense prediction 不能过早丢掉空间细节,常用 skip connection、多尺度 feature pyramid 或 encoder–decoder 恢复分辨率。
7. Group 与 Depthwise Convolution
groups 把 channel connections 分组。若 groups=C_in 且 C_out=K C_in,每个输入 channel 用自己的 spatial filters,即 depthwise convolution。
Depthwise separable block 常组合:
- depthwise spatial convolution;
pointwise convolution 混合 channels。
它显著减少参数/FLOPs,但真实 latency 取决于 kernel implementation、memory bandwidth、tensor shape 和 hardware;FLOPs 少不保证线上更快。
8. Residual Connection 优化的是增量
Residual block:
若维度相同,identity shortcut 给 forward/gradient 提供直接路径,网络可学习相对 identity 的 residual。它缓解很深网络的 optimization degradation,但不保证任意深度都稳定,也不等于梯度“完全不经过非线性”。
Shape 不同需 projection/downsampling shortcut。相加前 spatial/channel/dtype 必须匹配;随意 broadcasting 是 bug。
Pre-activation/Post-activation、normalization 和 residual scaling 会改变训练,应按目标架构实现。
9. 一个不硬编码空间尺寸的 CNN
以下 Python 3 / PyTorch 2.14 CPU 例子可直接运行,检查两种图像尺寸。两次池化要求宽高至少为 4;形状通过不代表预测有效。
import torch
from torch import nn
class SmallCNN(nn.Module):
def __init__(self, in_channels=1, classes=10):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(in_channels, 32, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2),
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2),
)
self.pool = nn.AdaptiveAvgPool2d((1, 1))
self.classifier = nn.Linear(64, classes)
def forward(self, x):
x = self.features(x)
x = self.pool(x)
x = torch.flatten(x, start_dim=1)
return self.classifier(x)
model = SmallCNN()
assert model(torch.randn(8, 1, 28, 28)).shape == (8, 10)
assert model(torch.randn(8, 1, 32, 40)).shape == (8, 10)Adaptive pooling 让 classifier 不依赖固定
10. 数据增强写入 Invariance 假设
Random crop、flip、color jitter、mixup 等不是免费增样,而是声明某种变换不应改变标签或应按规则混合标签。
- 左右翻转对某些物体分类合理,对文字、医学侧别可能错误;
- color jitter 可能破坏以颜色为标签依据的任务;
- resize/crop 可删除微小缺陷;
- augmentation 只用于 train,validation/test 用冻结 deterministic preprocessing。
按 deployment corruption 做 stress test,避免只在同一种 augmentation 上自证鲁棒。
11. CNN 的部署边界
记录 input channel order、色彩空间、resize interpolation、normalization mean/std、orientation 和 dynamic shape。训练 RGB、部署 BGR 或整数除法错误,模型结构再好也会失效。
评估除 accuracy 外还应覆盖:
- resolution/blur/compression/lighting;
- spatial subgroup 与设备;
- calibration 与 abstention;
- latency、峰值显存和 batch=1;
- adversarial/自然分布 shift。
常见误区
- 库执行严格数学 convolution:多数深度库实现 cross-correlation。
- CNN 天然平移不变:卷积更接近等变,边界/下采样还会破坏它。
- 两层 3×3 永远等效 5×5:stride、dilation 为 1 时只是感受野尺寸相同,非线性与参数分解通常使函数不同。
- Residual 完全解决梯度问题:它改善路径,仍需初始化、norm 与优化。
- FLOPs 更少一定更快:硬件和 memory behavior 很关键。
练习
- 计算不同 stride/padding/dilation 的输出尺寸与参数量。
- 用 jump–RF 递推计算一个含 pooling 的 CNN 感受野。
- 平移输入,测量 padding/stride 前后 equivariance 误差。
- 比较 standard 与 depthwise-separable conv 的参数、FLOPs 和真实 latency。
- 为一个医学/文字图像任务审查哪些 augmentation 会改标签。
小结
卷积在不同位置共享局部权重。Kernel、stride、dilation 与 pooling 决定空间依赖和采样网格,残差连接改变优化路径。形状与感受野能算清,平移鲁棒性、实际速度和预测效果还要测量。
下一课把共享从空间位置换到时间步:RNN 用同一递推单元更新状态,也因此让梯度沿时间连续乘由共享权重和各步状态决定的 Jacobian。