常见深度学习优化算法比较

一、变量说明

以下算法均为针对小批量梯度下降的算法,对于每个batch, 计算各个模型参数值为 x t x_t xt,参数梯度值为 g t g_t gt t t t为更新的步数。

  • x t x_t xt: 第t次迭代时的模型参数集合
  • g t g_t gt: 第t-1次迭代反向传播计算得到的参数梯度集合
  • η \eta η: 学习率标量
  • ⊙ \odot : 按元素相乘

通常称梯度的指数加权平均为一阶矩估计(动量),即下文中的 v t \boldsymbol v_t vt,称 s t \boldsymbol s_t st为二阶矩估计。
此外,除了SGD,后面基于指数平滑的算法都称为适应性算法。

二、算法介绍

2.1 小批量随机梯度下降(SGD)

  • 思想:用一个batch的数据计算出梯度,按照如下公式更新
  • 更新公式:
    x t = x t − 1 − η g t \boldsymbol x_t= \boldsymbol x_{t-1} -\eta \boldsymbol g_t xt=xt1ηgt
  • 缺点: 由于SGD固定的学习率,如果在某个点因为噪声计算出一个异常梯度,模型将朝着错误的方向更新,如果运气不好,模型可能无法收敛、收敛很慢、或者无法收敛到最优值。
  • 空间复杂度: 2 ∗ ∣ x ∣ 2*|\boldsymbol x| 2x

2.2 动量法

  • 思想:动量法通过对各个自变量的历史梯度进行指数加权平均,避免模型参数来回震荡。
  • 更新公式:
    v t = γ v t − 1 + η g t x t = x t − 1 − v t \boldsymbol v_t = \gamma \boldsymbol v_{t-1}+\eta\boldsymbol g_t \\ \boldsymbol x_t= \boldsymbol x_{t-1} -\boldsymbol v_t vt=γvt1+ηgtxt=xt1vt
  • 缺点:虽能在一定程度上减缓SGD的劣势,但仍然存在震荡导致的收敛缓慢问题。
  • 空间复杂度: 3 ∗ ∣ x ∣ 3*|\boldsymbol x| 3x

2.3 AdaGrad

  • 思想:对模型中的每个参数,如果计算出梯度比较大,则给它一个较小的学习率。
  • 更新公式:
    s t = s t − 1 + g t ⊙ g t . x t = x t − 1 − η s t + ϵ ⊙ g t \boldsymbol s_t=\boldsymbol s_{t-1}+\boldsymbol g_t \odot \boldsymbol g_t \\.\\ \boldsymbol x_t= \boldsymbol x_{t-1}- \frac{\eta}{\sqrt{\boldsymbol s_t+\epsilon }} \odot \boldsymbol g_t st=st1+gtgt.xt=xt1st+ϵ ηgt
    其中 ϵ \epsilon ϵ是为了维护数值稳定添加的较小常数。
  • 缺点:由于 s t \boldsymbol s_t st一直在累加,导致学习率可能会不断减小,可能没更新到最佳状态就开始原地踏步了。
  • 空间复杂度: 3 ∗ ∣ x ∣ 3*|\boldsymbol x| 3x

2.4 RMSProp

  • 思想: 对AdaGrad做了一点小修改,对 s t \boldsymbol s_t st进行加权平均, 避免它只增不减。
  • 更新公式:
    s t = γ s t − 1 + ( 1 − γ ) g t ⊙ g t . x t = x t − 1 − η s t + ϵ ⊙ g t \boldsymbol s_t=\gamma \boldsymbol s_{t-1}+ (1- \gamma) \boldsymbol g_t \odot \boldsymbol g_t \\ .\\ \boldsymbol x_t= \boldsymbol x_{t-1}- \frac{\eta}{\sqrt{\boldsymbol s_t+\epsilon }} \odot \boldsymbol g_t st=γst1+(1γ)gtgt.xt=xt1st+ϵ ηgt
  • 缺点:增加超参数 γ \gamma γ
  • 空间复杂度: 3 ∗ ∣ x ∣ 3*|\boldsymbol x| 3x

2.5 AdaDelta

  • 思想:也是对AdaGrad做修改,而且没有学习率这一超参数,而是使用模型参数的历史变化量代替学习率。
  • 更新公式:
    s t = ρ s t − 1 + ( 1 − ρ ) g t ⊙ g t . g t ′ = Δ x t − 1 + ϵ s t + ϵ ⊙ g t . Δ x t = ρ Δ x t − 1 + ( 1 − ρ ) g t ′ ⊙ g t ′ . x t = x t − 1 − g t ′ \boldsymbol s_t=\rho \boldsymbol s_{t-1}+ (1- \rho) \boldsymbol g_t \odot \boldsymbol g_t \\ .\\ \boldsymbol g'_t =\sqrt{\frac{\Delta \boldsymbol x_{t-1} + \epsilon}{ \boldsymbol s_t + \epsilon}}\odot \boldsymbol g_t\\ .\\ \Delta \boldsymbol x_{t} = \rho\Delta \boldsymbol x_{t-1} +(1-\rho) \boldsymbol g'_t\odot \boldsymbol g'_t \\ .\\ \boldsymbol x_t= \boldsymbol x_{t-1}- \boldsymbol g'_t st=ρst1+(1ρ)gtgt.gt=st+ϵΔxt1+ϵ gt.Δxt=ρΔxt1+(1ρ)gtgt.xt=xt1gt
  • 缺点:不知道为什么知名度不如Adam, 可能实验表明吧。
  • 空间复杂度: 4 ∗ ∣ x ∣ 4*|\boldsymbol x| 4x

2.6 Adam

  • 思想:RMSProp 和 动量法的结合版,并针对初始化导致的偏差进行修正(3,4行公式)
  • 更新公式:
    v t = β 1 v t − 1 + ( 1 − β 1 ) g t . s t = β 2 s t − 1 + ( 1 − β 2 ) g t ⊙ g t . v ^ t = v t 1 − β 1 t . s ^ t = s t 1 − β 2 t . g t ′ = η v ^ t s ^ t + ϵ . x t = x t − 1 − g t ′ \boldsymbol v_t = \beta_1 \boldsymbol v_{t-1}+(1-\beta_1)\boldsymbol g_t \\ .\\ \boldsymbol s_t=\beta_2 \boldsymbol s_{t-1}+ (1- \beta_2) \boldsymbol g_t \odot \boldsymbol g_t \\ .\\ \hat{\boldsymbol v}_t = \frac{\boldsymbol v_t}{1-\beta^t_1} \\ .\\ \hat{\boldsymbol s}_t = \frac{\boldsymbol s_t}{1-\beta^t_2} \\ .\\ \boldsymbol g'_t = \frac{\eta \hat \boldsymbol v_t }{\sqrt{\hat \boldsymbol s_t } + \epsilon} \\ .\\ \boldsymbol x_t= \boldsymbol x_{t-1}- \boldsymbol g'_t vt=β1vt1+(1β1)gt.st=β2st1+(1β2)gtgt.v^t=1β1tvt.s^t=1β2tst.gt=s^t +ϵηv^t.xt=xt1gt

空间复杂度: 4 ∗ ∣ x ∣ 4*|\boldsymbol x| 4x

三、常见问题

  1. 为什么适应性算法。例如Adam, 如果没有保存优化器参数,只使用之前的模型参数接着训练的话,会出先loss突然增大的问题?

    答曰:适应性算法维护的平滑信息消失,相当于在当前点下直接进行SGD算法,丢失了稳定性,如果接着训练,也应该设置很小的初始学习率。(warm up也可以从这个角度解释,预热的过程实际上就是为了给这些算法提供平滑信息,这期间不要急着更新参数。)

    关于这方面的知识,推荐这个综述:https://www.jiqizhixin.com/articles/2017-12-06(中文)http://ruder.io/deep-learning-optimization-2017/ (英文)

  2. 为什么word2vector中使用SGD而不能使用Adam? (不知道答的对不对,欢迎讨论)

    答曰:按照word2vector的语言模型思想,一个输入中不存在的词,它对应的向量参数就不应该被更新。但是由于Adam维护的动量信息,会导致之前的动量不为0的所有词向量参数都会被惯性更新。导致过拟合或者说不满足word2vector模型的要求。
    但但但但是,那不应该是所有Embedding的模型都会出现这个问题吗?这有两种可能:1. Embedding的实现需要自动屏蔽动量更新。2.在多层神经网络中,允许惯性更新,因为我们的目标往往是单纯你拟合训练数据,管你Embedding咋个跑呢!(希望知道的大神能够回答下这两个哪个对)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值