网络优化与正则化
总体框架
机器学习里有一对"矛与盾":
优化:让训练集上的经验风险尽量小。 正则化:控制模型复杂度,提高泛化能力。
深度网络优化难点包括:结构差异大、没有通用优化算法、超参数多、非凸问题、参数初始化困难、局部最优、鞍点、梯度消失/爆炸等。
网络优化
优化目标是在高维损失曲面上找到较低的损失点。深度学习中更常见的问题不是"找不到全局最优",而是:
鞍点多、优化地形复杂、梯度可能不稳定。好的优化地形通常更平滑,例如残差连接、ReLU、逐层归一化都可以改善优化地形。
梯度下降与 Mini-batch SGD
梯度下降的核心思想是:
其中
Mini-batch SGD 每次取一小批样本估计梯度。批量大小会影响梯度方差:
批量越大,梯度方差越小,训练更稳定,可以用更大学习率; 批量越小,噪声更大,可能帮助跳出局部区域,但学习率不能太大。
当 batch size 增大
学习率调整
学习率太小,收敛慢;学习率合适,下降快;学习率太大,可能震荡甚至发散。
常见策略:
- 学习率衰减:训练后期逐渐减小学习率,使模型更稳定。包括梯级衰减、线性衰减、指数衰减、自然指数衰减、余弦衰减。
- 周期性学习率:周期性增大学习率,短期会让训练不稳定,但长期可能帮助模型逃离鞍点或尖锐最小值,找到更好的局部最优。
- Warmup:一开始用小学习率训练几轮,避免随机初始化阶段直接用大学习率造成数值不稳定。
优化算法改进
- 改进学习率:Adagrad、Adadelta、RMSprop
- 改进梯度方向:Momentum、Nesterov、梯度截断
- 综合方法:Adam ≈ Momentum + RMSprop
常见算法理解:
- SGD:简单,但下降慢,容易在沟壑两边震荡。
- Momentum:用历史梯度的指数移动平均作为更新方向,相当于有"惯性"。
- Nesterov:先沿动量方向"预看一步",再计算梯度。
- Adagrad:频繁更新的参数学习率变小,稀疏参数学习率较大。
- RMSprop:改进 Adagrad,不累计全部历史梯度,只关注近期梯度。
- Adam:同时使用一阶动量和二阶动量,自适应调整更新方向和步长。
- Nadam:Nesterov + Adam。
入门优先考虑 SGD + Nesterov Momentum 或 Adam;快速验证模型时用 Adam,最终精调时可考虑 SGD;数据稀疏时优先考虑自适应学习率算法;训练时要 shuffle,并持续监控训练集和验证集指标。
梯度截断
梯度截断用于处理梯度爆炸。方法是把梯度限制在一定范围内:
- 按值截断:每个梯度分量限制在
内。 - 按模截断:如果梯度范数太大,就按比例缩小。
常用于 RNN、LSTM 等容易梯度爆炸的网络。
参数初始化与数据预处理
参数不能全部初始化为 0,否则会产生对称权重问题:同一层神经元学到一样的东西,网络退化。
常见初始化方法:
- Gaussian 随机初始化
- 均匀分布初始化
- 正交初始化
- Xavier 初始化
- He 初始化
Xavier 和 He 都属于基于方差缩放的初始化,目的是让信号在多层传播时不要过分放大或减弱。一般来说:
- Sigmoid / Tanh 常用 Xavier;
- ReLU 常用 He。
数据预处理包括:
- 最小最大归一化:把数据压到
; - 标准化:使数据均值为 0、方差为 1;
- PCA 白化:降低特征相关性。
归一化可以让损失曲面更圆、更平滑,梯度下降更容易。
逐层归一化
逐层归一化的目的:
- 增强尺度不变性;
- 缓解内部协变量偏移;
- 让优化地形更平滑。
主要方法:
- Batch Normalization:按 batch 统计均值和方差。优点是提高优化效率,也有隐式正则化效果;缺点是 batch 不能太小,对 RNN 不太适合。
- Layer Normalization:按单个样本的一层神经元统计均值和方差,更适合 RNN。
- Weight Normalization、Local Response Normalization、Instance Norm、Group Norm 等也是归一化方法。
超参数优化
超参数包括:层数、每层神经元数、激活函数、学习率、学习率调整策略、正则化系数、mini-batch 大小、优化器等。
常见搜索方法:
- 网格搜索:枚举所有组合,代价高。
- 随机搜索:随机采样组合,通常比网格搜索更有效。
- 贝叶斯优化:根据已有实验结果预测下一个更可能有效的组合。
- 动态资源分配:把更多资源给更有希望的组合。
- 神经架构搜索:自动搜索网络结构。
网络正则化
正则化的目标是提高泛化能力:
所有损害优化的方法都可以看作正则化。
正则化可以分两类:
- 干扰优化过程:early stop、权重衰减、SGD、Dropout。
- 增加优化约束:数据增强、
和 正则化。
和 正则化
在原损失函数上加参数范数惩罚:
是 ,容易产生稀疏参数; 是 ,会限制参数过大,使模型更平滑。
Early Stop
用验证集监控模型。如果验证集误差不再下降,就停止训练。 它本质上是限制训练过程,防止模型继续记住训练集噪声。
权重衰减
每次更新时让参数缩小一点:
在标准 SGD 中,权重衰减和
Dropout
Dropout 在训练时随机丢弃一部分神经元输入,相当于:
其中
它有两种理解:
- 从集成学习看,每次 dropout 都是在原网络中采样一个子网络;
- 从贝叶斯学习看,dropout 相当于对参数进行采样。
在 RNN 中不能每个时间步都随便丢弃隐状态,否则会破坏时间记忆。应使用变分 Dropout:对参数矩阵元素随机丢弃,并在所有时间步使用相同掩码。
数据增强
通过变换数据增加样本多样性,特别常用于图像:
旋转、翻转、缩放、平移、加噪声等。
标签平滑
普通 one-hot 标签太"硬",容易让模型过度自信。标签平滑是在标签中加入少量噪声:
正确类别从
这样可以缓解过拟合,提高泛化能力。
总结
- 模型方面:用 ReLU,分类用交叉熵,使用逐层归一化。
- 优化方面:SGD + mini-batch,配合动态学习率;也可以优先用 Adam。
- 训练细节:每轮重新随机排序数据,做标准归一化,注意参数初始化。
- 正则化方面:使用
正则化、Dropout、Early Stop、数据增强。