第八章:深度模型训练的优化方法
1. 经验风险最小化与代理损失函数
1.1 经验风险最小化原理
深度学习模型训练的核心目标是使模型在未见过的数据上具有良好的泛化性能。在机器学习理论中,我们通常希望最小化期望风险(Expected Risk),定义为:
其中 \(L\) 为损失函数,\(f(\mathbf{x}; \boldsymbol{\theta})\) 为模型预测,\(p_{\text{data}}\) 为数据真实分布。
然而,我们并不知道 \(p_{\text{data}}\),只能从有限的训练样本中学习。因此,我们转而最小化经验风险(Empirical Risk):
其中 \(m\) 为训练样本数量。经验风险最小化(Empirical Risk Minimization, ERM)是统计学习理论的基本原则,它假设训练样本足够多时,经验风险可以近似期望风险。
1.2 代理损失函数
在实际应用中,许多损失函数无法直接优化。例如,在分类问题中,如果我们使用 0-1 损失:
这个损失函数是非凸的且导数几乎处处为零,无法使用梯度下降法优化。因此,我们引入代理损失函数(Surrogate Loss)作为替代。
1.2.1 对数似然损失
在深度学习中最常用的代理损失是对数似然损失(Log-Likelihood Loss)。对于分类问题,假设模型输出类别 \(y\) 的条件概率 \(P(y | \mathbf{x}; \boldsymbol{\theta})\),则负对数似然定义为:
对于二分类问题,使用 sigmoid 激活函数时:
负对数似然为:
这正是机器学习中著名的交叉熵损失(Cross-Entropy Loss)。
1.2.2 代理损失的合理性
代理损失函数满足一个重要性质:一致性(Consistency)。当样本量趋于无穷大时,代理损失的最小化点应收敛到真实风险最小化的最优解。0-1 损失的对数似然代理损失在一定条件下是一致的,这为使用代理损失提供了理论依据。
2. 梯度下降法的挑战
梯度下降法是深度学习优化的基石,但其直接应用面临诸多严峻挑战。
2.1 局部Minima与全局Minima
深度神经网络的损失函数 landscape 极其复杂,存在大量的局部Minima(Local Minima)。传统观点认为,这些局部Minima会困住优化算法,导致收敛到较差的解。
然而,现代研究发现: - 对于足够大的神经网络,大部分局部Minima的损失值接近全局最优损失 - 这些"几乎最优"的局部Minima可能比真正的全局Minima更容易到达 - 局部Minima的问题在于其替代品——鞍点(Saddle Point),鞍点处梯度为零但不是局部极值点
2.2 高原与平坦区域
高原(Plateau)是指损失函数变化极其缓慢的区域。在高原上,梯度值非常小,导致参数更新极其缓慢,优化算法似乎"停滞不前"。
数学上,当损失函数在某区域满足:
即使存在下降方向,梯度的微小性也使得收敛时间大大延长。高原问题在深度自编码器、循环神经网络等架构中尤为突出。
2.3 悬崖与梯度爆炸
深度神经网络中一个危险的現象是梯度悬崖(Gradient Cliffs),通常由层叠的权重矩阵乘法引起。考虑一个 \(L\) 层的网络:
如果权重矩阵的奇异值大于 1,梯度会呈指数级增长,导致梯度爆炸(Exploding Gradient);反之,如果奇异值小于 1,梯度会指数级衰减,引发梯度消失(Vanishing Gradient)。
梯度爆炸会导致参数更新过大,使损失函数在迭代间剧烈振荡,甚至导致数值溢出。梯度消失则使底层网络参数几乎无法更新,模型难以有效学习。
2.4 长期依赖问题
在循环神经网络中,梯度在时间步上反向传播时会反复乘以权重矩阵:
经过 \(T\) 步后,梯度的量级取决于 \((\mathbf{W}^\top)^T\) 的特征值。这导致网络难以学习长期依赖(Long-Term Dependencies),即相距很远的时步间的关联性。
3. 随机梯度下降与动量法
3.1 批量梯度下降与随机梯度下降
批量梯度下降(Batch Gradient Descent)使用全部样本计算梯度:
每次迭代需要遍历整个数据集,计算复杂度为 \(O(m)\)。
随机梯度下降(Stochastic Gradient Descent, SGD)每次仅使用一个样本或一个小批量样本估计梯度:
SGD 的优势在于: - 计算效率高,每次迭代复杂度为 \(O(1)\) - 引入的随机性可以帮助逃离局部Minima和鞍点 - 对于非凸优化问题,更强的随机性通常带来更好的泛化性能
3.2 小批量SGD与数据打乱
实践中通常使用小批量SGD(Mini-batch SGD),每次迭代使用 \(n\) 个样本:
其中 \(\mathcal{B}_t\) 为第 \(t\) 步的小批量索引集合。典型的批量大小为 32、64、128 或 256。
数据打乱(Data Shuffling)对于SGD的收敛性至关重要,它确保每个 epoch 内样本以随机顺序被访问,防止模型对训练数据的顺序产生偏见。
3.3 动量法
动量法(Momentum)旨在加速SGD在相关方向上的收敛,并抑制振荡。其核心思想是累积过去梯度的指数加权移动平均:
其中 \(\gamma \in [0, 1)\) 是动量系数,通常取值为 0.9 或 0.99。
物理直观:动量法类似于一个具有惯性的球在下坡滚动,过去积累的动量使球在平坦区域继续前进,在陡峭区域积累更多速度。参数更新方向由历史梯度共同决定,而不是仅由当前梯度决定。
收敛性分析:引入动量后,等效的学习率变为 \(\frac{\eta}{1-\gamma}\),因此动量法实际上是一种隐式的学习率自适应机制。
3.4 Nesterov动量
Nesterov动量(Nesterov Accelerated Gradient, NAG)是动量法的一种变体,它先根据历史动量预更新参数,再计算梯度进行校正:
Nesterov动量在理论上具有更好的收敛速率,对于强凸函数的收敛速度可以达到 \(O(1/t^2)\),优于标准动量法的 \(O(1/t)\)。
4. 自适应学习率算法
动量法通过引入历史梯度信息来加速收敛,但所有参数共享同一个学习率。自适应学习率算法为每个参数分配独立的学习率,根据参数的梯度历史动态调整。
4.1 AdaGrad
AdaGrad(Adaptive Gradient)通过累积历史梯度的平方和来调整每个参数的学习率:
其中 \(\odot\) 表示逐元素乘法,\(\epsilon\) 是一个小常数(通常为 \(10^{-8}\))防止除零。
AdaGrad的优势:对于稀疏梯度特征(如图数据、词嵌入),频繁出现的特征会有较大的累积梯度,导致学习率降低;而稀疏特征由于梯度较小,学习率保持较高,使模型能够更好地学习稀有模式。
AdaGrad的劣势:随着训练进行,\(\mathbf{s}_t\) 持续增长,导致学习率单调递减,最终可能小到无法继续学习。这在深度神经网络训练中尤为明显。
4.2 RMSProp
RMSProp(Root Mean Square Propagation)通过引入指数加权移动平均来解决AdaGrad学习率单调递减的问题:
其中 \(\gamma\) 通常取值为 0.9。RMSProp使用指数衰减来遗忘过时的梯度信息,使学习率能够自适应地调整。
4.3 Adam
Adam(Adaptive Moment Estimation)结合了动量法和RMSProp的思想,同时使用一阶矩估计(梯度的均值)和二阶矩估计(梯度的方差):
由于 \(\mathbf{m}_t\) 和 \(\mathbf{s}_t\) 在训练初期被初始化为零向量,它们会被偏置向零。Adam使用偏差校正来纠正这个问题:
参数更新规则为:
Adam的典型超参数为 \(\beta_1 = 0.9\),\(\beta_2 = 0.999\),\(\epsilon = 10^{-8}\)。它具有以下优点: - 结合了一阶和二阶矩信息,收敛速度快 - 自适应学习率,对超参数选择相对鲁棒 - 偏差校正确保训练早期也有合理的更新方向
4.4 学习率调度
除了自适应学习率算法,学习率调度(Learning Rate Scheduling)也是控制学习率的重要策略:
| 调度策略 | 更新规则 | 特点 |
|---|---|---|
| 步衰减(Step Decay) | \(\eta_t = \eta_0 \cdot \gamma^{\lfloor t / T \rfloor}\) | 每隔固定 epoch 降低学习率 |
| 指数衰减 | \(\eta_t = \eta_0 \cdot \gamma^t\) | 连续指数下降 |
| 余弦退火(Cosine Annealing) | \(\eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})(1 + \cos(\frac{t}{T}\pi))\) | 周期性重启 |
| warmup | 初期逐渐增大学习率 | 稳定训练初期 |
5. 批量归一化
批量归一化(Batch Normalization, BatchNorm)是深度学习的一项重要技术,旨在解决深层网络训练中的 Internal Covariate Shift 问题。
5.1 Internal Covariate Shift
在深度神经网络中,随着参数在训练过程中更新,各层的输入分布会不断变化,这种现象称为内部协变量偏移(Internal Covariate Shift, ICS)。ICS 要求每一层都必须不断适应前一层输出的新分布,导致: - 底层网络参数需要非常小的学习率以避免梯度爆炸/消失 - 顶层网络参数学习被底层参数更新所牵制 - 模型对参数初始化非常敏感
5.2 批量归一化原理
批量归一化对每一层的输入进行标准化,使其均值为零、方差为一:
其中 \(\boldsymbol{\mu}_B = \frac{1}{|B|} \sum_{i \in B} \mathbf{x}^{(l,i)}\),\(\boldsymbol{\sigma}_B^2 = \frac{1}{|B|} \sum_{i \in B} (\mathbf{x}^{(l,i)} - \boldsymbol{\mu}_B)^2\)。
为了保持模型的表达能力,引入可学习的缩放参数 \(\boldsymbol{\gamma}\) 和平移参数 \(\boldsymbol{\beta}\):
这两个参数使批量归一化层能够学习恒等变换,从而恢复原始表示能力。
5.3 批量归一化的作用
批量归一化带来以下优势: - 减轻ICS问题:稳定各层输入分布,加快收敛 - 提供隐式正则化:每个batch的统计量具有随机性,产生类似dropout的正则化效果 - 允许更高学习率:减少梯度对参数尺度的依赖,可以使用更大的学习率 - 减少对Dropout的依赖:部分替代Dropout的正则化功能
5.4 推理阶段的批量归一化
在推理阶段,批量归一化使用训练期间累积的移动平均统计量:
推理时批量归一化是确定性的,不依赖batch,可以轻松融入预训练模型的部署流程。
6. 自然梯度与曲率方法
6.1 自然梯度法
标准梯度下降的参数更新发生在欧几里得空间,而自然梯度法(Natural Gradient Descent)在黎曼流形上进行参数更新,考虑了参数空间的几何结构。
在概率模型中,参数空间的几何结构由Fisher信息矩阵(Fisher Information Matrix, FIM)描述:
自然梯度定义为:
参数更新为:
自然梯度的优势在于它具有尺度不变性——无论参数如何重新参数化,自然梯度都指向损失函数下降最快的方向。
6.2 牛顿法
牛顿法(Newton's Method)使用损失函数的二阶泰勒展开来近似:
其中 \(\mathbf{H} = \nabla^2 L(\boldsymbol{\theta})\) 是Hessian矩阵(损失函数对参数的二阶导数)。
令导数为零可得牛顿更新规则:
牛顿法的优势:对于二次型损失,牛顿法一步收敛,因为它利用了曲率信息。
牛顿法的劣势: - Hessian矩阵计算复杂度为 \(O(p^2)\),存储复杂度为 \(O(p^2)\),对于百万参数的深度网络不可行 - Hessian可能不正定,导致更新方向不是下降方向 - 仅适用于凸或准凸问题
6.3 共轭梯度法
共轭梯度法(Conjugate Gradient, CG)是一种用于求解大型稀疏线性方程组的迭代方法,也可用于优化。CG在每一步沿共轭方向搜索,这些方向关于Hessian矩阵相互正交。
CG的基本迭代:
其中 \(\mathbf{r}_t = -\nabla L(\boldsymbol{\theta}_t)\) 是残差,\(\beta_t\) 和 \(\alpha_t\) 的选择确保方向之间的共轭性。
CG的优势在于只需存储几个向量,内存复杂度为 \(O(p)\),远低于牛顿法的 \(O(p^2)\)。
6.4 拟牛顿法:BFGS与L-BFGS
拟牛顿法(Quasi-Newton Methods)通过迭代近似Hessian矩阵的逆,避免直接计算二阶导数。
BFGS(Broyden-Fletcher-Goldfarb-Shanno)算法使用以下更新公式近似Hessian的逆:
其中 \(\mathbf{s}_t = \boldsymbol{\theta}_{t+1} - \boldsymbol{\theta}_t\),\(\mathbf{y}_t = \nabla L(\boldsymbol{\theta}_{t+1}) - \nabla L(\boldsymbol{\theta}_t)\)。
L-BFGS(Limited-memory BFGS)是BFGS的内存受限版本,它只存储最近 \(m\) 个 \((\mathbf{s}_t, \mathbf{y}_t)\) 对,通过这些历史信息近似Hessian的逆。L-BFGS的内存复杂度为 \(O(mp)\),通常取 \(m = 5\) 到 \(20\)。
L-BFGS在深度学习中的应用相对有限,因为: - 深度网络的损失函数是非凸的,曲率估计可能不准确 - 超参数调优复杂,收敛行为不如自适应方法稳定 - 适用于小规模问题的细粒调优
7. 梯度裁剪与过冲控制
7.1 梯度裁剪
梯度裁剪(Gradient Clipping)是防止梯度爆炸的经典技术。其核心思想是当梯度的范数超过某个阈值时,对梯度进行缩放:
或者按元素裁剪:
典型的阈值范围为 1 到 10,具体取决于模型和任务。梯度裁剪在RNN训练中尤为重要,因为RNN中容易出现梯度爆炸。
7.2 学习率过冲与震荡
过冲(Overshooting)是指参数更新幅度过大,导致损失函数在迭代间剧烈振荡甚至发散。这通常发生在: - 学习率设置过高 - 梯度估计不准确(特别是使用小批量时) - 参数空间中存在陡峭的曲率
7.3 过冲控制策略
动量法通过累积历史梯度平滑更新方向,是控制过冲的有效方法。
学习率衰减可以在训练后期减小学习率,避免在最优解附近振荡。
Adam等自适应方法通过归一化梯度来解决这个问题。Adam将参数更新除以 \(\sqrt{\hat{\mathbf{s}}_t}\),这相当于根据梯度的大小自适应调整学习率。
Trust Region方法将参数更新限制在一个信任区域内:
通过限制参数更新的步长来避免过冲。
8. 优化算法综合对比
| 算法 | 学习率策略 | 动量项 | 自适应二阶矩 | 梯度裁剪 | 适用场景 |
|---|---|---|---|---|---|
| SGD | 全局固定/调度 | 可选 | 否 | 可选 | 大规模监督学习 |
| SGD + Momentum | 全局固定/调度 | 是 | 否 | 可选 | 通用场景 |
| AdaGrad | 参数自适应 | 否 | 否 | 否 | 稀疏特征优化 |
| RMSProp | 参数自适应 | 可选 | 是 | 可选 | 非稳态目标 |
| Adam | 参数自适应 | 是 | 是 | 可选 | 通用深度学习(默认首选) |
| L-BFGS | 线搜索 | 否 | 近似Hessian | 否 | 小规模精细调优 |
| Natural Gradient | 参数自适应 | 否 | Fisher矩阵 | 否 | 概率模型、变分推断 |
9. 实践建议与调参技巧
9.1 超参数初始化
权重初始化对深度网络的训练至关重要: - Xavier/Glorot初始化:适用于sigmoid/tanh激活函数 - He初始化:适用于ReLU及其变体 - 偏置通常初始化为零
9.2 调试与诊断
训练深度模型时,应监控以下指标: - 训练损失与验证损失的差距(检测过拟合/欠拟合) - 梯度的范数(检测梯度爆炸/消失) - 各层激活值的分布(检测ICS问题) - 参数更新的范数与参数范数的比例
9.3 Adam作为默认选择
对于大多数深度学习任务,Adam是默认的优化器选择。它的自适应学习率、偏差校正和动量组合使其在各种场景下都能有良好的表现。
然而,对于以下场景,可能需要考虑其他优化器: - 大规模图像分类(如ResNet):SGD + Momentum + Learning Rate Decay 通常效果更好 - 序列生成模型:带有梯度裁剪的SGD或Adam - 追求最优性能:尝试L-BFGS或自然梯度法进行微调
深度学习优化是一个活跃的研究领域,理解这些基础算法的原理和特性,对于设计新架构、调试模型、解决实际问题是不可或缺的。
10. 公式汇总
下表整理了本章涉及的核心公式:
| 编号 | 名称 | 公式 | 物理意义 | 类型 |
|---|---|---|---|---|
| (8.1) | 梯度下降更新 | \(\boldsymbol{\theta}_{t+1} = \boldsymbol{\theta}_t - \alpha \nabla L(\boldsymbol{\theta}_t)\) | 沿负梯度方向更新参数 | (T) |
| (8.2) | 动量法更新 | \(\mathbf{v}_t = \beta \mathbf{v}_{t-1} - \alpha \nabla L(\boldsymbol{\theta}_t),\quad \boldsymbol{\theta}_{t+1} = \boldsymbol{\theta}_t + \mathbf{v}_t\) | 带有速度的梯度下降 | (T) |
| (8.3) | Adam更新 | \(\mathbf{m}_t = \beta_1 \mathbf{m}_{t-1} + (1-\beta_1)\mathbf{g}_t,\quad \mathbf{v}_t = \beta_2 \mathbf{v}_{t-1} + (1-\beta_2)\mathbf{g}_t^2\) | 自适应学习率 + 动量 | (T) |
| (8.4) | AdaGrad更新 | \(\mathbf{r}_t = \mathbf{r}_{t-1} + \mathbf{g}_t \odot \mathbf{g}_t,\quad \boldsymbol{\theta}_{t+1} = \boldsymbol{\theta}_t - \frac{\alpha}{\sqrt{\mathbf{r}_t + \epsilon}} \odot \mathbf{g}_t\) | 参数自适应学习率 | (T) |
| (8.5) | RMSProp更新 | \(\mathbf{r}_t = \beta \mathbf{r}_{t-1} + (1-\beta)\mathbf{g}_t \odot \mathbf{g}_t,\quad \boldsymbol{\theta}_{t+1} = \boldsymbol{\theta}_t - \frac{\alpha}{\sqrt{\mathbf{r}_t + \epsilon}} \odot \mathbf{g}_t\) | 指数衰减的AdaGrad | (T) |
| (8.6) | 批归一化前向 | \(\hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}},\quad y_i = \gamma \hat{x}_i + \beta\) | 减少内部协变量偏移 | (E) |
| (8.7) | 梯度裁剪 | \(\mathbf{g} = \mathbf{g} \cdot \min\left(1, \frac{c}{\|\mathbf{g}\|}\right)\) | 防止梯度爆炸 | (E) |
| (8.8) | BFGS更新 | \(\mathbf{B}_{t+1} = \mathbf{B}_t + \frac{\mathbf{y}_t\mathbf{y}_t^\top}{\mathbf{y}_t^\top\mathbf{s}_t} - \frac{\mathbf{B}_t\mathbf{s}_t\mathbf{s}_t^\top\mathbf{B}_t}{\mathbf{s}_t^\top\mathbf{B}_t\mathbf{s}_t}\) | 近似Hessian矩阵 | (T) |
| (8.9) | 共轭梯度更新 | \(\mathbf{p}_t = \mathbf{r}_t + \beta_t \mathbf{p}_{t-1},\quad \boldsymbol{\theta}_{t+1} = \boldsymbol{\theta}_t + \alpha_t \mathbf{p}_t\) | 保持共轭方向的迭代 | (T) |
| (8.10) | 信任域约束 | \(\min_{\Delta\boldsymbol{\theta}} L(\boldsymbol{\theta}_t + \Delta\boldsymbol{\theta}) \quad \text{s.t.} \quad \|\Delta\boldsymbol{\theta}\| \leq \epsilon\) | 限制参数更新的步长 | (T) |
注:(T)= 理论推导,(E)= 经验公式