深度学习优化算法
深度学习优化算法:SGD, RMSProp, AdaGrad, Adam 详解
在深度学习的训练过程中,优化算法扮演着至关重要的角色。它们决定了模型参数如何根据损失函数的梯度进行更新,从而影响着模型的收敛速度和最终性能。本文将深入介绍几种最常用和最基础的优化算法:SGD、RMSProp、AdaGrad 和 Adam,并分析它们的公式、优缺点。
1. 随机梯度下降 (Stochastic Gradient Descent, SGD)
SGD 是最基础的梯度下降算法的变种。与批量梯度下降(Batch Gradient Descent)一次性计算所有样本的梯度不同,SGD 每次只使用一个随机选择的样本来计算梯度并更新参数。
公式
假设损失函数为 \(J(\theta)\),学习率为 \(\eta\)。 对于参数 \(\theta\):
\( \theta_{t+1} = \theta_t - \eta \nabla J(\theta_t; x^{(i)}; y^{(i)}) \)
其中:
- \(\theta_t\) 是在时间步 \(t\) 的参数。
- \(\eta\) 是学习率。
- \(\nabla J(\theta_t; x^{(i)}; y^{(i)})\) 是在样本 \((x^{(i)}, y^{(i)})\) 上计算得到的梯度。
优点
- 计算效率高: 每次更新只使用一个样本,计算量小,速度快。
- 能够跳出局部最优: 由于梯度的随机性,SGD 有可能跳出局部最小值,找到更好的全局最小值。
- 内存占用少: 不需要存储整个数据集的梯度。
缺点
- 收敛过程震荡: 由于每次只使用一个样本,梯度方向可能不稳定,导致损失函数在收敛过程中出现较大的震荡。
- 学习率选择困难: 需要仔细调整学习率 \(\eta\),过大可能导致震荡不收敛,过小则收敛缓慢。
- 对稀疏数据不友好: 对于稀疏特征,其梯度可能非常小,导致更新缓慢。
2. AdaGrad (Adaptive Gradient)
AdaGrad 算法的核心思想是为每个参数维护一个累积的平方梯度,并根据这个累积值来调整该参数的学习率。它能够根据参数的历史梯度大小来自动调整学习率,对稀疏梯度表现更好。
公式
对于参数 \(\theta\):
- 计算当前梯度的平方: \(g_t^2\)
- 累积平方梯度: \( R_t = R_{t-1} + g_t^2 \) 其中 \(R_0 = 0\)。
- 更新参数: \( \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{R_t + \epsilon}} \odot g_t \)
其中:
- \(\theta_t\) 是在时间步 \(t\) 的参数。
- \(\eta\) 是全局学习率。
- \(g_t\) 是在时间步 \(t\) 计算得到的梯度。
- \(R_t\) 是参数 \(\theta\) 的所有历史梯度平方的总和。
- \(\epsilon\) 是一个很小的常数(例如 \(10^{-8}\)),用于防止除以零。
- \(\odot\) 表示逐元素乘法。
优点
- 自适应学习率: 为每个参数自动调整学习率,对稀疏梯度(出现频率低的参数)提供较大的学习率,对频繁出现的参数提供较小的学习率。
- 无需手动调整学习率: 在一定程度上减少了学习率调优的难度。
缺点
- 学习率衰减过快: 随着训练的进行,\(R_t\) 会不断累积增大,导致学习率不断减小,可能在模型尚未收敛时就停止学习。
- 无法处理非平稳目标: 对于梯度变化较大的目标函数,AdaGrad 的学习率衰减可能过快。
3. RMSProp (Root Mean Square Propagation)
RMSProp 算法是对 AdaGrad 的改进,它引入了指数衰减平均值来计算平方梯度的累积,而不是直接累加。这使得学习率的衰减更加平缓,避免了 AdaGrad 学习率过早衰减的问题。
公式
对于参数 \(\theta\):
- 计算当前梯度的平方: \(g_t^2\)
- 计算平方梯度的指数衰减平均值: \( E[g^2]_t = \beta E[g^2]_{t-1} + (1 - \beta) g_t^2 \) 其中 \(E[g^2]_0 = 0\)。
- 更新参数: \( \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \odot g_t \)
其中:
- \(\theta_t\) 是在时间步 \(t\) 的参数。
- \(\eta\) 是全局学习率。
- \(g_t\) 是在时间步 \(t\) 计算得到的梯度。
- \(E[g^2]_t\) 是参数 \(\theta\) 的平方梯度的指数衰减平均值。
- \(\beta\) 是衰减率(通常设置为 0.9)。
- \(\epsilon\) 是一个很小的常数(例如 \(10^{-8}\))。
- \(\odot\) 表示逐元素乘法。
优点
- 自适应学习率: 继承了 AdaGrad 的优点,能够为每个参数调整学习率。
- 解决学习率衰减过快问题: 通过指数衰减平均值,避免了学习率过早衰减。
- 在非平稳目标上表现更好: 对梯度变化较大的情况更鲁棒。
缺点
- 仍需调整学习率: 虽然缓解了 AdaGrad 的问题,但全局学习率 \(\eta\) 仍然需要调整。
- 没有动量: 没有考虑梯度的动量信息。
4. Adam (Adaptive Moment Estimation)
Adam 算法结合了 Momentum 和 RMSProp 的思想,同时维护了梯度的一阶矩估计(动量)和二阶矩估计(RMSProp),并进行了偏差修正。
公式
对于参数 \(\theta\):
- 计算一阶矩估计(动量): \( m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t \)
- 计算二阶矩估计(RMSProp): \( v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 \)
- 偏差修正: \( \hat{m}_t = \frac{m_t}{1 - \beta_1^t} \) \( \hat{v}_t = \frac{v_t}{1 - \beta_2^t} \)
- 更新参数: \( \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t + \epsilon}} \odot \hat{m}_t \)
其中:
- \(\theta_t\) 是在时间步 \(t\) 的参数。
- \(\eta\) 是全局学习率。
- \(g_t\) 是在时间步 \(t\) 计算得到的梯度。
- \(m_t\) 和 \(v_t\) 分别是一阶矩和二阶矩的估计。
- \(\beta_1\) 和 \(\beta_2\) 是衰减率(通常设置为 \(\beta_1=0.9\), \(\beta_2=0.999\))。
- \(\hat{m}_t\) 和 \(\hat{v}_t\) 是经过偏差修正后的估计。
- \(\epsilon\) 是一个很小的常数(例如 \(10^{-8}\))。
- \(\odot\) 表示逐元素乘法。
优点
- 自适应学习率和动量: 结合了两种方法的优点,收敛速度快,鲁棒性强。
- 对超参数不敏感: 默认参数通常效果很好,减少了调参的负担。
- 适用于稀疏梯度和非平稳目标。
- 计算高效,内存需求适中。
缺点
- 可能收敛到次优解: 在某些情况下,泛化能力可能不如 SGD。
- 内存消耗: 比 SGD 和 AdaGrad 需要更多的内存来存储一阶和二阶矩估计。
总结对比
| 算法 | 主要特点 | 优点 | 缺点 |
|---|---|---|---|
| SGD | 使用单个样本更新,梯度震荡 | 计算快,内存占用少,可能跳出局部最优 | 收敛震荡,学习率敏感,对稀疏数据不友好 |
| AdaGrad | 累积平方梯度,自适应学习率 | 对稀疏梯度友好,无需手动调学习率 | 学习率衰减过快,可能停止学习 |
| RMSProp | 平方梯度的指数衰减平均值,自适应学习率 | 解决 AdaGrad 学习率衰减过快问题,对非平稳目标更鲁棒 | 仍需调整学习率,无动量 |
| Adam | 一阶矩(动量)+ 二阶矩(RMSProp)+ 偏差修正 | 收敛快,鲁棒性强,对超参数不敏感,适用于稀疏梯度和非平稳目标 | 可能收敛到次优解,内存消耗比 SGD 大 |
在实际应用中,Adam 通常是许多深度学习任务的默认选择,因为它在大多数情况下都能提供良好的性能和快速的收敛。然而,了解其他算法的原理和优缺点,有助于在特定场景下做出更优的选择。