本文档涵盖了用于最小化损失函数深度学习优化算法。优化是神经网络训练过程中的核心组成部分,我们旨在找到最小化误差的参数。虽然有许多优化方法,但本文侧重于深度学习中常用的基于梯度的方法,包括随机梯度下降 (SGD) 及其变体,以及自适应学习率方法。有关学习率调度,请参阅 学习率调度器。
优化技术为最小化深度学习模型中的损失函数提供了方法。然而,优化和深度学习的目标在重要方面有所不同。
来源:[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 在每一步通过在一个随机选择的样本上计算梯度来近似真实梯度。
x ← x - η∇f(x; ξ)
其中 ξ 代表一个随机选择的数据点。SGD 引入了噪声,但在数据集很大时提供了计算优势。
来源:[chapter_optimization/minibatch-sgd.md:4-9]
小批量 SGD 通过在小批量数据上计算梯度,在全批量梯度下降和纯 SGD 之间取得了平衡。
x ← x - η∇f(x; B)
其中 B 是一个示例的小批量。此方法提供了:
来源:[chapter_optimization/minibatch-sgd.md:242-270], [chapter_optimization/minibatch-sgd.md:10-46]
动量通过累积目标函数持续减少方向上的速度向量来加速收敛。
v ← βv - η∇f(x)
x ← x + v
其中 β 是动量参数(通常为 0.9)。动量有助于:
来源:[chapter_optimization/momentum.md:140-173], [chapter_optimization/momentum.md:20-54]
AdaGrad 根据历史梯度单独调整每个参数的学习率。
s ← s + g²
x ← x - η/√(s+ε) * g
其中:
AdaGrad 通过对不常出现的参数进行更大的更新,能很好地处理稀疏特征,但其不断累积的和可能导致学习过早停止。
来源:[chapter_optimization/adagrad.md:92-112], [chapter_optimization/adagrad.md:4-30]
RMSProp 修改了 AdaGrad,通过使用平方梯度的移动平均来在非凸设置中表现更好。
s ← γs + (1-γ)g²
x ← x - η/√(s+ε) * g
其中 γ 是衰减因子(通常为 0.9 或 0.99)。这可以防止学习率随时间变得太小。
来源:[chapter_optimization/rmsprop.md:18-41]
Adam 结合了动量和 RMSProp 的思想,维护:
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 扩展了 AdaGrad,解决了其学习率衰减的问题,而无需设置全局学习率。
s ← ρs + (1-ρ)g²
g' ← √(Δx+ε)/√(s+ε) * g
x ← x - g'
Δx ← ρΔx + (1-ρ)g'²
其中 Δx 存储了平方参数更新的移动平均。
来源:[chapter_optimization/adadelta.md:10-38]
| 算法 | 更新规则 | 优点 | 挑战 |
|---|---|---|---|
| SGD | x ← x - η∇f(x; ξ) | 简单,在大数据集上效果好。 | 对学习率敏感,收敛慢。 |
| 小批量 SGD | x ← x - η∇f(x; B) | 更好的向量化,减小了方差。 | 需要调整批量大小。 |
| 动量 | v ← βv - η∇f(x); x ← x + v | 加速收敛,减小振荡。 | 额外的超参数 β。 |
| AdaGrad | s ← s + g²; x ← x - η/√(s+ε) * g | 自适应地调整每个参数的学习率。 | 学习可能过早停止。 |
| RMSProp | s ← γs + (1-γ)g²; x ← x - η/√(s+ε) * g | 防止学习率过早衰减。 | 需要调整 γ。 |
| Adam | 结合了动量和 RMSProp,并进行偏差校正。 | 通常收敛更快,对超参数不敏感。 | 计算开销更大。 |
| Adadelta | 使用参数变化而不是学习率。 | 无需设置学习率。 | 实现复杂。 |
在深度学习框架中实现时,所有基于梯度的方法都遵循类似的模式。
来源:[chapter_optimization/minibatch-sgd.md:381-423]
在为深度学习选择优化算法时:
对于许多应用,Adam 由于其自适应学习率和动量特性,是一个合理的默认选择,而当正确调整时,带动量的 SGD 通常能提供最佳的泛化性能。
来源:[chapter_optimization/adam.md:295-308]
学习率是所有优化算法最关键的超参数。
Adam 等自适应方法对学习率选择的敏感度较低,但仍需要进行调整。
来源:[chapter_optimization/optimization-intro.md:85-89]
优化算法是深度学习中的重要工具,它们使我们能够有效地训练模型。该领域已经从简单的梯度下降发展到能够自动调整每个参数的学习率的复杂自适应方法。虽然没有一种算法适用于所有问题,但了解每种方法的优缺点有助于为特定任务选择合适的优化器。
每种算法在以下方面做出不同的权衡:
在实践中,Adam 和带动量的 SGD 由于其在各种深度学习任务中的稳健性能,仍然是最广泛使用的优化算法之一。