2025-08-25
算法
00

目录

Intuition 理解
移动平均(Exponentially Moving Average, EMA)
Adam算法原理
核心思想: Adam 结合了两种经典优化算法的优点:
Adam 算法的详细步骤

Adam(Adaptive Moment Estimation)是一种用于训练深度学习模型的优化算法。它在 2014 年由 Diederik P. Kingma 和 Jimmy Ba 提出,并迅速成为深度学习领域最流行和最常用的优化器之一。

Intuition 理解

举一个例子: 想象一个球从山坡上滚下来。在重力的作用下,它会越滚越快,并且由于惯性(动量),它会保持当前的前进方向。即使遇到一些小的颠簸(梯度方向的轻微改变),它也能凭借惯性冲过去,而不是轻易改变方向。

Momentum 算法就是借鉴了这一思想。它不仅仅考虑当前参数的梯度方向,还引入了一个“动量”项,这个动量是过去所有梯度方向的指数加权移动平均值。

这样做的好处是:

  • 加速收敛:如果梯度方向连续保持一致,动量会累积,使得参数更新的步子迈得更大,从而加速学习过程。

  • 减少震荡:在梯度方向变化剧烈时,历史动量可以起到平滑作用,抑制参数更新的摆动,使其更稳定地朝最优解前进。

存在的问题: 因为要为每一个梯度都维持额外的参数状态,会导致显存随着模型急剧增大。尤其是大模型训练,优化器维护的状态会占据大量的显存。

移动平均(Exponentially Moving Average, EMA)

移动平均,又叫指数平滑。可以用来做一些简单的预测,其核心公式如下:

yt=βyt1+(1β)xt,    y0=0y_{t}=\beta y_{t-1}+( 1-\beta) x_{t} , \; \; y_{0}=0

将公式看作一个预测系统, yy是系统预测输出,xx是观察输入,tt表示时间step步数。β[01]\beta \in [0 ~1]参数表示对上一次系统输入的信任度,β\beta越大,越信任上一次的输出yt1y_{t-1},反之越信任本次的观测xtx_t

将公式递推展开:

yt=βyt1+(1β)xt=(1β)(βt1x1++β1xt1+β0xt)y_{t}=\beta y_{t-1}+( 1-\beta) x_{t}=( 1-\beta) ( \beta^{t-1} x_{1}+\ldots+\beta^{1} x_{t-1}+\beta^{0} x_{t} )

可以观察到移动平均的另一个特性,β0>βi>βt1\beta^0 > \beta^{i} > \beta^{t-1} [i(0,t1)][i \in (0,t-1)]: 该系统更重视离tt更近的观测值,更信任最近的观测数据,时间越久,重要性呈现指数衰减。

Adam算法原理

核心思想: Adam 结合了两种经典优化算法的优点:

动量(Momentum): 借鉴了物理学中动量的概念,通过累积过去的梯度来加速收敛,并减少在梯度方向变化剧烈时的震荡。

RMSprop(Root Mean Square Propagation): 为每个参数独立地调整学习率。它通过使用梯度的平方的移动平均值来缩放学习率,使得在梯度较大的方向上学习率减小,在梯度较小的方向上学习率增大。

Adam 通过计算梯度的一阶矩估计(First Moment Estimate,即动量项) 和二阶矩估计(Second Moment Estimate,即 RMSprop 项),并对它们进行偏差校正,从而为每个参数设计出独立的、自适应的学习率。

Adam 算法的详细步骤

假设我们要优化的参数是 θ\theta,损失函数是 J(θ)J(\theta)。算法的执行过程如下:

1. 初始化参数

  • 学习率(Learning Rate):α\alpha (通常建议值为 0.001)
  • 一阶矩估计的指数衰减率:β1\beta_1 (通常建议值为 0.9)
  • 二阶矩估计的指数衰减率:β2\beta_2 (通常建议值为 0.999)
  • 数值稳定性常数:ϵ\epsilon (通常建议值为 10810^{-8}
  • 参数:θ0\theta_0 (随机初始化)
  • 一阶矩向量:m0=0m_0 = 0
  • 二阶矩向量:v0=0v_0 = 0
  • 时间步(Time step):t=0t = 0

2. 训练循环

在每一次迭代(时间步 tt)中,执行以下计算:

步骤一:计算当前梯度

首先,计算损失函数 J(θ)J(\theta) 关于当前参数 θt1\theta_{t-1} 的梯度:

gt=θJ(θt1)g_t = \nabla_{\theta} J(\theta_{t-1})

步骤二:更新有偏一阶矩估计(动量项)

计算梯度 gtg_t 的指数移动平均值,这被称为一阶矩估计 mtm_t。它保留了过去梯度的方向信息。

mt=β1mt1+(1β1)gtm_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t

这里的 mtm_t 是对梯度均值(一阶矩)的估计。

步骤三:更新有偏二阶矩估计(RMSprop 项)

计算梯度平方 gt2g_t^2 的指数移动平均值,这被称为二阶矩估计 vtv_t。它保留了过去梯度的大小信息。注意,gt2g_t^2 是逐元素(element-wise)的平方。

vt=β2vt1+(1β2)gt2v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2

这里的 vtv_t 是对梯度未中心化方差(二阶矩)的估计。

步骤四:计算偏差校正后的一阶矩估计

由于 m0m_0v0v_0 初始化为 0,在训练初期,mtm_tvtv_t 会偏向于 0。为了修正这种偏差,Adam 引入了偏差校正(Bias Correction)。

m^t=mt1β1t\hat{m}_t = \frac{m_t}{1 - \beta_1^t}

tt 很小时,(1β1t)(1 - \beta_1^t) 也很小,这会放大 mtm_t 的值,从而缓解其偏向 0 的问题。随着 tt 的增大,(1β1t)(1 - \beta_1^t) 趋近于 1,偏差校正的作用会逐渐消失。

步骤五:计算偏差校正后的二阶矩估计

同样地,对二阶矩估计 vtv_t 进行偏差校正:

v^t=vt1β2t\hat{v}_t = \frac{v_t}{1 - \beta_2^t}

步骤六:更新模型参数

最后,使用经过校正的一阶和二阶矩估计来更新参数 θ\theta

θt=θt1αm^tv^t+ϵ\theta_t = \theta_{t-1} - \alpha \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}
  • α\alpha:全局学习率,控制整体的更新步长。
  • m^t\hat{m}_t:提供了梯度的方向和大小,类似于动量。
  • v^t\sqrt{\hat{v}_t}:作为分母,为每个参数提供了自适应的学习率。
    • 如果某个参数的梯度历史值一直很大(v^t\hat{v}_t 很大),那么其实际学习率会变小,从而减缓更新,防止步子迈得太大。
    • 如果某个参数的梯度历史值一直很小(v^t\hat{v}_t 很小),那么其实际学习率会变大,从而加速更新。
  • ϵ\epsilon:一个非常小的数,用于防止分母为零,保证数值稳定性。设为1e-7或1e-8即可。

本文作者:James

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!