随机梯度下降 (gradient descent) (SGD)、动量 (Momentum) 和 Nesterov 加速梯度 (NAG) 是主要的优化算法。通过实际观察它们的行为,可以显著加深对其机制的理解。一个实践方法是建立一个简单的优化问题,并使用可视化方法来分析这些算法如何遍历损失曲面并接近最小值。目标不仅仅是运行代码,更是解读结果,将观察到的收敛模式与相关理论观点联系起来。
设立受控实验
为了有效比较优化器,我们需要一个统一的测试环境。让我们考虑一个标准问题,例如最小化一个简单的二次函数,或者在一个小型(可能是合成)数据集上训练逻辑回归模型。重点在于一致性:
- 目标函数: 对所有优化器使用完全相同的损失函数 (loss function)。
- 数据: 每次运行使用完全相同的数据集(如果适用,包括批处理策略)。
- 初始化: 从完全相同的初始参数 (parameter)值 (w0) 开始所有优化器。
- 迭代次数: 让每个优化器运行相同数量的迭代或周期。
我们将跟踪每个优化器在每次迭代(或处理每个批次后)的损失值。将这些损失值与迭代次数绘制在一起,可以得到收敛曲线。
让我们考虑优化一个简单的二次函数,例如 f(w1,w2)=(w1−5)2+(w2−3)2。尽管它是凸函数且简单,但它有助于说明基本的动态特性。我们将从 (w1,w2)=(0,0) 这样的点开始所有优化器。
实现核心逻辑
假设我们有函数可以计算所选问题的损失及其梯度 ∇f(w)。我们将比较的核心更新规则是:
1. SGD(随机梯度下降 (gradient descent)):
wt+1=wt−η∇f(wt)
η 为学习率。
2. 动量:
vt+1=βvt+η∇f(wt)
wt+1=wt−vt+1
β 为动量系数(例如 0.9),且 v0=0。
3. Nesterov 加速梯度 (NAG):
vt+1=βvt+η∇f(wt−βvt)
wt+1=wt−vt+1
梯度是在“前瞻”位置 wt−βvt 计算的。
(注意:实际实现通常使用略有不同但等价的公式,特别是对于 NAG。我们将关注差异。)
可视化与分析收敛曲线
在每个优化器运行固定数量的迭代(例如 100 次)后,我们绘制了每次迭代的损失。
SGD、动量和 NAG 在简单二次目标上的收敛曲线,损失值采用对数尺度绘制。请注意动量算法,特别是 NAG 实现的更快下降。
分析:
- SGD: 观察损失的稳定下降。在这个简单的凸问题上,它可靠地趋向最小值。它的速率可能比其他方法慢。
- 动量: 注意损失通常比 SGD 下降得更快,尤其是在初始步骤之后。动量项有助于加速在一致下降方向上的移动。有时可能会出现轻微的过冲或振荡,但通常它会更快达到较低的损失值。
- NAG: 通常,NAG 显示出最快的初始收敛速度。前瞻梯度计算使其能够预测变化并更有效地调整其轨迹,通常能更快收敛,并且可能比标准动量算法更好地抑制振荡。
学习率的影响
学习率 (η) 是一个重要的超参数 (parameter) (hyperparameter)。让我们可视化它对单个优化器(如 SGD)的影响。
比较不同学习率下的 SGD 收敛情况。学习率过低导致进展缓慢,过高导致发散,而合适的学习率则能实现快速收敛。
分析:
- 过低 (η=0.01): 收敛非常缓慢。所采取的步长太小,无法在给定迭代次数内有效达到最小值。
- 适中 (η=0.1): 损失迅速下降并有效达到最小值。
- 过高 (η=0.5): 优化器发散。步长过大,跳过最小值并导致损失急剧增加。这强调了收敛对学习率的敏感性。
可以运行类似的实验,改变动量和 NAG 的动量系数 (β),以观察它如何影响平滑和加速效果。
考察非凸场景
“虽然二次函数的例子具有指导意义,但机器学习 (machine learning)问题,尤其是在深度学习 (deep learning)中,涉及高度非凸的损失曲面。在非凸函数上运行这些优化器(即使是像 Rastrigin 函数这样简单的二维函数)可以展现不同的行为:”
- 局部最小值: 所有这些一阶方法都可能陷入局部最小值。最终收敛的损失可能因初始化和优化器的路径而异。
- 鞍点: 与普通 SGD 相比,动量和 NAG 在逃离鞍点方面可能略胜一筹,因为动量项可以帮助它们穿过平坦区域。然而,它们并非完全不受影响。
- 平台: 在平台(梯度非常小但不为零的区域)上的表现也可能有所不同。动量可能有助于比 SGD 更快地通过平台。
分析这些情况下的收敛图通常会显示快速下降后出现停滞(局部最小值或平台)或更不稳定的行为。
分析要点
在分析基础优化器的收敛图时:
- 下降速度: 观察损失曲线的斜率(尤其是在对数尺度上)。更陡的斜率表示更快的收敛。比较不同优化器降低损失的速度。
- 稳定性: 损失是单调下降还是振荡?振荡可能表明学习率略高或存在复杂的相互影响。剧烈振荡或损失增加表明发散。
- 最终损失值: 损失似乎在哪里趋于平稳?对于凸问题,这应该接近全局最小值。对于非凸问题,比较不同优化器或不同运行所达到的最终损失值——它们可能收敛到不同的点。
- 超参数 (parameter) (hyperparameter)的影响: 系统地改变学习率和动量系数,以理解它们对收敛速度和稳定性的影响。
这些实际观察构成了理解更高级优化技术发展原因的基础。在这里看到的局限性,例如对学习率的敏感性、在某些损失曲面上的收敛缓慢以及非凸性问题,促使了自适应学习率方法(第三章)和二阶方法(第二章)的出现,我们将在后面考察这些内容。