Adam优化器(理论、公式、代码)

Adam

Adam(Adaptive Moment Estimation)是一种广泛使用的深度学习优化算法,由 Diederik P. Kingma 和 Jimmy Ba 在 2014 年提出。它结合了动量法(Momentum)和 RMSProp 的思想,旨在通过计算梯度的一阶矩估计和二阶矩估计来调整每个参数的学习率,从而实现更高效的网络训练。

提出的契机

在 Adam 提出之前,研究者们已经在使用像 Momentum 和 RMSProp 这样的优化算法来加速深度神经网络的训练过程。然而,这些算法各有优势和局限。Momentum 善于处理梯度的方向和大小,而 RMSProp 善于调整学习率以应对数据的稀疏性。Adam 的提出是为了结合这两种算法的优点,同时减少它们的缺点,提供一种更加鲁棒的优化解决方案。

理论与公式

Adam 算法的关键在于同时计算梯度的一阶矩(均值)和二阶矩(未中心的方差)的指数移动平均,并对它们进行偏差校正,以确保在训练初期时梯度估计不会偏向于 0。

算法的更新规则如下:

  • While 条件:
    • g = ∇ θ k − 1 L ( θ ) g = \nabla_{\theta_{k-1}} L(\theta) g=θk1L(θ)
    • m k = β 1 m k − 1 + ( 1 − β 1 ) g m_{k} = \beta_1 m_{k-1} + (1 - \beta_1) g mk=β1mk1+(1β1)g
    • v k = β 2 v k − 1 + ( 1 − β 2 ) g ⊙ g v_{k} = \beta_2 v_{k-1} + (1 - \beta_2) g \odot g vk=β2vk1+(1β2)gg
    • m ^ k = m k 1 − β 1 k \hat{m}_{k} = \frac{m_{k}}{1 - \beta_1^k} m^k=1β1kmk
    • v ^ k = v k 1 − β 2 k \hat{v}_{k} = \frac{v_{k}}{1 - \beta_2^k} v^k=1β2kvk
    • θ k = θ k − 1 − η v ^ k + ϵ m ^ k \theta_{k} = \theta_{k-1} - \frac{\eta}{\sqrt{\hat{v}_{k}} + \epsilon} \hat{m}_{k} θk=θk1v^k +ϵηm^k

其中, m k m_{k} mk v k v_{k} vk 分别是梯度的一阶矩和二阶矩的估计, β 1 \beta_1 β1 β 2 \beta_2 β2 是控制这两个矩估计的指数衰减率,通常设置为 0.9 和 0.999。 ϵ \epsilon ϵ是一个非常小的数(例如1e-8),防止除以零。 k是当前迭代次数,用于做偏差校正

  • β 1 k = β 1 × β 1 × … × β 1 \beta_1^k = \beta_1 \times \beta_1 \times \ldots \times \beta_1 β1k=β1×β1××β1 (共乘以 k k k 次)
  • β 2 k = β 2 × β 2 × … × β 2 \beta_2^k = \beta_2 \times \beta_2 \times \ldots \times \beta_2 β2k=β2×β2××β2 (共乘以 k k k 次)

在 Adam 优化算法中, β 1 k \beta_1^k β1k β 2 k \beta_2^k β2k 用于进行偏差校正(bias correction)。这是因为在算法的初期,由于 m k m_k mk v k v_k vk(分别是梯度的一阶矩和二阶矩的估计)是从 0 开始初始化的,会导致它们在初始阶段被低估。特别是当 β 1 \beta_1 β1 β 2 \beta_2 β2 接近 1 时,这个偏差会更加显著。为了补偿这种估计的偏差,Adam 算法引入了偏差校正步骤。

偏差校正的作用

  • m k m_k mk的偏差校正: 初始时刻,一阶矩 m k m_k mk 的值偏小,因为它是梯度值的加权平均,起始所有梯度都被初始化为 0。通过除以 1 − β 1 k 1 - \beta_1^k 1β1k,可以将 m k m_k mk 的值放大,使其更快地接近实际的梯度均值。随着迭代次数 k k k的增加, β 1 k \beta_1^k β1k 会趋向于 0,偏差校正因子 1 − β 1 k 1 - \beta_1^k 1β1k 就会趋向于 1,偏差校正的影响会逐渐减小。

  • v k v_k vk 的偏差校正: 类似地,二阶矩 v k v_k vk(梯度平方的加权平均)也会在初始阶段被低估。通过除以 1 − β 2 k 1 - \beta_2^k 1β2k,可以增加 v k v_k vk 的值,使其更接近实际的梯度平方的均值。随着 k k k 的增加,偏差校正因子 1 − β 2 k 1 - \beta_2^k 1β2k 也会趋向于 1。

偏差校正的重要性

偏差校正对于 Adam 算法的性能至关重要,特别是在训练的初期阶段。没有偏差校正,算法可能会因为初始的低估而导致学习步长太小,进而影响训练的速度和效果。通过偏差校正,Adam 算法可以更快地调整其参数更新的大小,加速初期的学习过程,并提高整体的优化效率。随着训练的进行,这种校正变得不那么重要,因为 m k m_k mk v k v_k vk 会逐渐积累足够的信息来准确估计梯度的一阶和二阶矩。

代码示例

以下是 Adam 优化算法的 Python 代码示例:

def adam_update(parameters, gradients, m, v, t, lr=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8):
    for param, grad in zip(parameters, gradients):
        m[param] = beta1 * m[param] + (1 - beta1) * grad
        v[param] = beta2 * v[param] + (1 - beta2) * (grad ** 2)
        m_corrected = m[param] / (1 - beta1 ** t)
        v_corrected = v[param] / (1 - beta2 ** t)
        param_update = lr * m_corrected / (np.sqrt(v_corrected) + epsilon)
        param -= param_update

这个函数中,parameters 和 gradients 分别是模型参数和梯度的列表,m 和 v 是梯度一阶和二阶矩的估计,t 是当前迭代次数,lr, beta1, beta2, epsilon 是 Adam 算法的超参数。

优缺点

优点

  1. 自适应学习率: Adam 通过计算一阶和二阶矩估计来为每个参数自适应地调整学习率。
  2. 偏差校正: 初始阶段梯度估计可能偏低,通过偏差校正可以加速初期的学习速率。
  3. 适应性强: Adam 在很多不同的模型和数据集上都表现出了良好的性能。

缺点

  1. 超参数调整: 尽管默认的超参数在很多情况下都表现良好,但某些问题可能需要仔细的超参数调整。
  2. 内存需求: 相对于一些简单的优化算法,Adam 需要存储更多的变量(例如一阶和二阶矩估计),这可能会增加计算资源的消耗。

Adam 由于其优秀的性能和适应性,已经成为深度学习领域中最受欢迎的优化算法之一。理解其工作原理对于有效利用这一工具至关重要。

  • 37
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值