机器学习笔记——梯度下降优化方案
一、梯度下降粒度优化
1.1 Batch gradient descent
- 批量梯度下降(Batch gradient descent)是根据所有样本训练得到的梯度来更新参数。每更新一次参数便要用到所有的训练样本数据集,决定了批量梯度下降法训练时间长、收敛速度缓慢。
1.2 Stochastic gradient descent
- 随机梯度下降(Stochastic gradient descent)每次仅根据单个样本 ( x i , y i ) (x^i,y^i) (xi,yi)计算得到的梯度来更新参数。随机梯度下降计算简单收敛速度快,但收敛过程易震荡不稳定。不稳定的特征有好有坏,好处在于可以让参数跳出局部最优,坏处在于收敛结果不精确。
- 下面是批量梯度下降与随机梯度下降的示意图,表征训练误差随迭代次数增加的变化规律。可以明显看出随机梯度下降抖动明显。
1.3 Mini-batch gradient descent
- 小批量梯度下降(Mini-bacth gradient descent)是以上两种方法的综合,批量梯度下降运算速度、收敛速度慢但收敛稳定,随机梯度下降运算速度、收敛速度快但收敛易震荡。
- 其实相对来说,每次更新参数计算1个样本与每次更新参数计算10个样本的速度差异不大,而带来的训练过程的稳定性优化确实十分巨大的。因此小批量的样本数大约集中在50-256之间,在保证运算速度的前提下大大优化训练稳定性。
- 批量梯度下降与随机梯度下降都有明显的缺陷,因此在大型学习过程中我们普遍使用小批量梯度下降。我们常说的SGD也指的是小批量梯度下降。
1.4 三种方法的代码分析
- 批量梯度下降每次更新参数都要拿全部训练集数据参与运算,对训练集不需要执行什么操作。
- 随机梯度下降每次更新参数都需要在训练数据集中随机挑选一个样本计算梯度。小批量梯度下降每次需要在训练集中随机获得一个固定大小的样本集用于计算梯度。需要注意的是:这两种方法在每次取单个样本或样本集之前都需要打乱当前数据集。
二、梯度下降参数优化
2.1 步长与梯度的关系
- 上面是我们最基础的参数更新公式,可以看出步长 Δ θ \Delta\theta Δθ与梯度正相关。也就是说梯度大的地方步长长,梯度下降的速度快步伐大;梯度小的地方步长短,梯度下降的速度慢步伐小。那么这个规律是正确的吗?的的确确适合于我们梯度下降的过程吗?
- 上图我们可以理解为一个特殊的损失函数曲线。可以看出梯度较小也就是说较平坦的地方离最小值较远,因此我们需要较大步幅加速跳过这部分,而根据上面的正比关系我们得到的确实小步长。同理分析可得,大梯度部分的步长也与理想状况相反。这样会导致参数在离最小值较远的地方迟迟不收敛或者在最小值附近以大步幅来回震荡下不去。
- 看到了问题,我们就要想方法去解决。 Δ θ \Delta\theta Δθ由两部分决定,梯度与学习率。而梯度是固定不变的,我们就只能在学习率身上下功夫。下面将介绍多种学习率的调整优化方案。
2.2 AdaGrad 与 RMSProp
- AdaGrad的基本思路是:梯度下降的不同阶段学习率大小不同,也就是说学习率随着迭代次数改变而改变。梯度下降的不同参数所使用的学习率也要不同。
- AdaGrad思路简单计算也相对好理解,上面最后一个式子是最终化简的结果。分析该式子我们能发现一个问题,当迭代次数很大的时候,分母部分会变得很大从而导致 Δ θ \Delta\theta Δθ很小,也就是出现了我们所说的“学不动了”的情况。
- 针对以上问题,RMSProp应运而生。在计算分母部分以往梯度的平方和时,每次计算都是先以一个0-1之间的比例衰减上次求和值,再加入新平方。这样每次迭代,越早出现的梯度平方就会乘更多的 ρ \rho ρ,也就会衰减的值特别小,不会出现AdaGrad那样“学不动”的情况。
2.4 AdaDelta
- 根据AdaGrad与RMSProp的最终化简后的公式,梯度下降的性能还与一个超参学习率 α \alpha α相关。也就是说我们梯度下降的过程还存在一定的偶然性与不可确定性,性能取决于学习率 α \alpha α的选择。
- AdaDelta在RMSProp的基础上针对学习率 α \alpha α做出了进一步的修改,取消了超参学习率 α \alpha α,取而代之的是 Δ θ \Delta\theta Δθ的RMS函数。修改后的参数调整过程不确定性大大减小。
2.5 Momentum 与 Nesterov Momentum
- 梯度下降法当梯度接近于0时就会出现“学习不动”的情况,我们把这类情况称之为梯度消失。确实当我们逼近于全局最小值时会出现梯度消失的情况,但出现梯度消失情况时却不一定是得到了最优解,比如可能卡在了局部最小值或者是卡在了鞍部。
- 如上图所示,卡在局部最小值或者是卡在鞍部,梯度学习的过程都会停滞。那么我们该用什么方法冲出局部最小或者是鞍部呢?我们引入了物理中实际存在的惯性机制,也就是说小球从高度滚下即便在某些位置没有继续加速的动力也会因为惯性冲出这些位置。根据此思想诞生了Momentum(动量)算法。
- 舍弃掉之前的 Δ θ \Delta\theta Δθ,现在的 Δ θ = v t \Delta\theta=v^t Δθ=vt, v t v^t vt一般由两部分组成,一部分是上一次参数更新的速度乘以一个衰减系数(一般为0.9),另一部分是学习率与梯度在这里插入图片描述
的乘积。 - 在Momentum算法的基础之上又创新型地获得了Nesterov Momentum算法,该算法的思想与Momentum的区别主要在于梯度计算的时机。Nesterov Momentum算法是预判在上一环节速度的基础上到达位置再做出梯度计算。
2.6 Adam
- RMSProp与Momentum算法分别以不同的角度去优化梯度下降的参数调整细节,我们如果将以上两种思想进行融合便得到了我们本章节要去探讨的Adam算法。
- 其实在Adam公式中我们还是可以看到很多之前算法的影子。比如说与AdaGrad进行类比, m t m^t mt来近似模拟 g t g_t gt, v t v^t vt来近似模拟 g t 2 g_t^2 gt2。 m t m^t mt与 v t v^t vt均使用到了RMSProp中的指数平均的思想,而 v t v^t vt则使用到了Momentum中速度动量的思想。
2.7 AdaBelief
- 我们与Adam相比给出AdaBelief的相关定义公式,可以看出Adam与AdaBelief只有一个地方不同,那就是 v t v^t vt的 g t 2 g_t^2 gt2变成了 s t s^t st的 ( g t − m t ) 2 (g_t-m_t)^2 (gt−mt)2。
- 在1区域,梯度很小并且距离最小值较远,我们需要较大步长。SGD步长正比于梯度,因此步长很小。而Adam与AdaBelief分母 v t v^t vt与 s t s^t st都很小,因此步长很大符合要求。
- 在2区域,梯度很大并且距离最小值很近,我们需要较小步长。SGD步长正比于梯度,因此步长很大。而Adam与AdaBelief分母 v t v^t vt与 s t s^t st都很大,因此步长很小符合要求。
- 以上两区域Adam与AdaBelief没有明显的差别。而在3区域就体现出了AdaBelief在“大梯度,小曲率”情况下的优势。在这种情况下, v t v^t vt与 ∣ g t ∣ |g_t| ∣gt∣都很大,而 ∣ g t − g t − 1 ∣ |g_t-g_{t-1}| ∣gt−gt−1∣与 s t s^t st很小,理想情况下我们需要大步长。SGD步长正比于梯度,因此步长很大。Adam因为 v t v^t vt很大从而步长很小。AdaBelief因为 s t s^t st很小从而步长很大。
来源:oschina
链接:https://my.oschina.net/u/4283847/blog/4698644