随机梯度下降 (SGD)、动量 (Momentum) 和 Nesterov 加速梯度 (NAG) 等优化器是训练深度学习模型的常用方法。这些方法之间的一个共同点是使用单一的全局学习率,通常表示为 $\alpha$。此学习率根据计算出的梯度,决定了更新模型所有参数的步长。虽然学习率调度等技术(我们将在后面讨论)可以随时间调整此全局学习率,但在单次更新步中,它对每个参数保持不变。然而,这种统一的方法在训练复杂的深度神经网络时可能低效甚至存在问题。为什么?因为“理想”的步长可能不适用于所有参数。我们来思考几个单一学习率表现不足的情况。单一学习率遇到的问题特征重要性和频率差异:想象在数据上训练一个模型,其中某些输入特征非常常见,而另一些则很少出现。与稀有特征相关的参数可能偶尔才能接收到有用的梯度。适合常见特征的小全局学习率,可能导致这些参数更新速度极慢,阻碍模型从那些稀有但可能重要的信号中进行学习的能力。反之,过大的学习率可能导致与常见特征相关的参数越过其最优值。层间梯度尺度差异:深度网络不同层之间的梯度幅度通常差异很大。与前几层相比,后几层的梯度可能大得多(或者反之,取决于网络架构和激活函数)。一个对某一层有效的学习率,对另一层可能过大(导致发散)或过小(导致学习缓慢)。在所有地方应用相同的学习率会迫使我们做出折衷,这可能对网络的任何部分都不是最优的。复杂损失函数形态:深度网络的损失函数很少形成简单的对称碗状。通常,它呈现出复杂的形状,带有狭长的山谷(峡谷)、平坦高原和鞍点。思考一个细长损失曲面的简单可视化实例:{"data": [{"type": "contour", "z": [[10.1, 10.4, 11.3, 13.1, 15.9, 19.9, 25.1, 31.5, 39.1, 47.9, 57.9], [4.1, 4.4, 5.3, 7.1, 9.9, 13.9, 19.1, 25.5, 33.1, 41.9, 51.9], [1.0, 1.3, 2.2, 4.0, 6.8, 10.8, 16.0, 22.4, 30.0, 38.8, 48.8], [0.1, 0.4, 1.3, 3.1, 5.9, 9.9, 15.1, 21.5, 29.1, 37.9, 47.9], [0.4, 0.1, 0.4, 2.2, 5.0, 9.0, 14.2, 20.6, 28.2, 37.0, 47.0], [1.0, 0.7, 0.0, 1.3, 4.1, 8.1, 13.3, 19.7, 27.3, 36.1, 46.1], [2.0, 1.7, 1.0, 0.8, 3.1, 7.1, 12.3, 18.7, 26.3, 35.1, 45.1], [3.3, 3.0, 2.3, 1.9, 1.8, 5.3, 10.5, 16.9, 24.5, 33.3, 43.3], [5.0, 4.7, 4.0, 3.6, 3.0, 3.9, 9.1, 15.5, 23.1, 31.9, 41.9], [7.0, 6.7, 6.0, 5.6, 4.8, 3.5, 8.0, 14.4, 22.0, 30.8, 40.8], [9.4, 9.1, 8.4, 8.0, 7.1, 5.5, 6.4, 12.5, 20.1, 28.9, 38.9]], "x": [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5], "y": [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5], "colorscale": "Blues", "reversescale": true, "contours": {"coloring": "heatmap", "start": 0, "end": 50, "size": 5}}], "layout": {"title": "非球形损失曲面示例", "xaxis": {"title": "参数 w1"}, "yaxis": {"title": "参数 w2"}, "width": 500, "height": 400, "margin": {"l": 50, "r": 20, "t": 60, "b": 50}}}此等高线图显示了一个损失函数,其中沿水平轴 (w1) 的进展远比沿陡峭垂直轴 (w2) 的进展容易。在这种情况下,梯度沿 $w_2$ 方向比沿 $w_1$ 方向陡峭得多。如果我们使用全局学习率 $\alpha$:如果 $\alpha$ 足够大,可以在浅 $w_1$ 方向上取得良好进展,它对于陡峭的 $w_2$ 方向可能过大,导致更新在山谷中剧烈来回振荡,可能导致发散。如果 $\alpha$ 足够小以避免 $w_2$ 方向的振荡,沿 $w_1$ 方向的进展将非常缓慢。带有动量或 NAG 的 SGD 可以帮助平滑振荡并加速沿浅方向的进展,但它们仍然使用单一学习率,限制了它们在高度非球形曲面上的有效性。自适应方法理想情况下,我们希望有一种优化算法,能够独立地为每个参数调整步长。它应该能够:对于与平缓斜坡或不常见特征相关的参数,采取更大的步长。对于与陡峭斜坡或非常常见特征相关的参数,采取更小的步长。这正是自适应学习率算法的原理所在。AdaGrad、RMSprop 和 Adam 等方法维护每个参数的过往梯度信息,并使用这些历史数据单独调整学习率。它们有效地为每个参数提供了在训练期间动态变化的独立学习率。通过逐参数调整学习率,这些算法通常能更有效地应对复杂的损失曲面,从而加快收敛速度,有时能找到更好的解,与标准 SGD 或其动量变体相比,特别是在默认超参数设置下表现更优。在接下来的章节中,我们将了解 AdaGrad、RMSprop 和 Adam 的具体机制,以明白它们如何达到这种自适应调整行为。