目录

深度学习优化算法

深度学习优化算法: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$:

  1. 计算当前梯度的平方: $g_t^2$
  2. 累积平方梯度: $ R_t = R_{t-1} + g_t^2 $ 其中 $R_0 = 0$。
  3. 更新参数: $ \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$:

  1. 计算当前梯度的平方: $g_t^2$
  2. 计算平方梯度的指数衰减平均值: $ E[g^2]t = \beta E[g^2]{t-1} + (1 - \beta) g_t^2 $ 其中 $E[g^2]_0 = 0$。
  3. 更新参数: $ \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$:

  1. 计算一阶矩估计(动量): $ m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t $
  2. 计算二阶矩估计(RMSProp): $ v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 $
  3. 偏差修正: $ \hat{m}_t = \frac{m_t}{1 - \beta_1^t} $ $ \hat{v}_t = \frac{v_t}{1 - \beta_2^t} $
  4. 更新参数: $ \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 通常是许多深度学习任务的默认选择,因为它在大多数情况下都能提供良好的性能和快速的收敛。然而,了解其他算法的原理和优缺点,有助于在特定场景下做出更优的选择。