人工智能/机器学习基础知识——优化器

Optimizer(优化器)

CSDN

博客园

博客园

机器学习中,有很多优化方法来试图寻找模型的最优解,如一般的梯度下降法等等,优化器实现了不同的求解最优的算法

梯度下降法

梯度下降法是最基本的一类优化器的算法,主要分为三种:标准梯度下降法(GD, Gradient Descent),随机梯度下降法(SGD, Stochastic Gradient Descent)以及批量梯度下降法(BGD, Batch Gradient Descent)。

GD(Gradient Descent)

标准梯度下降法

  • 算法核心公式:
    w i = w i − α ∂ L ( w 1 , w 2 , w 3 , . . . , w n ) ∂ w i w_i = w_i - α\frac{∂L(w_1,w_2,w_3,...,w_n)}{∂w_i} wi=wiαwiL(w1,w2,w3,...,wn)
    其中 w i w_i wi为更新的参数, L ( w 1 , w 2 , w 3 , . . . , w n ) L(w_1,w_2,w_3,...,w_n) L(w1,w2,w3,...,wn)为损失函数, α α α为学习率

  • 标准梯度下降法需要对每一个样本都应用上述公式,训练速度慢,而且容易陷入局部最优解。

BGD(Batch Gradient Descent)

批量梯度下降法

  • 算法核心公式:
    w i = w i − α ∑ k = 1 m ∂ L m k ( w 1 , w 2 , w 3 , . . . , w n ) ∂ w i w_i = w_i - α\sum\limits_{k=1}^{m}\frac{∂L_{m_k}(w_1,w_2,w_3,...,w_n)}{∂w_i} wi=wiαk=1mwiLmk(w1,w2,w3,...,wn)
    其中 w i w_i wi为更新的参数, L m k ( w 1 , w 2 , w 3 , . . . , w n ) L_{m_k}(w_1,w_2,w_3,...,w_n) Lmk(w1,w2,w3,...,wn)为某批样本中第 k k k个样本的损失, α α α为学习率, m m m为某批样本的总数。

  • 批量梯度下降法对每一批样本进行一次参数更新,但是每一个样本的梯度都需要计算,最后累积一次性更新,而不是一个样本算一次梯度再更新一次参数。(注意这里的梯度是累积和,并不是平均和)

SGD(Stochastic Gradient Descent)

随机梯度下降法

  • 算法核心公式:
    w i = w i − α ∂ L m k ( w 1 , w 2 , w 3 , . . . , w n ) ∂ w i w_i = w_i - α\frac{∂L_{m_k}(w_1,w_2,w_3,...,w_n)}{∂w_i} wi=wiαwiLmk(w1,w2,w3,...,wn)
    其中 w i w_i wi为更新的参数, L m k ( w 1 , w 2 , w 3 , . . . , w n ) L_{m_k}(w_1,w_2,w_3,...,w_n) Lmk(w1,w2,w3,...,wn)为某批样本中第 k k k个样本的损失, α α α为学习率, m m m为某批样本的总数。

  • 随机梯度下降法从某批样本中随机挑选一个样本进行计算梯度以及参数更新,一批样本只进行一次梯度计算与一次参数更新。

  • 随机梯度下降法会引入噪声,使得权值更新的方向不一定正确。

动量优化法(Momentum Optimization)

动量优化法是在梯度下降法的基础上进行改变的,具有加速梯度下降的作用。主要分为两种:标准动量优化法(Momentum)、牛顿加速梯度法(NAG,Nesterov Accelerated Gradient)。

Momentum

标准动量优化法,基于SGD改进而来

  • 算法核心公式:
    w i = w i − v t w_i = w_i - v_t wi=wivt
    v t = γ v t − 1 + α ∂ L m k ( w 1 , w 2 , w 3 , . . . , w n ) ∂ w i v_t = γv_{t-1} + α\frac{∂L_{m_k}(w_1,w_2,w_3,...,w_n)}{∂w_i} vt=γvt1+αwiLmk(w1,w2,w3,...,wn)
    其中 w i w_i wi为更新的参数, L m k ( w 1 , w 2 , w 3 , . . . , w n ) L_{m_k}(w_1,w_2,w_3,...,w_n) Lmk(w1,w2,w3,...,wn)为某批样本中第 k k k个样本的损失, α α α为学习率, m m m为某批样本的总数, γ γ γ为动量的大小(超参数,一般取0.9), v t v_t vt表示当前批次积攒的加速度, v t − 1 v_{t-1} vt1表示上一次迭代(批次)积攒的加速度。

  • Momentum主要解决了SGD的噪声与收敛过程中在极值点来回摆动比较大的问题。

  • 可以理解为动量这一概念起到了一定的加速与刹车作用:在从较大的损失值逼近极值点的过程中起到了加速作用(因为有上一次批次样本的梯度作加成),在越过极值点的时候起到了刹车作用(越过极值点后紧跟的下一次参数更新时,上一次的动量与本次梯度的符号相反,造成本次加速度的大小被抵消了一部分)。

NAG(Nesterov Accelerated Gradient)

牛顿加速梯度法,是Momentum动量算法的变种

  • 算法核心公式:
    w i = w i − v t w_i = w_i - v_t wi=wivt
    v t = γ v t − 1 + α ∂ L m k ( ( w 1 , w 2 , w 3 , . . . , w n ) − γ v t − 1 ) ∂ w i v_t = γv_{t-1} + α\frac{∂L_{m_k}((w_1,w_2,w_3,...,w_n) - γv_{t-1})}{∂w_i} vt=γvt1+αwiLmk((w1,w2,w3,...,wn)γvt1)
    其中 w i w_i wi为更新的参数, L m k ( ( w 1 , w 2 , w 3 , . . . , w n ) − γ v t − 1 ) L_{m_k}((w_1,w_2,w_3,...,w_n) - γv_{t-1}) Lmk((w1,w2,w3,...,wn)γvt1)为某批样本中第 k k k个样本的损失, α α α为学习率, m m m为某批样本的总数, γ γ γ为动量的大小(超参数,一般取0.9), v t v_t vt表示当前批次积攒的加速度, v t − 1 v_{t-1} vt1表示上一次迭代(批次)积攒的加速度。

在这里插入图片描述

  • 如图, L m k ( ( w 1 , w 2 , w 3 , . . . , w n ) − γ v t − 1 ) L_{m_k}((w_1,w_2,w_3,...,w_n) - γv_{t-1}) Lmk((w1,w2,w3,...,wn)γvt1)可理解为试探性迈出的下一步:用上一次迭代的动量 γ v t − 1 γv_{t-1} γvt1去试探性更新模型参数(只是为了计算需要临时更新)。这样一来相当于可以用当前的样本“预测”到下一次迭代时的梯度大小以及正负情况,然后与上一次迭代时的动量相加用于更新参数。

  • NAG相比Momentum,“加速”作用相差不大,而“刹车”的作用比Momentum要好。NAG可以在还没跃过极值点时就试探性的预测出前方存在极值点并进行一定程度的数值正负抵消(如上图两种情况),而Momentum只能在跃过极值点后进行“刹车”。

  • NAG内部可以有随机梯度下降与批量梯度下降两种更新子规则,批量梯度下降效果更好。(公式展示的是随机梯度下降)

自适应学习率优化法

自适应学习率优化算法针对于机器学习模型的学习率。传统的优化算法要么将学习率设置为常数要么根据训练次数调节学习率,极大忽视了学习率其他变化的可能性。然而,学习率对模型的性能有着显著的影响,因此需要采取一些策略来想办法更新学习率,从而提高训练速度。目前的自适应学习率优化算法主要有:AdaGrad,RMSProp,Adam以及AdaDelta。

在标准的梯度下降法中,每个参数在每次迭代时都使用相同的学习率,由于每个参数的维度上收敛速度都不相同,因此自适应学习率优化法根据不同参数的收敛情况分别设置学习率。

AdaGrad

AdaGrad。Adagrad算法能够在训练中自动的对学习率进行调整,对于出现频率较低参数采用较大的α更新;相反,对于出现频率较高的参数采用较小的α更新。

  • 算法核心公式:
    w i = w i − α G t , i i + ϵ ⋅ ∂ L ( w 1 , w 2 , w 3 , . . . , w n ) ∂ w i w_i = w_i - \frac{α}{\sqrt{G_{t,ii} + ϵ}}·\frac{∂L(w_1,w_2,w_3,...,w_n)}{∂w_i} wi=wiGt,ii+ϵ αwiL(w1,w2,w3,...,wn)
    其中 w i w_i wi为更新的参数, L ( w 1 , w 2 , w 3 , . . . , w n ) L(w_1,w_2,w_3,...,w_n) L(w1,w2,w3,...,wn)为损失函数, α α α为学习率, G t G_t Gt n n n阶对角矩阵(n为模型参数总数), G t , i i G_{t,ii} Gt,ii为对角矩阵 G t G_t Gt i i i行第 i i i列的值, ϵ ϵ ϵ是平滑项(数值很小,为了避免分母为0)。

  • AdaGrad算法是将模型中每一个参数的每一次迭代的梯度取平方累加后存在对角矩阵 G t G_t Gt i i i行第 i i i列的位置上,然后在每次参数更新时,用学习率除以该参数的梯度平方累加和的开方,以实现学习率的动态更新。

  • AdaGrad算法适合处理数据稀疏或者分布不均衡的数据集。

  • AdaGrad算法缺点在于随着迭代次数增加,学习率会越来越小,最终会趋于0。

RMSProp

RMSProp算法改进了AdaGrad算法的暴力平方累加梯度,增加了一个衰减系数来控制历史信息获取的多少

  • 算法核心公式:
    g t = ∂ L ( w 1 , w 2 , w 3 , . . . , w n ) ∂ w i g_t = \frac{∂L(w_1,w_2,w_3,...,w_n)}{∂w_i} gt=wiL(w1,w2,w3,...,wn)
    E [ g 2 ] t = ρ E [ g 2 ] t − 1 + ( 1 − ρ ) g t 2 E[g^2]_t = ρE[g^2]_{t-1} + (1-ρ)g_t^2 E[g2]t=ρE[g2]t1+(1ρ)gt2
    w i = w i − α E [ g 2 ] t + ϵ ⋅ g t w_i = w_i - \frac{α}{\sqrt{E[g^2]_t + ϵ}}·g_t wi=wiE[g2]t+ϵ αgt
    其中 w i w_i wi为更新的参数, L ( w 1 , w 2 , w 3 , . . . , w n ) L(w_1,w_2,w_3,...,w_n) L(w1,w2,w3,...,wn)为损失函数, α α α为学习率, g t g_t gt为本次迭代梯度, E [ g 2 ] t E[g^2]_t E[g2]t表示前 t t t次迭代的(某个参数的)梯度平方和的加权平均, ρ ρ ρ为衰减系数(一般取0.9), ϵ ϵ ϵ是平滑项(数值很小,为了避免分母为0)。

  • RMSProp使用 ρ ρ ρ衰减系数进行指数衰减,重点考虑离本次迭代比较近的几次迭代的梯度信息,相当于只保留过去一定时间内的梯度信息。可以这样理解,对第一次迭代的 E [ g 2 ] 1 E[g^2]_1 E[g2]1,随着迭代次数不断增加,它会不断的乘以衰减系数 ρ ρ ρ,假设到了第k次迭代时,最先开始的 E [ g 2 ] 1 E[g^2]_1 E[g2]1的值在当前迭代的 E [ g 2 ] k E[g^2]_k E[g2]k中就变为了 E [ g 2 ] 1 ∗ ρ k E[g^2]_1 * ρ^k E[g2]1ρk这就是RMSProp算法中的核心概念——指数衰减。

  • 正是有了指数衰减与梯度平方和的加权平均,RMSProp算法解决了AdaGrad算法训练时学习率越来越低的问题,而且与AdaGrad一样能自适应调节学习率。

  • RMSProp和AdaGrad的作用都是在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小),并且能够使得陡峭的方向变得平缓,从而加快训练速度。

  • RMSProp算法在经验上已经被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。

AdaDelta

Paper : ADADELTA: AN ADAPTIVE LEARNING RATE METHOD

AdaDelta是对AdaGrad的改进

  • 算法核心公式:
    g t = ∂ L ( w 1 , w 2 , w 3 , . . . , w n ) ∂ w i g_t = \frac{∂L(w_1,w_2,w_3,...,w_n)}{∂w_i} gt=wiL(w1,w2,w3,...,wn)
    E [ g 2 ] t = ρ E [ g 2 ] t − 1 + ( 1 − ρ ) g t 2 E[g^2]_t = ρE[g^2]_{t-1} + (1-ρ)g_t^2 E[g2]t=ρE[g2]t1+(1ρ)gt2
    R M S [ g ] t = E [ g 2 ] t + ϵ RMS[g]_t = \sqrt{E[g^2]_t + ϵ} RMS[g]t=E[g2]t+ϵ
    Δ w i = − R M S [ Δ w i ] t − 1 R M S [ g ] t g t Δw_i = -\frac{RMS[Δw_i]_{t-1}}{RMS[g]_t}g_t Δwi=RMS[g]tRMS[Δwi]t1gt
    w i = w i + Δ w i w_i = w_i + Δw_i wi=wi+Δwi
    其中 w i w_i wi为更新的参数, L ( w 1 , w 2 , w 3 , . . . , w n ) L(w_1,w_2,w_3,...,w_n) L(w1,w2,w3,...,wn)为损失函数, g t g_t gt为本次迭代梯度, E [ g 2 ] t E[g^2]_t E[g2]t表示前 t t t次迭代的(某个参数的)梯度平方和的加权平均, ρ ρ ρ为衰减系数(一般取0.9), Δ w i Δw_i Δwi为参数变化量(步长), R M S RMS RMS代表梯度的均方根, ϵ ϵ ϵ是平滑项(数值很小,为了避免分母为0)。

  • AdaDelta算法不需要设置全局学习率。其余细节前述算法均有详细解释。

Adam

Paper : ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION

Adam实际上是将Momentum与RMSProp结合起来的算法。除了像AdaDelta和RMSProp一样存储了过去梯度的平方的指数衰减平均值,也像Momentum一样保持了过去梯度的指数衰减平均值。

  • 算法核心公式:
    g t = ∂ L ( w 1 , w 2 , w 3 , . . . , w n ) ∂ w i g_t = \frac{∂L(w_1,w_2,w_3,...,w_n)}{∂w_i} gt=wiL(w1,w2,w3,...,wn)
    m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = β_1m_{t-1} + (1 - β_1)g_t mt=β1mt1+(1β1)gt
    v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = β_2v_{t-1} + (1 - β_2)g_t^2 vt=β2vt1+(1β2)gt2
    m t ^ = m t 1 − β 1 t \hat{m_t} = \frac{m_t}{1 - β_1^t} mt^=1β1tmt
    v t ^ = v t 1 − β 2 t \hat{v_t} = \frac{v_t}{1 - β_2^t} vt^=1β2tvt
    w i = w i − α v t ^ + ϵ m t ^ w_i = w_i - \frac{α}{\sqrt{\hat{v_t}} + ϵ}\hat{m_t} wi=wivt^ +ϵαmt^
    其中 w i w_i wi为更新的参数, L ( w 1 , w 2 , w 3 , . . . , w n ) L(w_1,w_2,w_3,...,w_n) L(w1,w2,w3,...,wn)为损失函数, g t g_t gt为本次迭代梯度, β 1 β_1 β1 β 2 β_2 β2为衰减系数(一般取0.9和0.999), m t m_t mt v t v_t vt为过去梯度与过去梯度平方的指数衰减平均值, m t ^ \hat{m_t} mt^ v t ^ \hat{v_t} vt^为偏差校正后的修正值, ϵ ϵ ϵ是平滑项(数值很小,为了避免分母为0)。

  • 之所以要对 m t m_t mt v t v_t vt作修正,是因为如果 m t m_t mt v t v_t vt被初始化为零向量,那么它们就会向0偏置,所以做了偏差校正,通过计算偏差校正后的 m t m_t mt v t v_t vt来抵消偏差。

  • Adam借鉴了RMSProp的指数衰减思想,将 v t ^ \hat{v_t} vt^用于动态调整各参数的学习率。同时Adam也借鉴了Momentum中动量加速下降的思想,并与指数衰减相结合,将 m t ^ \hat{m_t} mt^当作本次的参数更新值。

  • 36
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值