1. 引言
在本篇文章中,我们将深入探讨 ADAM(Adaptive Moment Estimation)优化算法。它是目前训练机器学习模型最常用的优化算法之一,尤其在深度学习领域应用广泛。
2. 机器学习中的优化问题
在训练神经网络和支持向量机等模型时,我们的目标是找到一组参数,使得损失函数(cost function)最小化。损失函数衡量了模型预测值与真实标签之间的偏差。
多年来,研究者提出了多种优化算法:
- 随机梯度下降(SGD):使用小批量(mini-batch)数据计算梯度并更新参数;
- 动量法(Momentum):引入动量项,利用历史梯度方向加速收敛;
- 自适应学习率算法:根据梯度历史动态调整学习率,如 AdaGrad、RMSProp 等。
ADAM 结合了上述所有优点,它不仅使用小批量梯度更新,还结合了动量和自适应学习率机制,因此在实际应用中表现出色。
3. ADAM 算法详解
ADAM 的核心特性包括:
✅ 小批量梯度更新
✅ 自适应动量(Adaptive Momentum)
✅ 自适应学习率(Adaptive Learning Rate)
✅ 偏差校正(Bias Correction)
3.1. 自适应动量(Momentum)
设当前迭代为第 $ t $ 轮,参数向量为:
$$ \theta^{(t)} = \begin{bmatrix} \theta_1^{(t)} \ \theta_2^{(t)} \ \ldots \ \theta_n^{(t)} \end{bmatrix} $$
对应的梯度为:
$$ g^{(t)} = \begin{bmatrix} g_1^{(t)} \ g_2^{(t)} \ \ldots \ g_n^{(t)} \end{bmatrix} $$
在标准的 SGD 中,参数更新方式为:
$$ \theta^{(t+1)} = \theta^{(t)} - \alpha^{(t)} g^{(t)} $$
其中 $ \alpha^{(t)} $ 是学习率,通常会随着训练轮数衰减。
而 ADAM 不仅考虑当前梯度,还结合了历史梯度信息,定义动量项 $ s^{(t)} $ 为:
$$ s^{(t)} = \beta_1 s^{(t-1)} + (1 - \beta_1) g^{(t)} $$
其中 $ \beta_1 $ 是动量衰减因子,通常取值为 0.9。这个公式可以看作是历史梯度的加权平均,越早的梯度权重越小。
3.2. 偏差校正(Bias Correction)
由于动量 $ s^{(t)} $ 初始为 0,前几轮的估计值会有偏差。为了修正这一点,ADAM 引入了偏差校正机制:
$$ \hat{s}^{(t)} = \frac{s^{(t)}}{1 - \beta_1^t} $$
同理,对于梯度的二阶矩估计(见下节)也做类似处理:
$$ \hat{r}^{(t)} = \frac{r^{(t)}}{1 - \beta_2^t} $$
这样可以避免初始阶段估计值偏小的问题。
3.3. 自适应学习率(Adaptive Learning Rate)
ADAM 的另一个关键点是为每个参数分配不同的学习率。其核心思想是:如果某个参数在训练过程中更新频率较低,就给予更高的学习率。
ADAM 使用梯度平方的指数加权平均来估计每个参数的梯度方差:
$$ r^{(t)} = \beta_2 r^{(t-1)} + (1 - \beta_2) (g^{(t)} \odot g^{(t)}) $$
其中 $ \odot $ 表示按元素相乘。
最终的参数更新公式为:
$$ \theta^{(t+1)} = \theta^{(t)} - \epsilon \frac{\hat{s}^{(t)}}{\sqrt{\hat{r}^{(t)}} + \delta} $$
其中:
- $ \epsilon $ 是步长(step size),通常设为 0.001;
- $ \delta $ 是一个很小的常数(例如 $ 10^{-8} $),防止除以零。
3.4. 伪代码
下面是 ADAM 的标准伪代码(来自《Deep Learning》一书):
终止条件可以是:
- 达到最大迭代次数;
- 参数更新变化小于某个阈值;
- 损失函数变化趋于平稳。
4. 总结
ADAM 是一种结合了动量法和自适应学习率机制的优化算法,广泛应用于深度学习中。它通过以下方式提升训练效率:
- 使用动量项加速收敛;
- 对每个参数独立调整学习率;
- 引入偏差校正机制,避免初始阶段估计偏差;
- 支持小批量梯度更新,兼顾训练速度与稳定性。
虽然 ADAM 并非在所有场景下都最优,但在大多数实际任务中表现优异,是目前深度学习训练的默认选择之一。