Week 7:Optimization of CNNs 学习笔记
// @order: 999
Week 7:Optimization of CNNs 学习笔记
0. 本章核心目标:如何让 CNN “训得动、训得深、泛化好”
本章不是单纯讲 CNN 结构,而是在回答一个核心问题:
给定一个深层 CNN,如何保证它能够被有效优化,并且在新数据上表现良好?
可以把本章看成一棵“优化进化树”:
神经网络难训练
│
├── 激活函数问题:Sigmoid 饱和、梯度消失
│ ├── ReLU / Leaky ReLU / ELU / Maxout
│ └── Batch Normalization
│
├── 架构问题:CNN 越深越难优化
│ ├── AlexNet:CNN 打败传统视觉特征
│ ├── VGG:用小卷积核堆深度
│ └── ResNet:用残差连接解决 degradation problem
│
├── 优化器问题:SGD 慢、抖、被 saddle point 卡住、梯度噪声大
│ ├── Momentum
│ ├── AdaGrad
│ ├── RMSProp
│ └── Adam
│
├── 泛化问题:训练误差低不等于测试误差低
│ ├── Early Stopping
│ ├── Ensembles
│ ├── L1/L2/Elastic Net
│ ├── Dropout
│ └── Data Augmentation
│
└── 数据不足问题
└── Transfer Learning / Fine-tuning
重要程度标注: ★★★★★ 必考核心:BatchNorm, ResNet, Momentum/AdaGrad/RMSProp/Adam, Dropout, Data Augmentation, Transfer Learning。 ★★★★☆ 高概率考:Sigmoid 饱和、VGG 小卷积核、degradation problem、SGD 三大问题。 ★★★☆☆ 理解即可:AlexNet/ZFNet/SENet 作为历史脉络,AutoAugment,ensemble。
—
1. 从单隐藏层网络到深层 CNN:为什么优化是核心问题
1.1 单隐藏层网络
课件先回顾单隐藏层网络:
其中:
- :输入向量,维度为 。
- :第一层权重矩阵,把 维输入映射到 个隐藏单元。
- :隐藏层偏置。
- :隐藏层表示。
-
:逐元素激活函数。
- :输出层权重向量。
- :输出层偏置。
- :最终输出 scalar。
逻辑直觉: 线性变换 本身无法表示复杂非线性边界,必须引入 。X O R 例子说明了单层线性分类器无法处理非线性可分问题,而隐藏层通过组合多个线性边界可以表达 X O R 这种模式。
—
2. 激活函数演进:从 Sigmoid 到非饱和激活
2.1 Sigmoid
导数为:
符号解释:
- :神经元输入 pre-activation。
- :激活输出,范围为 。
- :反向传播时局部梯度。
Sigmoid 的问题:
当 时:
当 时:
所以 Sigmoid 在两端饱和区域梯度接近 0。反向传播时:
如果 ,那么 。这就是 saturated neurons “kill gradients”。
第二个问题是 Sigmoid 输出非零中心:
输出总为正,会导致后续层的梯度方向高度相关,优化路径 zig-zag,降低收敛效率。
重要程度:★★★★★
—
2.2 tanh
tanh 输出范围为:
它比 Sigmoid 好的一点是 zero-centered,但仍然存在饱和区,因此仍可能梯度消失。
重要程度:★★★☆☆
—
2.3 ReL U
导数:
ReL U 的核心优势:正区间不饱和,梯度为 1,因此能缓解深层网络中的梯度消失。
问题: 如果一个神经元长期处于 ,梯度为 0,可能变成 dead ReL U。
重要程度:★★★★★
—
2.4 Leaky ReL U
课件公式:
更一般写法:
其中 是负半轴斜率,例如 或 。
优势:即使 ,也有非零梯度:
因此缓解 dead ReL U。
重要程度:★★★★☆
—
2.5 E L U
课件公式:
其中:
- :控制负半轴饱和值。
- :pre-activation。
E L U 的直觉: 正半轴像 ReL U,负半轴平滑下降并趋向 。相比 ReL U,它可以产生负输出,使激活更接近 zero-centered。
重要程度:★★★☆☆
—
2.6 Maxout
课件公式:
其中:
- :两组可学习线性权重。
- :偏置。
- :输入向量。
Maxout 的直觉: 它不是固定形状的激活函数,而是让模型学习多个线性函数,并取最大值。它表达能力强,但参数量更大。
重要程度:★★★☆☆
—
3. Batch Normalization:从“避免饱和”到“稳定训练分布”
3.1 为什么需要 Normalization?
Sigmoid 或 tanh 的饱和来自输入过大或过小。课件提出解决思路:
避免 feature values too large or too small。
这就引出 normalization。
重要程度:★★★★★
—
3.2 Batch Normalization 公式
输入:
其中:
- :mini-batch size。
- :feature/channel 维度。
- :第 个样本第 个通道/特征的值。
对每个 feature/channel ,计算 batch mean:
计算 batch variance:
归一化:
其中:
- :第 个 feature/channel 在 batch 上的均值。
- :第 个 feature/channel 在 batch 上的方差。
- :小常数,防止除以 0。
- :归一化后的值。
但是强制 zero mean 和 unit variance 可能过于严格,因此引入可学习 scale 和 shift:
其中:
- :第 个 feature 的可学习缩放参数。
- :第 个 feature 的可学习平移参数。
- :BatchNorm 输出。
如果模型希望恢复 identity mapping,可以学习:
则:
忽略 时正好恢复原输入。
重要程度:★★★★★
—
3.3 BatchNorm 的训练时与测试时差异
训练时:
来自当前 mini-batch。
测试时不能依赖 mini-batch,因为单个测试样本或者不同 batch 会造成输出不稳定。因此测试时使用训练过程中累积的 running mean 和 running variance:
测试时 BatchNorm 变成线性算子:
可重写为:
所以测试时 B N 可以 fuse 到前一层 F C 或 Conv 中。
重要程度:★★★★★
—
3.4 BatchNorm 插入位置
课件给出的常见位置:
F C / Conv
↓
BatchNorm
↓
Nonlinearity
即通常放在 fully connected 或 convolution layer 之后,activation function 之前。
重要程度:★★★★☆
—
4. C N N 架构演进:AlexNet → V G G → ResNet
4.1 C N N 基本卷积层
输入图像:
一个卷积核:
对一个局部 patch 做点积:
其中:
- :卷积核参数,展开后维度为 。
- :输入图像中一个 patch。
- :bias。
- :一个空间位置的输出激活。
如果有 6 个 filters,则输出 6 张 activation maps。对于 输入,不加 padding 且 stride = 1 时,空间尺寸变为:
所以输出为:
重要程度:★★★★★
—
4.2 卷积输出尺寸公式
一般情况下,输入尺寸为 ,卷积核大小为 ,padding 为 ,stride 为 ,输出高度为:
输出宽度为:
若输出通道数为 ,则输出 tensor 为:
重要程度:★★★★★
—
4.3 AlexNet:第一代 C N N 突破
AlexNet 架构:
C O N V1
M A X P O O L1
N O R M1
C O N V2
M A X P O O L2
N O R M2
C O N V3
C O N V4
C O N V5
M A X P O O L3
F C6
F C7
F C8
意义: AlexNet 是 I L S V R C 第一个 C N N-based winner,将 ImageNet top-5 error 从传统方法显著降低,标志着深度 C N N 在大规模视觉识别中的突破。
局限:
- 使用较大卷积核,例如 。
- 网络深度有限。
- F C 层参数量大。
- 训练依赖工程技巧。
重要程度:★★★★☆
—
4.4 V G G:用小卷积核堆深度
V G G 的核心设计是大量使用 convolution。
课件问题:为什么用小卷积核?
三个 stride 1 conv 的 effective receptive field 等价于一个 conv。
推导:
第一层 看到 个像素范围。 第二层每个位置又基于第一层 范围,因此感受野增加 。 第三层再增加 。
所以:
一般地, 个 stride 1 convolution 的 effective receptive field 为:
当 :
参数量比较:
一个 conv 参数量约为:
三个 conv 参数量约为:
所以小卷积堆叠既减少参数,又增加非线性层数。
重要程度:★★★★★
—
4.5 Plain deeper network 的问题:Degradation Problem
课件展示:56-layer plain network 比 20-layer plain network 在 training error 和 test error 上都更差。
这不是 overfitting,因为 overfitting 应该表现为:
training error 低,但 test error 高
而 degradation problem 是:
training error 也更高,test error 也更高
所以问题不是泛化,而是优化失败:深层 plain network 理论表达能力更强,但 S G D 无法有效找到好解。
重要程度:★★★★★
—
4.6 ResNet:从直接拟合 H(x) 到拟合 residual F(x)
Plain layer 试图直接学习:
ResNet 改成学习 residual mapping:
所以:
Residual block 输出:
其中:
- :block 输入。
- :由若干卷积层学习到的 residual function。
- :block 输出。
- 到输出的路径是 identity shortcut。
关键直觉: 如果最优映射接近 identity,即:
plain network 需要学习一个完整 identity function。 ResNet 只需要让:
于是:
学习 比学习复杂的 identity mapping 容易得多。
重要程度:★★★★★
—
4.7 ResNet 架构特征
课件总结:
1. Stack residual blocks
2. 每个 residual block 有两个 3x3 conv layers
3. 周期性 double filters,并用 stride 2 downsample spatial size
4. 开头有 stem conv,例如 7x7 conv, stride 2
5. 末尾没有大 F C layers,只用 global average pooling + F C 1000
Global Average Pooling 的意义:
若最后 feature map 为: 则对每个 channel 做空间平均: