菜单

优化算法

相关源文件

本文档涵盖了用于最小化损失函数深度学习优化算法。优化是神经网络训练过程中的核心组成部分,我们旨在找到最小化误差的参数。虽然有许多优化方法,但本文侧重于深度学习中常用的基于梯度的方法,包括随机梯度下降 (SGD) 及其变体,以及自适应学习率方法。有关学习率调度,请参阅 学习率调度器

优化与深度学习的关系

优化技术为最小化深度学习模型中的损失函数提供了方法。然而,优化和深度学习的目标在重要方面有所不同。

  1. 不同的目标:优化旨在最小化目标函数(训练损失),而深度学习旨在找到泛化误差小的良好模型。
  2. 有限数据:在深度学习中,我们处理的是有限数据,需要确保模型能够泛化到训练集之外。
  3. 非凸性:深度学习优化问题通常是非凸的,存在局部最小值、鞍点和梯度消失等挑战。

来源:[chapter_optimization/optimization-intro.md:84-123]

基于梯度的方法

梯度下降

最简单的优化算法是梯度下降,它迭代地沿最陡峭的下降方向更新参数。

x ← x - η∇f(x)

其中 η 是学习率,∇f(x) 是目标函数的梯度。学习率至关重要。

  • 太小:收敛速度慢。
  • 太大:算法可能发散。

对于多维问题,梯度下降计算每个维度的偏导数,并同时更新所有参数。

来源:[chapter_optimization/gd.md:1-44], [chapter_optimization/gd.md:191-211]

随机梯度下降 (SGD)

SGD 在每一步通过在一个随机选择的样本上计算梯度来近似真实梯度。

x ← x - η∇f(x; ξ)

其中 ξ 代表一个随机选择的数据点。SGD 引入了噪声,但在数据集很大时提供了计算优势。

来源:[chapter_optimization/minibatch-sgd.md:4-9]

小批量随机梯度下降

小批量 SGD 通过在小批量数据上计算梯度,在全批量梯度下降和纯 SGD 之间取得了平衡。

x ← x - η∇f(x; B)

其中 B 是一个示例的小批量。此方法提供了:

  1. 通过向量化提高了计算效率。
  2. 与 SGD 相比,梯度估计的方差减小。
  3. 更好地利用硬件(GPU、并行处理)。

来源:[chapter_optimization/minibatch-sgd.md:242-270], [chapter_optimization/minibatch-sgd.md:10-46]

自适应方法

动量

动量通过累积目标函数持续减少方向上的速度向量来加速收敛。

v ← βv - η∇f(x)
x ← x + v

其中 β 是动量参数(通常为 0.9)。动量有助于:

  1. 在一致的方向上加速前进。
  2. 抑制高曲率方向的振荡。
  3. 跳出平坦区域和浅局部最小值。

来源:[chapter_optimization/momentum.md:140-173], [chapter_optimization/momentum.md:20-54]

AdaGrad

AdaGrad 根据历史梯度单独调整每个参数的学习率。

s ← s + g²
x ← x - η/√(s+ε) * g

其中:

  • g 是当前梯度。
  • s 累积平方梯度。
  • ε 是数值稳定性的一个小的常数。

AdaGrad 通过对不常出现的参数进行更大的更新,能很好地处理稀疏特征,但其不断累积的和可能导致学习过早停止。

来源:[chapter_optimization/adagrad.md:92-112], [chapter_optimization/adagrad.md:4-30]

RMSProp

RMSProp 修改了 AdaGrad,通过使用平方梯度的移动平均来在非凸设置中表现更好。

s ← γs + (1-γ)g²
x ← x - η/√(s+ε) * g

其中 γ 是衰减因子(通常为 0.9 或 0.99)。这可以防止学习率随时间变得太小。

来源:[chapter_optimization/rmsprop.md:18-41]

Adam

Adam 结合了动量和 RMSProp 的思想,维护:

  1. 梯度的移动平均(一阶矩)。
  2. 平方梯度的移动平均(二阶矩)。
v ← β₁v + (1-β₁)g
s ← β₂s + (1-β₂)g²
v̂ ← v/(1-β₁ᵗ)  # Bias correction
ŝ ← s/(1-β₂ᵗ)  # Bias correction
x ← x - η * v̂/√(ŝ+ε)

其中 β₁ 和 β₂ 是衰减率(通常为 0.9 和 0.999)。偏差校正有助于训练的初始步骤。

来源:[chapter_optimization/adam.md:21-51]

Adadelta

Adadelta 扩展了 AdaGrad,解决了其学习率衰减的问题,而无需设置全局学习率。

s ← ρs + (1-ρ)g²
g' ← √(Δx+ε)/√(s+ε) * g
x ← x - g'
Δx ← ρΔx + (1-ρ)g'²

其中 Δx 存储了平方参数更新的移动平均。

来源:[chapter_optimization/adadelta.md:10-38]

优化算法比较

算法更新规则优点挑战
SGDx ← x - η∇f(x; ξ)简单,在大数据集上效果好。对学习率敏感,收敛慢。
小批量 SGDx ← x - η∇f(x; B)更好的向量化,减小了方差。需要调整批量大小。
动量v ← βv - η∇f(x); x ← x + v加速收敛,减小振荡。额外的超参数 β。
AdaGrads ← s + g²; x ← x - η/√(s+ε) * g自适应地调整每个参数的学习率。学习可能过早停止。
RMSProps ← γs + (1-γ)g²; x ← x - η/√(s+ε) * g防止学习率过早衰减。需要调整 γ。
Adam结合了动量和 RMSProp,并进行偏差校正。通常收敛更快,对超参数不敏感。计算开销更大。
Adadelta使用参数变化而不是学习率。无需设置学习率。实现复杂。

实际考量

实现示例

在深度学习框架中实现时,所有基于梯度的方法都遵循类似的模式。

  1. 计算损失相对于参数的梯度。
  2. 根据优化器规则更新参数。
  3. 重复直到收敛。

来源:[chapter_optimization/minibatch-sgd.md:381-423]

选择优化器

在为深度学习选择优化算法时:

  1. 带动量的 SGD:一个好的基线,通常效果不错。
  2. Adam:通常收敛更快,对超参数不敏感。
  3. RMSProp:适用于 RNN 和具有非平稳目标的问题。
  4. AdaGrad:适用于稀疏特征。

对于许多应用,Adam 由于其自适应学习率和动量特性,是一个合理的默认选择,而当正确调整时,带动量的 SGD 通常能提供最佳的泛化性能。

来源:[chapter_optimization/adam.md:295-308]

学习率选择

学习率是所有优化算法最关键的超参数。

  • 太大:训练可能发散。
  • 太小:训练可能太慢或卡在糟糕的局部最小值。

Adam 等自适应方法对学习率选择的敏感度较低,但仍需要进行调整。

来源:[chapter_optimization/optimization-intro.md:85-89]

总结

优化算法是深度学习中的重要工具,它们使我们能够有效地训练模型。该领域已经从简单的梯度下降发展到能够自动调整每个参数的学习率的复杂自适应方法。虽然没有一种算法适用于所有问题,但了解每种方法的优缺点有助于为特定任务选择合适的优化器。

每种算法在以下方面做出不同的权衡:

  • 收敛速度。
  • 计算复杂度。
  • 内存需求。
  • 调参的难易程度。
  • 最终模型质量。

在实践中,Adam 和带动量的 SGD 由于其在各种深度学习任务中的稳健性能,仍然是最广泛使用的优化算法之一。