史上最详细的梯度下降优化算法介绍(从SGD到Adam至Lookahead)

51 篇文章 0 订阅
订阅专栏
6 篇文章 1 订阅
订阅专栏


1.介绍

在机器学习模型训练时,模型优化算法是必不可少的,例如常见的梯度下降优化算法SGD,这也是大多数机器学习’炼丹师‘第一次接触机器学习时使用的优化算法,也是最容易理解的,但是机器学习任务中模型千变万化,很难做到一种优化算法“通吃”所有模型。因此对于不同的模型,需要对原始的梯度下降优化算法不断的改进优化。下面就对梯度下降优化等常见的优化算法及其改进算法做一一介绍。


2.常见优化算法

2.1 梯度下降法及其变种

2.1.1 批梯度下降法

批梯度下降法(batch gradient descent)是指在整个训练数据集上求解损失函数关于参数θ的梯度:
θ = θ − η ∗ ▽ θ J ( θ ) \theta = \theta - \eta*\bigtriangledown_{\theta}J(\theta) θ=θηθJ(θ)

  1. η表示学习率,通常是一个较小的值,例如0.001,其决定我们将以多大的步长更新参数;
  2. ▽θJ(θ)表示损失函数在整个数据集上对参数θ计算一阶导数(取平均值)。因为是更新参数θ,所以计算θ的一阶导,一阶导方向是参数变化最快的方向。

由于每次更新时使用整个数据集计算所有梯度,因此计算速度非常慢,同时批梯度下降法不能在线更新模型,无法在运行过程中,增加新的样本。批梯度下降法代码如下:

for i in range(nb_epochs):
    params_grad = evaluate_gradient(loss_function, data, params)
    params = params - learning_rate * params_grad

注意:

  1. 对于损失函数为凸函数的情况,批梯度下降法能够收敛到全局最小值;
  2. 对于损失函数为非凸函数的情况,批梯度下降法则能够收敛到局部最小值。



2.1.2 随机梯度下降法

批梯度下降法(stochastic gradient descent)是指使用每一条数据来计算梯度值更新参数:
θ = θ − η ∗ ▽ θ J ( θ ; x i ; y i ) \theta = \theta - \eta*\bigtriangledown_{\theta}J(\theta; x_i; y_i) θ=θηθJ(θ;xi;yi)

  1. η表示学习率,通常是一个较小的值,例如0.001,其决定我们将以多大的步长更新参数;
  2. ▽θJ(θ;xi;yi)表示损失函数在每一条数据上对参数θ计算一阶导数。因为是更新参数θ,所以计算θ的一阶导,一阶导方向是参数变化最快的方向。

通常,随机梯度下降法相比于批梯度下降法具有更快的速度,可用于在线学习,SGD以高方差频繁地更新,因此容易出现下列剧烈波动的情况。

在这里插入图片描述

SGD优化算法的特点:

  1. 相比于批梯度下降法可能使得损失函数陷入局部的缺点,SGD的波动性使得其有可能收敛到更好的局部最优,
  2. 这也使得SGD收敛到局部最小值的过程变得更加复杂,因为SGD一直在震荡。

与批梯度下降法的优化代码相比,SGD只是在训练的轮次中,每次选择一个训练样本时多了一个for循环。

 for i in range(nb_epochs):
    np.random.shuffle(data)
    for example in data:
        params_grad = evaluate_gradient(loss_function, example, params)
        params = params - learning_rate * params_grad



2.1.3 小批量梯度下降法

小批量梯度下降法(mini-batch gradient descent)综合了上述两种方法的优点,在每次训练时使用 n 个小批量样本进行更新:
θ = θ − η ∗ ▽ ( θ ) J ( θ ; x i : i + n ; y i : i + n ) \theta = \theta - \eta*\bigtriangledown_(\theta)J(\theta;x^{i:i+n};y^{i:i+n}) θ=θη(θ)J(θ;xi:i+n;yi:i+n)
该方法的特点:

  1. 可以以更小的方差来更新参数,参数收敛的过程波动更小;
  2. 获得比批梯度下降法更快的运行速度。

训练神经网络模型,当使用小批量梯度下降法时,也将其称为SGD。

⚠️ 在下文提到的SGD,为了简单起见,我们省略了参数xi:i+n;yi:i+n

对于小批量梯度下降的代码,只在小批量数据上计算梯度:

for i in range(nb_epochs):
    np.random.shuffle(data):
        for batch in get_batches(data, batch_size=50):
            params_grad = evaluate_gradient(loss_function, batch, params)
            params = params - learning_rate*params_grd



从上面三种基本的梯度下降法可以看出,即使是小批量下降法也并不能保证模型参数达到很好的收敛效果,目前具有下面的问题(这也是后来的很多改进的优化算法改进的动力和方向):

  1. 选择一个合适的学习率是困难的。学习率太小会导致收敛太慢,太大会影响模型的收敛,有可能在最小值附近不断波动甚至偏离最小值。
  2. 对于不同的参数使用相同的学习率更新是不合理的。如果数据是稀疏的,就不能使用相同的学习率来更新了,对于出现次数少的特征,我们对其执行更大的学习率;
  3. 高度非凸误差函数普遍出现在神经网络中,在优化这类函数时,另一个关键的挑战是使函数避免陷入无数次优的局部最小值。Dauphin等人指出出现这种困难实际上并不是来自局部最小值,而是来自鞍点,即那些在一个维度上是递增的,而在另一个维度上是递减的。这些鞍点通常被具有相同误差的点包围,因为在任意维度上的梯度都近似为0,所以SGD很难从这些鞍点中逃开。



2.2 梯度下降法的优化算法

在正式学习各种SGD的改进的优化算法之前,可以先通过这中动图感受下各个优化算法收敛速度和收敛效果。

在这里插入图片描述
在这里插入图片描述



2.2.1 Momentum-动量法

SGD很难通过陡谷,即在一个维度的表面弯曲程度远大于其他维度的区域,这种情况通常出现在局部最优点附近,这种情况下,SGD在不断波动下通过陡谷的斜坡,在沿着谷底到局部最优点的路径上缓慢前进,过程如下图(a)所示:

在这里插入图片描述

如上图(b)所示,动量法是一种帮助SGD在相关方向上加速并抑制摇摆的方法,利于处理非平稳梯度,动量法是将上一次更新量的一个分量γ增加到当前的更新量中,公式如下:
ν t = γ ν t − 1 + η ▽ θ J ( θ ) ( 1 ) \nu_{t} = \gamma\nu_{t-1} + \eta\bigtriangledown_{\theta}J(\theta) \qquad (1) νt=γνt1+ηθJ(θ)(1)
θ = θ − ν t ( 2 ) \theta = \theta - \nu_t \qquad (2) θ=θνt(2)

  1. 上面公式(1)等号后面,γ表示使用上次更新量的权重,决定了动量的大小,η部分跟前面SGD参数更新量完全相同;
  2. 公式(2)中,不再像前面SGD公式中直接将学习率大小体现出来了,而是整个的包含在νt中了。在后面的其他改进SGD的优化算法中也是类似的做法。

动量项γ通常可以设置成0.9。
可以这样来理解动量。参考文献[1]中这样的比喻很好:从山坡上往下推一个球,在往下滚动的过程中累积动量,速度越来越快,如果有空气阻力,则γ<1。对于参数更新也是如此,对于在当前梯度点处有相同方向的维度,动量项增加,对于在梯度点处改变方向的维度,其动量项减小,因此我们可以获得更快的收敛速度,同时可以减小频繁的波动



2.2.2 Nesterov-加速梯度下降法

接着上面举的例子,如果球盲目的沿着斜率方向向下滚动,结果也不一定总是令人满意,我们希望有一个智能的球,能够知道它将要去哪,如果遇到斜率将要上升时,能够知道减速。

Nesterov加速梯度下降法(Nesterov accelerated gradient,NAG)是一种能够给动量项γνt−1一种预知能力的方法。我们使用动量项更新参数,通过计算θ - γνt−1能够告诉我们参数未来位置的一个近似值,也就是告诉我们参数将大致变为多少。通过计算参数未来的近似位置的梯度,即使用θ - γνt−1计算梯度,而不是使用θ来计算梯度,我们可以更加高效的求解(我自己理解为:这里的一次参数更新近似于动量法的两次更新,所以是加速了):
ν t = γ ν t − 1 + η ▽ θ J ( θ − γ ν t − 1 ) ( 3 ) \nu_{t} = \gamma\nu_{t-1} + \eta\bigtriangledown_{\theta}J(\theta - \gamma\nu_{t-1}) \qquad (3) νt=γνt1+ηθJ(θγνt1)(3)
θ = θ − ν t ( 4 ) \theta = \theta - \nu_{t} \qquad (4) θ=θνt(4)

上面公式(3)中,η部分,表示假设更新量为上次梯度上的动量大小,这是个近似更新量,然后再基于这个更新后的损失函数对于参数θ的一阶导数作为当前新的梯度,即公式(3)中η后面的部分。到这里就可以直接套用动量优化算法中公式(1)了,因此上面我理解为这种方式的一次参数更新的效果近似于动量法的两次参数更新的效果,所以理论上是加速了。

因为NAG-加速梯度下降法跟Momentum-动量法相似之处比较多,所以可以通过下面的一幅图对比两者的关系:

一般设置动量项γ的大小为0.9左右!

  1. 动量法:首先计算当前的梯度值(箭头线1),然后在更新的累积梯度上前进一大步(箭头线2);
  2. 加速梯度下降法:首先作一个预见性的更新,即在先前累积梯度方向上前进一大步(箭头线3),并计算出梯度作为一个修正(箭头线4),修正后为箭头线5。这里的预见性更新增强了算法的响应能力(即加速),同时通过修正防止了前进地太快。这一点对于很多RNN的任务的性能提升有着重要的意义。

    在这里插入图片描述

对于上面的动量法和NAG法,是通过使参数更新适应损失函数的斜率以加速SGD;那么为了进一步优化,考虑使得参数的更新适应每一个单独参数,以根据每一个参数来决定是大的更新还是小的更新。这也是后面的优化算法设计的初衷。



2.2.3 Adagrad-自适应梯度

Adagrad是一种适应参数的梯度下降优化算法,其自适应性可以个性化到特征级别,出现次数较少的特征的,会使用更大的学习率,出现次数较多的特征,会使用较小的学习率,因此Adagrad适合于稀疏数据的深度神经网络模型

  1. Dean等人[4]发现Adagrad能够极大提高了SGD的鲁棒性并将其应用于Google的大规模神经网络的训练,其中包含了YouTube视频中的猫的识别;
  2. Pennington等人[15]利用Adagrad训练Glove词向量,因为低频词比高频词需要更大的步长。

Agagrad在每次更新所有的参数θ时,对于每个参数使用不同的学习率,我们先看下如何对不同的参数进行更新的。下面公式(5)表示在t时刻损失函数关于参数θi的梯度:
g t , i = ▽ θ J ( θ i ) ( 5 ) g_{t,i} = \bigtriangledown_{\theta}J(\theta_{i}) \qquad (5) gt,i=θJ(θi)(5)
如果受用固定步长的学习率,则参数更新公式为:
θ t + 1 , i = θ t , i − η ∗ g t , i ( 6 ) \theta_{t+1, i} = \theta_{t, i} - \eta*g_{t, i} \qquad (6) θt+1,i=θt,iηgt,i(6)
现在加入对不同参数个性化的步长因子,即在t时刻,基于对不同参数计算过的历史梯度,Adagrad修正了每一个参数的学习率:
θ t + 1 , i = θ t , i − η G t , i i + ϵ ∗ g t , i , G t ∈ R d × d ( 7 ) \theta_{t+1, i} = \theta_{t, i} - \frac{\eta}{\sqrt{G_{t, ii} + \epsilon}}*g_{t, i},\quad G_{t} \in R^{d\times d} \qquad (7) θt+1,i=θt,iGt,ii+ϵ ηgt,i,GtRd×d(7)
其中,Gt是一个对角矩阵,对角线上的元素ii是从开始截止到t时刻为止,所有关于θi的梯度的平方和,Gt具体计算数值如下公式:
G t , i i = ∑ k = 1 t g k , i 2 ( 8 ) G_{t, ii} = \sum_{k = 1}^{t}g_{k, i}^2 \qquad (8) Gt,ii=k=1tgk,i2(8)
(Duchi等人将该矩阵作为包含所有先前梯度的外积的完整矩阵的替代,因为即使是对于中等数量的参数d,矩阵的均方根的计算都是不切实际的。)。ϵ是平滑项,用于防止除数为0(通常大约设置为1e−8)。

Adagrad优化算法中[6],如果没有平方根的计算,那么效果将会比较差。

现在我们将上面的公式向量化,主要为是为了简单。主要是将Gg之间的计算操作向量化,如下:
θ t + 1 = θ t − η G t + ϵ ⊙ g t ( 9 ) \theta_{t+1} = \theta_{t} - \frac{\eta}{\sqrt{G_{t} + \epsilon}}\odot g_{t} \qquad (9) θt+1=θtGt+ϵ ηgt(9)
Adagrad算法的优缺点如下:

  1. 优点:主要优点就是无需手动调整学习率,基本上采用 0.01 即可。
  2. 缺点:由于其在分母中累加梯度的平方,每次增加一个正项,随着训练过程积累,会导致学习率越来越小,当学习率变得无限小时Adagrad算法将无法获得额外的信息更新。

下面将要介绍算法也是针对Adagrad的缺点进行改进的。



2.2.4 Adadelta

Adadelta算法完全移除了学习率,不再需要人工设置学习率参数。

Adadelta算法是Adagrad的一种扩展,以解决Adagrad学习速率单调递减的缺点。Adadelta算法无需存储历史梯度的平方和,而是将梯度的平方递归地表示成所有历史梯度的均值,因此在t时刻的均值只取决于先前的均值和当前的梯度:
E [ g 2 ] t = γ E [ g 2 ] t − 1 + ( 1 − γ ) g t 2 ( 10 ) E[g^2]_{t} = \gamma E[g^2]_{t-1} + (1 - \gamma)g_{t}^2 \qquad (10) E[g2]t=γE[g2]t1+(1γ)gt2(10)
其中γ与动量项相似,可以设置成0.9。

对于参数更新向量我们可以表示成:

△ θ t = − η ⋅ g t , i ( S G D ) ( 11 ) \triangle\theta_{t} = -\eta \cdot g_{t, i} \qquad\qquad (SGD) \qquad (11) θt=ηgt,i(SGD)(11)
△ θ t = − η G t + ϵ ⋅ g t ( A d a g r a d ) ( 12 ) \triangle\theta_{t} = -\frac{\eta}{\sqrt{G_{t} + \epsilon}} \cdot g_{t} \qquad\qquad (Adagrad) \qquad (12) θt=Gt+ϵ ηgt(Adagrad)(12)

那么,我们直接将Gt替换成历史梯度均值则为:
△ θ t = − η E [ g 2 ] t + ϵ ⋅ g t ( 13 ) \triangle\theta_{t} = -\frac{\eta}{\sqrt{E[g^2]_{t} + \epsilon}} \cdot g_{t} \qquad (13) θt=E[g2]t+ϵ ηgt(13)
上述公式中由于分母就是均方根,所以可以直接简写为:
△ θ t = − η R M S E [ g ] t ⋅ g t ( 14 ) \triangle\theta_{t} = -\frac{\eta}{RMSE[g]_{t}} \cdot g_{t} \qquad (14) θt=RMSE[g]tηgt(14)
Adadelta[7]直接指出了上述几种优化算法中更新规则与参数的单位不一致的问题,为此Adadelta实现了这个要求,类似于梯度的动量形式的均值,作者首次提出了参数的动量形式的均值,如下公式所示:
E [ △ θ 2 ] t = γ E [ △ θ 2 ] t − 1 + ( 1 − γ ) △ θ 2 ( 15 ) E[\triangle \theta^2]_{t} = \gamma E[\triangle \theta^2]_{t-1} + (1 - \gamma)\triangle \theta^2 \qquad (15) E[θ2]t=γE[θ2]t1+(1γ)θ2(15)
那么参数更新的均方根为:
R M S [ △ θ ] t = E [ △ θ 2 ] t + ϵ ( 16 ) RMS[\triangle\theta]_{t} = \sqrt{E[\triangle \theta^2]_{t} + \epsilon} \qquad (16) RMS[θ]t=E[θ2]t+ϵ (16)

因为RMS[Δθ]t是未知的,所以近似取到t-1时刻的均方根来RMS[Δθ]t-1近似更新,并替换之前的固定值形式的学习率η,可以得到Adadelta的更新向量为
△ θ t = − R M S [ △ θ ] t − 1 R M S E [ g ] t ⋅ g t ( 17 ) \triangle\theta_{t} = -\frac{RMS[\triangle\theta]_{t-1}}{RMSE[g]_{t}} \cdot g_{t} \qquad (17) θt=RMSE[g]tRMS[θ]t1gt(17)
θ t = θ t + △ θ t ( 18 ) \theta_{t} = \theta_{t} + \triangle\theta_{t} \qquad (18) θt=θt+θt(18)

使用Adadelta优化算法,我们无需设置学习率,因为公式中已经移除了学习率的超参数。



2.2.5 RMSprop

RMSprop优化算法是Geoff Hinton提出来的一种自适应学习率的算法,与Adadelta几乎同时提出来的,是Adadelta的一个特例。

RMSprop与Adadelta一样,都是去解决Adagrad的学习率下降太快的问题的,参数更新公式如下:
E [ g 2 ] t = 0.9 E [ g 2 ] t − 1 + 0.1 g t 2 ( 19 ) E[g^2]_{t} = 0.9E[g^2]_{t-1} + 0.1g_{t}^2 \qquad (19) E[g2]t=0.9E[g2]t1+0.1gt2(19)
θ t + 1 = θ t − η E [ g 2 ] t + ϵ g t ( 20 ) \theta_{t+1} = \theta_{t} - \frac{\eta}{\sqrt{E[g^2]_{t} + \epsilon}}g_{t} \qquad (20) θt+1=θtE[g2]t+ϵ ηgt(20)
因此,RMSprop也是将学习率分解成平方梯度的指数衰减的平均,对于学习率η,建议选择 0.001。



2.2.6 Adam-自适应矩估计

自适应矩估计(Adaptive Moment Estimation, Adam)也是一种会对每一个参数会计算出自适应学习率的算法。它一个动量算法和RMSprop算法的结合体,既考虑到了利用动量项来加速训练过程,又考虑到对于学习率的约束。Adam也会计算出来一个指数衰减的历史平方梯度的平均vt ,Adam同时还计算一个指数衰减的历史梯度的平均mt,类似于动量:
m t = β 1 m t − 1 + ( 1 − β 1 ) g t ( 21 ) m_{t} = \beta_1m_{t-1} + (1 - \beta_1)g_{t} \qquad (21) mt=β1mt1+(1β1)gt(21)
ν t = β 2 ν t − 1 + ( 1 − β 2 ) g t 2 ( 22 ) \nu_{t} = \beta_2\nu_{t-1} + (1 - \beta_2)g_{t}^2 \qquad (22) νt=β2νt1+(1β2)gt2(22)

因此,mt是对梯度的一阶矩的估计,νt是对梯度的二阶矩(非确定性误差)的估计。

但是当mtνt都初始化为0时,特别是在初始化的步骤和衰减率都很小时(β1β2接近于1),Adam比较接近于0,这对于参数更新并不友好(更新太慢),Adam中是通过计算偏差矫正的一阶矩估计和二阶矩估计来抵消偏差的,公式如下:
m ^ t = m t 1 − β 1 t ( 23 ) \hat m_{t} = \frac{m_{t}}{1 - \beta_1^t} \qquad (23) m^t=1β1tmt(23)
ν ^ t = ν t 1 − β 2 t ( 24 ) \hat \nu_{t} = \frac{\nu_{t}}{1 - \beta_2^t} \qquad (24) ν^t=1β2tνt(24)
至此,生成Adam的参数更新公式如下:
θ t + 1 = θ t − η ν ^ t + ϵ m ^ t ( 25 ) \theta_{t+1} = \theta_{t} - \frac{\eta}{\sqrt{\hat\nu_{t}} + \epsilon}\hat m_{t} \qquad (25) θt+1=θtν^t +ϵηm^t(25)

Adam作者建议β1β2分别取默认值0.9、0.999就好,ϵ为10−8。

从经验上来看,Adam在实际任务中表现更好(哈哈,其他人的经验)。

通过上面对Adam的理解,可以看出来,Adam结合了Adagrad善于处理稀疏梯度和Momentum善于处理非平稳目标的优点,相较于其他几种优化器效果更好。



2.2.7 AdaMax

AdaMax优化算法是对Adam算法的更新。
Adam算法中,使用到了参数的指数衰减的梯度平方的平均,即:
ν t = β 2 ν t − 1 + ( 1 − β 2 ) ∣ g t ∣ 2 ( 26 ) \nu_t = \beta_2 \nu_{t-1} + (1-\beta_2)|g_{t}|^2 \qquad (26) νt=β2νt1+(1β2)gt2(26)
对上面的公式进行扩展到ℓp范数,同时也将β2 扩展到βp2,上面公式变为:
ν t = β 2 p ν t − 1 + ( 1 − β 2 p ) ∣ g t ∣ p ( 27 ) \nu_t = \beta_2^p \nu_{t-1} + (1-\beta_2^p)|g_{t}|^p \qquad (27) νt=β2pνt1+(1β2p)gtp(27)
在这里,AdaMax用到了范数的相关形性质,即通常大p值的范数通常具有数值不稳定性,因此我们更常见到的是1范数和2范数,但是无穷范数除外,当p趋于无穷时,范数具有较好的数值稳定性。

因此,AdaMax的作者提出了使用无穷范数的AdaMax优化算法,并且使用了ℓ∞vt能够收敛到一个外稳定的值,为了避免和上面的Adam优化算法搞混淆,我们使用ut来代替vt作为参数更新的表示:
u t = β 2 ∞ ν t − 1 + ( 1 − β 2 ∞ ) ∣ g t ∣ ∞ u_t = \beta_2^{\infty} \nu_{t-1} + (1-\beta_2^{\infty})|g_{t}|^{\infty} ut=β2νt1+(1β2)gt
= m a x ( β 2 ν t − 1 , ∣ g t ∣ ) ( 28 ) = max(\beta_2\nu_{t-1}, |g_{t}|) \qquad (28) =max(β2νt1,gt)(28)

根据上面的参数更新向量放到前面Adam的参数更新公式中,即为:
θ t + 1 = θ t − η u t m ^ t ( 29 ) \theta_{t+1} = \theta_{t} - \frac{\eta}{u_{t}}\hat m_{t} \qquad (29) θt+1=θtutηm^t(29)

对公式(28)中,由于取的是最大值的计算操作,因此不用像在Adam中担心参数更新量趋近于0的问题,因此在AdaMax中也不需要进行偏差矫正的操作。

AdaMax中的超参数,一般比较好的默认是η=0.002β1=0.9β2=0.999



2.2.8 Nadam-加速自适应矩估计

Adam算法结合了RMSprop优化算法和动量优化算法的优点:

  1. RMSprop产生指数衰减的平方梯度的均值vt;
  2. 动量算法产生指数衰减的平方梯度的均值mt。

在上面介绍到的各种优化算法中,我们可以看到NAG算法优于动量优化算法。

基于此,Nadam结合了Adam算法和NAG算法,为了能够将NAG算法应用于Adam公式中,我们需要修改NAG算法的动量部分mt。

这里我们再来看下动量算法、NAG的对动量的改进算法的逻辑:
先是动量优化算法-Momentum:
g t = ▽ θ J ( θ ) ( 30 ) g_{t} = \bigtriangledown_{\theta} J(\theta) \qquad (30) gt=θJ(θ)(30)
m t = γ m t − 1 + η g t ( 31 ) m_{t} = \gamma m_{t-1} + \eta g_{t} \qquad (31) mt=γmt1+ηgt(31)
θ t + 1 = θ t − m t ( 32 ) \theta_{t+1} = \theta_{t} - m_{t} \qquad (32) θt+1=θtmt(32)
将公式(31)带入公式(32)得到如下:
θ t + 1 = θ t − ( γ m t − 1 + η g t ) ( 33 ) \theta_{t+1} = \theta_{t} - (\gamma m_{t-1} + \eta g_{t}) \qquad (33) θt+1=θt(γmt1+ηgt)(33)
从公式(33)容易看出,Momentum优化算法包括在历史累积梯度方向上前进一步、在当前梯度方向上前进一步。

再是NAG加速动量优化算法:
g t = ▽ θ J ( θ − γ m t − 1 ) ( 34 ) g_{t} = \bigtriangledown_{\theta} J(\theta - \gamma m_{t-1}) \qquad (34) gt=θJ(θγmt1)(34)
m t = γ m t − 1 + η g t ( 35 ) m_{t} = \gamma m_{t-1} + \eta g_{t} \qquad (35) mt=γmt1+ηgt(35)
θ t + 1 = θ t − m t ( 36 ) \theta_{t+1} = \theta_{t} - m_{t} \qquad (36) θt+1=θtmt(36)
NAG算法在计算梯度前就先使用动量步骤来更新参数,因此NAG跟Momentum的区别就是计算梯度gt上的差别。

基于上面两个基本的动量方向的优化算法的逻辑,引出Nadam算法:

相比于NAG算法的有两个使用动量的步骤-其一是更新梯度gt,其二是更新参数θt+1,我们现在使用look-ahead方式的动量直接更新当前参数:
g t = ▽ θ J ( θ ) ( 37 ) g_{t} = \bigtriangledown_{\theta} J(\theta) \qquad (37) gt=θJ(θ)(37)
m t = γ m t − 1 + η g t ( 38 ) m_{t} = \gamma m_{t-1} + \eta g_{t} \qquad (38) mt=γmt1+ηgt(38)
θ t + 1 = θ t − ( γ m t + η g t ) ( 39 ) \theta_{t+1} = \theta_{t} - (\gamma m_{t} + \eta g_{t}) \qquad (39) θt+1=θt(γmt+ηgt)(39)
可以对比和公式(39)和公式(33),可以看到他们唯一的区别是look-ahead方式中的动量更新中使用了截止到当前t的动量mt,而在NAG的参数更新规则中使用的截止到t-1的动量mt−1我们可以通过类比将历史动量向量替换为当前动量向量的方式,来将NAG算法特点应用在Adam算法中,Adam的原始更新规则为:
m t = β 1 m t − 1 + ( 1 − β 1 ) g t ( 40 ) m_{t} = \beta_1 m_{t-1} + (1-\beta_1) g_{t} \qquad (40) mt=β1mt1+(1β1)gt(40)
m ^ t = m t 1 − β 1 t ( 41 ) \hat m_{t} = \frac{m_{t}}{1 - \beta_1^t} \qquad (41) m^t=1β1tmt(41)
θ t + 1 = θ t − η ν t 2 + ϵ m ^ t ( 42 ) \theta_{t+1} = \theta_{t} - \frac{\eta}{\sqrt{\nu_{t}^2} + \epsilon}\hat m_{t} \qquad (42) θt+1=θtνt2 +ϵηm^t(42)
将上面公式(41)中的mt带入得到公式(42)的展开式如下:
θ t + 1 = θ t − η ν t 2 + ϵ ( β 1 m t − 1 1 − β 1 t + ( 1 − β 1 ) g t 1 − β 1 t ) ( 43 ) \theta_{t+1} = \theta_{t} - \frac{\eta}{\sqrt{\nu_{t}^2} + \epsilon}(\frac{\beta_1 m_{t-1}}{1 - \beta_1^t} + \frac{(1-\beta_1) g_{t}}{1 - \beta_1^t}) \qquad (43) θt+1=θtνt2 +ϵη(1β1tβ1mt1+1β1t(1β1)gt)(43)
β 1 m t − 1 1 − β 1 t ( 44 ) \frac{\beta_1 m_{t-1}}{1 - \beta_1^t} \qquad (44) 1β1tβ1mt1(44)
β 1 m t − 1 1 − β 1 t − 1 ( 45 ) \frac{\beta_1 m_{t-1}}{1 - \beta_1^{t-1}} \qquad (45) 1β1t1β1mt1(45)
上面的公式(44)模块为上一步骤的动量估计的偏差修正,尽管公式(45)才是准确的对于上一步骤的动量估计的偏差修正,但是为了简单起见,此处我们忽略掉公式(44)和(45)在分母上的区别,所以公式(43)可以转化为:
θ t + 1 = θ t − η ν t 2 + ϵ ( β 1 m ^ t − 1 + ( 1 − β 1 ) g t 1 − β 1 t ) ( 46 ) \theta_{t+1} = \theta_{t} - \frac{\eta}{\sqrt{\nu_{t}^2} + \epsilon}({\beta_1 \hat m_{t-1}} + \frac{(1-\beta_1) g_{t}}{1 - \beta_1^t}) \qquad (46) θt+1=θtνt2 +ϵη(β1m^t1+1β1t(1β1)gt)(46)
到这里,可以对比一下公式(46)和公式(39)了,类比于在公式(39)中用当前动量替代前一个步骤的动量的做法,我们将Nesterov Momentum的思想引入到Adam中了,最终参数更新规则如下:
θ t + 1 = θ t − η ν t 2 + ϵ ( β 1 m ^ t + ( 1 − β 1 ) g t 1 − β 1 t ) ( 46 ) \theta_{t+1} = \theta_{t} - \frac{\eta}{\sqrt{\nu_{t}^2} + \epsilon}({\beta_1 \hat m_{t}} + \frac{(1-\beta_1) g_{t}}{1 - \beta_1^t}) \qquad (46) θt+1=θtνt2 +ϵη(β1m^t+1β1t(1β1)gt)(46)



2.2.9 Lookahead

Geoffrey Hinton 的研究团队近期刚发表出来一篇 Lookahead 优化算法,大佬的研究成果自然要多关注呀,毕竟站在巨人的肩膀上。这周会算法核心内容更新进来。。。敬请期待!





3.参考资料

  1. An overview of gradient descent optimization algorithms
  2. 梯度下降优化算法综述
  3. 优化方法总结:SGD,Momentum,AdaGrad,RMSProp,Adam
  4. Large Scale Distributed Deep Networks
  5. 动态图-各种优化算法收敛情况对比
  6. Adagrad-Adaptive Subgradient Methods for Online Learning and Stochastic Optimization
  7. Adadelta-An Adaptive Learning Rate Method
梯度下降
冯大洋的博客
07-01 570
本文以线性回归为例,讲解了批量梯度下降、随机梯度下降、小批量梯度下降、冲量梯度下降等算法,由浅入深,并结合精心设计的例子,使读者最快掌握这种最常用的优化方法。每一种优化方法,笔者都基于R语言给出了相应的代码,供读者参考, 梯度下降 假如我们有以下身高和体重的数据,我们希望用身高来预测体重。如果你学过统计,那么很自然地就能想到建立一个线性回归模型: \[y=a+bx\] 其中\(a\)...
学习率衰减之余弦退火(CosineAnnealing)
热门推荐
weixin_35848967的博客
09-09 7万+
1 引言 当我们使用梯度下降算法来优化目标函数的时候,当越来越接近Loss值的全局最小值时,学习率应该变得更小来使得模型尽可能接近这一点,而余弦退火(Cosine annealing)可以通过余弦函数来降低学习率。余弦函数中随着x的增加余弦值首先缓慢下降,然后加速下降,再次缓慢下降。这种下降模式能和学习率配合,以一种十分有效的计算方式来产生很好的效果。 在论文Stochastic Gradient Descent with Warm Restarts中介绍主要介绍了带重启的随机梯度下降算法(SGDR),其
算法金 | 再见!!!梯度下降(多图)
最新发布
算法金「全网同名」的博客
06-19 1030
梯度下降优化算法的概述,目的在于帮助读者理解不同算法的优缺点梯度下降优化算法是机器学习和深度学习中最常用的优化算法之一。它通过不断调整模型参数,使得损失函数的值逐渐减小,从而使模型逐步逼近最优解梯度下降法是机器学习和深度学习中最基础和常用的优化算法之一。通过不断调整模型参数,使得损失函数的值逐渐减小,梯度下降法能够帮助模型逐步逼近最优解。根据数据集和具体应用场景的不同,可以选择不同形式的梯度下降法,如批梯度下降法、随机梯度下降法和小批量梯度下降法。1. 批梯度下降法使用整个数据集计算梯度。
Pytorch实现使用余弦退火算法优化手写数据集分类
weixin_43960370的博客
04-14 1733
余弦退火算法是一种优化算法,通常用于训练神经网络等模型。它的主要思想是动态调整学习率,使得模型可以更快地收敛并获得更好的性能。余弦退火算法的原理比较简单,其核心在于使用余弦函数来动态地调整学习率。具体地,算法将学习率从初始值逐步降低到最小值,并在此后保持不变。通过这种方式,余弦退火算法可以在训练过程中缓慢降低学习率,从而避免在训练过程中出现梯度下降过快导致的震荡现象,进而提高模型的训练稳定性和泛化能力。
学习率:余弦退火衰减策略(附代码+在cifar10上采用余弦退火衰减)
weixin_45074568的博客
04-09 2852
学习率会在刚开始的时候上升,加快模型的收敛速度,寻找最优点位置,到达一定step后,学习率下降,此时我们可以认为这是一个模型在微调的过程。上升采用线性上升,下降采用cos函数下降。 step = (训练样本数 * 训练epoch )/batch_size 0.001是自己设置的learning_base点。 下面为cifar-10数据集,学习采用余弦退火衰减 实现方式如下,利用Callback实现,与普通的ReduceLROnPlateau调用方式类似: import numpy as np import.
【深度学习】(11) 学习率衰减策略(余弦退火衰减,多项式衰减),附TensorFlow完整代码
博观而约取,厚积而薄发
04-29 5215
大家好,今天和各位分享一下如何使用 TensorFlow 构建多项式学习率衰减策略、单周期余弦退火学习率衰减策略、多周期余弦退火学习率衰减策略,并使用Mnist数据集来验证构建的方法是否可行。 在上一篇中和大家分享了指数衰减、分段衰减、余弦衰减,感兴趣的可以看一下:https://blog.csdn.net/dgvv4/article/details/124471098 下面创建的自定义学习率的类,都继承tf.keras.optimizers.schedules.LearningRateSchedu..
Pytorch 学习率衰减 之 余弦退火与余弦warmup 自定义学习率衰减scheduler
jasneik的博客
03-26 1万+
import math import matplotlib.pyplot as plt import numpy as np import torch import torch.nn as nn from torch.optim import * from torchvision import models class Net(nn.Module): def __init__(self): super(Net,self).__init__() self.fc = n
收藏 _ 深度学习优化算法:从SGDAdamW原理和代码解读1
08-04
本文将探讨一系列从简单到复杂的优化算法,包括SGD(随机梯度下降)、SGD with Momentum(动量SGD)、Nesterov Accelerated Gradient(NAG)以及基于二阶矩估计的算法如AdaGrad、AdaDelta、Adam和AdamW。 **1. SGD...
Keras SGD 随机梯度下降优化器参数设置方式
09-16
主要介绍了Keras SGD 随机梯度下降优化器参数设置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
fmin_adam:亚当随机梯度下降优化算法的Matlab实现
02-04
亚当(Adam)随机梯度下降优化算法是机器学习领域常用的一种高效优化方法,它结合了动量法和RMSProp的优势,适用于处理大规模数据集和高维参数空间的问题。在Matlab环境中实现Adam算法,可以提高模型训练的效率和...
swats:在PyTorch中非官方实现从Adam切换到SGD优化
05-02
Adam切换到SGD 表明:“即使在自适应解决方案具有更好的训练性能的情况下,通过自适应方法发现的解决方案的普遍性也比SGD差(通常显着更差)。这些结果表明,从业者应该重新考虑使用自适应方法来训练神经网络。 ...
SGD到NadaMax,十种优化算法原理及实现 - 知乎1
08-03
本文将探讨十种常见的优化算法,包括随机梯度下降SGD)、动量优化(Momentum)、Nesterov动量优化(Nesterov Momentum)、AdaGrad、RMSProp、AdaDelta、Adam、AdaMax、Nadam以及NadaMax。这些算法的核心区别在于...
余弦知乎living
Aodongq1n的进击路
01-16 914
1、开场 知乎存在XSS漏洞,利用漏洞可以做到窃取他人隐私。例如:你只要收到我发送的消息,我就可以完全控制你的APP账号权限,这是在iPhone上 因为:iPhone 上的这个 App 把页面加载进 file 协议,而 Android 不是这样干。file 协议是本地的协议,权限高,可以跨域影响 http/https 2、新手环节 2个手机(iphone,一加),iph
深度学习中学习率调整策略总结
shengweiit的博客
05-12 3584
lr_scheduler.LambdaLR的优点是可以根据自定义的函数来调整学习率,灵活性比较高。可以根据具体任务和模型的需求来选择合适的函数,以提高模型的性能。缺点是需要自己定义函数,可能需要一定的数学知识和经验。此外,如果函数定义不合理,可能会导致模型在训练过程中出现震荡或过拟合的情况。因此,在使用LambdaLR时,需要根据具体情况进行调整,以达到最佳效果。
Pytorch优化器常用的两种学习率衰减策略:指数衰减策略、余弦退火策略(附测试代码)
NorthSmile的博客
09-22 7217
Pytorch提供了多种学习率衰减策略,我在这里介绍常用的指数衰减策略和余弦退火策略,并分别介绍他们的代码实现。无论采用那种策略,在网络训练之间我们均需要进行以下两步工作:1)创建优化器Optimizer;2)为优化器绑定一个学习率控制器Scheduler;网络训练过程中,学习率不能过大,也不能过小,学习率过大会导致网络参数在最优值两边来回跳跃,难以收敛,学习率太小会导致网络收敛过慢,所以我们一般希望网络训练前期学习率较大可以加速网络收敛,后期学习率较小,以此使得网络更收敛于最优值。
PyTorch Cookbook(常用代码段整理合集)
风中落泪的花
05-14 706
https://zhuanlan.zhihu.com/p/59205847?
PyTorch学习率衰减策略:指数衰减(ExponentialLR)、固定步长衰减(StepLR)、多步长衰减(MultiStepLR)、余弦退火衰减(CosineAnnealingLR)
u013250861的博客
03-19 8497
梯度下降算法需要我们指定一个学习率作为权重更新步幅的控制因子,常用的学习率有0.01、0.001以及0.0001等,学习率越大则权重更新。一般来说,我们希望在训练初期学习率大一些,使得网络收敛迅速,在训练后期学习率小一些,使得网络更好的收敛到最优解。下图展示了随着迭代的进行动态调整学习率的4种策略曲线: 上述4种策略为自己根据资料整理得到的衰减类型:指数衰减、固定步长的衰减、多步长衰、余弦退火衰减。下面逐一介绍其性质,及pytorch对应的使用方式,需要注意学习率衰减策略很大程度上是依赖于经验与具体问题的
【论文阅读】YOLO系列论文:YOLO v4
haru_x的博客
04-19 1844
yolo v4论文阅读笔记
正则表达式入门经典(学习笔记六)——向前查找(lookahead)和向后查找(lookbehind)...
ijavagos
07-29 173
1.为什么需要向前查找和向后查找 为了表达“只有当单词Star后跟单词Training时才匹配Star”的意图,思路向前查找 star(?=Training) star(?= Training\b) 2.(?元字符 (?元字符之前和之后的字符不会被捕获 (?:...) 非捕获组 (?=...) 肯定式向前查找 sentence(?=.*senquence.*\.) 匹配字符序列sentence,...
介绍一下随机梯度下降算法SGD
05-20
随机梯度下降(Stochastic Gradient Descent,SGD)是一种优化算法,主要用于模型训练中的参数优化。与传统的批量梯度下降(Batch Gradient Descent)相比,SGD采用每次迭代只使用一个样本进行梯度计算和参数更新,因此在大规模数据集上的训练效率更高。 具体来说,SGD算法的核心思想如下:在每次迭代中,随机从训练数据集中选择一个样本,计算其梯度,并使用该梯度更新模型参数。这样做的好处是可以使算法在训练过程中快速收敛,且避免了批量梯度下降的大量计算量和内存消耗。 SGD算法的缺点是存在不稳定性,由于每次更新只考虑一个样本,因此在一些情况下可能会导致更新方向不准确,甚至出现震荡。为了解决这个问题,通常采用一些优化策略,如Momentum、Adagrad、Adam等,来平衡模型的稳定性和收敛速度。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • MATLAB中排序函数sort()的用法 183060
  • sql中的 between and 用法 76140
  • Mac系统下载安装sublime3详细过程 51663
  • linux vi & vim 插入 删除 修改 文本 46270
  • Ubuntu 16.04 常用软件安装命令 43618

分类专栏

  • 数据挖掘 6篇
  • 推荐算法 6篇
  • 点击率预估 6篇
  • 图机器学习 1篇
  • LeetCode 8篇
  • xgboost 3篇
  • tensorflow 6篇
  • DNN 5篇
  • 概率图模型
  • C/C++ 17篇
  • 数据结构 44篇
  • 算法 51篇
  • python 63篇
  • linux(ubuntu) 46篇
  • caffe&tensorflow&keras&pytorch 33篇
  • 深度学习/机器学习 157篇
  • 人脸识别 9篇
  • NVIDIA
  • 大数据 64篇
  • opencv 5篇
  • matlab 4篇
  • 图像配准 4篇
  • 通用物体检测 14篇
  • 数据处理 7篇
  • hive/sql 20篇
  • R语言 1篇
  • C# 1篇
  • 操作系统 2篇
  • 计算机系统 4篇
  • 加密算法
  • scala 4篇
  • spark 2篇
  • java 11篇
  • pandas 3篇
  • 机器学习项目 3篇
  • 迁移学习 3篇
  • IDE 2篇
  • 算法导论实战
  • Hbase 6篇
  • ËTL
  • word2vec 1篇
  • 机器学习西瓜书
  • 技术资料 1篇
  • paper 2篇
  • git 2篇
  • 评估指标 1篇

最新评论

  • idea properties或配置文件 FileNotFoundException 系统找不到指定的路径 路径问题

    听军一席话: 秀儿,是你嘛?表情包

  • hadoop fs -getmerge 对ORC表文件合并后 报错Buffer size too small. size = 262144 needed = 592198

    静谭水月: 你这样设置是不会生效的,orc的文件读取不会在使用你配置的这个配置而是读取这个文件自己在写入时存储的schema信息。

  • idea properties或配置文件 FileNotFoundException 系统找不到指定的路径 路径问题

    黑马老六: 见过人才的没见过那么人才的

  • MATLAB中排序函数sort()的用法

    NYBMIGAB: 谢谢

  • 图像处理中的投影变换(Perspective Transformation)

    神奇的墨: 对啊,按照仿射变换a13a23就是平移的

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • hive 判断int值奇数偶数 hive中位运算妙用
  • linux sed 替换Host ip json中key值 hdfs路径
  • CentOS7 配yum源 配阿里云
2021年3篇
2020年21篇
2019年81篇
2018年81篇
2017年211篇
2016年3篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码南澳高端网站设计观澜网站关键词优化龙华网站seo优化福田网站推广宝安网站改版大运标王大鹏百度seo吉祥SEO按天扣费沙井网站关键词优化荷坳优化大浪外贸网站制作吉祥百度竞价包年推广丹竹头网站搭建深圳模板推广龙华网站推广系统宝安百度爱采购南澳企业网站制作大浪网站改版光明百度竞价包年推广坑梓网络营销民治品牌网站设计坪地SEO按天扣费坑梓关键词按天扣费横岗网站定制大运网站设计模板盐田阿里店铺运营同乐网站搜索优化爱联如何制作网站爱联网站开发盐田seo歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化