深度学习中的优化方法:

以下内容会包括下面几种优化方法:

  • Gradient Descent
  • Adagrad
  • Momentum
  • RMSProP
  • Adam

1. Gradient Descent

首先,Gradient Descent是我们最常用的优化方法,梯度下降的参数更新公式为:

(1)θi=θi1ηL(θi1)\theta^i = \theta^{i-1} - \eta \nabla L(\theta^{i-1}) \tag 1

其中L(θi1)\nabla L(\theta^{i-1})是损失函数的梯度,η\eta为学习速率。

针对以上公式,我们发现η\eta前面是负号,可是为什么η\eta前面是负号呢?下面结合梯度下降的过程来说明:

如下图所示:当梯度下降的时候,梯度为负数时(θ0\theta^0),说明损失函数在向右的方向上是下降的,因此参数θ\theta应该增加;梯度为正数时(θ3\theta^3),说明损失函数在向左的方向上是下降的,参数θ\theta应该减小。这样才能保证损失函数向更低点移动,因此参数的迭代与梯度的符号相反,η\eta前面添加负号。

深度学习中的优化方法

由梯度下降公式(1),其中包含一个超参数η\eta需要我们调整:当调节超参数时,η\eta设置的过小会使模型收敛变慢,η\eta设置的过大使模型无法收敛到最低点。我们希望刚开始损失函数距离最低点较远时,学习速率更大,损失函数距离最低点较近时,学习速率减小。因此η\eta的值可以会随模型的迭代逐渐变化(刚开始距离最低点较远,η\eta更大,在逐渐接近最低点,η\eta减小),比如:使用倒数衰减1/t decay。公式如下:

ηt=ηt+1\eta^t = {\eta \over \sqrt{t+1}}

使用上式,可以使得模型迭代次数越多,η\eta值越小。

但是利用上式仍旧是不够的,它对所有参数都使用相同的学习速率,而我们希望不同的参数给予不同的η\eta,其中比较常用的是Adagrad。

2. Adagrad:

Adagrad的参数迭代过程就是用学习速率η\eta除以过去所有参数的微分值的均方根,它能够对每个参数自适应不同的学习速率。公式如下:

(2)wt+1=wtηtσtgtw^{t+1} = w^t - {\eta^t \over \sigma^t} g^t \tag 2

其中:gt=L(wt)wg^t = {\partial L(w^t) \over \partial w}σt\sigma^t是过去所有参数的微分值的均方根。

举例:

深度学习中的优化方法

公式(2)化简后,得到:

深度学习中的优化方法

深度学习中的优化方法

根据上图,我们比较梯度下降和Adagrad,我们在计算梯度下降的时候,梯度gtg^t这一项越大,参数更新越快;而在Adagrad中,分母中也包括梯度,并且梯度越大,参数更新越慢,这样的话,分子分母是不是存在冲突呢?

首先我们先考虑只有一个参数的情况:

深度学习中的优化方法

我么发现,参数更新的最好步长与一次微分成正比,并且一次微分越大意味着距离最低点的距离越远。

但是如果有多个参数呢?

深度学习中的优化方法

当不跨参数时,上面的结论是成立的;当跨参数时,我们发现c点的梯度值更大,但a点距离最低点更远。

我们再回到前面的图,我们发现:最优步长不仅与一次微分有关,同时与二次微分也有关系:

深度学习中的优化方法

深度学习中的优化方法

由上图可见,一次微分大的点,二次微分也比较大,因此距离最低点的距离需要同时考虑一次微分和二次微分,参数更新最好的步长与一次微分成正比,与二次微分成反比。

深度学习中的优化方法

因此,我们需要考虑二次微分,但是却不想算二次微分,因为会使计算量变的很大,因此我们考虑使用一次微分来估计二次微分(我们发现二次微分大的曲线,在一次微分上的点会比较大。因此,计算二次微分的过程,相当于在一次微分上做采样,然后平方求和来估计二次微分)。

3. 关于梯度下降法的补充

Stochastic Gradient Descent:

采用随机梯度下降为什么比批量梯度下降要好?

深度学习中的优化方法

在所有数据上采用批量梯度下降,每次迭代参数只更新一次,但是采用随机梯度下降,在相同的数据上做计算,参数可以更新很多次,收敛更快。

Gradient Descent:Feature Scaling

为什么要做scaling?

深度学习中的优化方法

由上图:如果不做scaling,w1和w2做相同的变化,对y的影响是不同的。显而易见,x2的值更大,故w2对y的影响更大一些,因此对最终loss的影响也是不同的,需要更多训练步数才能达到最低点。scaling之后,w1和w2对y具有相同的影响力,从不同起点开始都是向最低点移动,效率更高。

现在我们提出一个问题,采用梯度下降法,是不是每一次更新参数都可以使损失函数下降?

深度学习中的优化方法

这种表述是不正确的,并不能被保证每一次迭代都会使损失函数下降。

下面从数学原理上来解释其原因:

深度学习中的优化方法

直观上,我们如何寻找最低点呢?一般就是先在当前位置的附近找到最低点,然后到达这个位置,继续在附近找寻最低点,重复这个过程,直到周围不存在更低的点,便找到我们希望的最低点。

首先我们先回顾一下泰勒展开:

深度学习中的优化方法

深度学习中的优化方法

深度学习中的优化方法

接下来回到梯度下降法,我们对损失函数做泰勒展开:

深度学习中的优化方法

深度学习中的优化方法

通过泰勒展开,L(θ)L(\theta)的优化转化为有约束的最小值问题,约束条件就是当前点附近足够小的区域(也就是红色圆圈的区域)。

深度学习中的优化方法

通过上面的转化,求解L(θ)L(\theta)的最小值就是求解uΔθ1+vΔθ2u \Delta \theta_1 + v \Delta \theta_2的最小值,也就是求解图中两个向量内积的最小值,由余弦定理:

ab=abcosθa·b = |a||b|cos \theta

由于向量(u,v)(u, v)是一定的,要使内积最小,当θ=180°\theta = 180°时,cosθ=1cos \theta = -1,向量(Δθ1,Δθ2)(\Delta \theta_1, \Delta \theta_2)的长度达到最大,可以使L(θ)L(\theta)最小,也就是向量(Δθ1,Δθ2)(\Delta \theta_1, \Delta \theta_2)的长度为d。

由上图的推导结果可知:最小化L(θ)L(\theta)就是在梯度方向上做梯度下降。

深度学习中的优化方法

所以,只有保证η\eta足够小,才满足泰勒展开,才能保证上面的式子是成立的,才能保证更新参数时使得L(θ)L(\theta)越来越小。

4. RMSProp

深度学习中的优化方法

根据前面的介绍,我们知道,Adagrad可以实现在不同的方向上使用不同的学习速率,但是对于更复杂的损失函数,可能需要在一个方向上learning rate也要能够快速变动:对于平坦的区域,使用较小的learning rate,对于陡峭的区域,使用较大的learning rate。

于是便引入RMSProp方法:

深度学习中的优化方法
深度学习中的优化方法

这里与Adagrad的差别在于,引入α\alpha,如果我们倾向于相信最新的梯度告诉我们error surface平滑或陡峭的程度,无视之前的梯度,那么就把α\alpha调小一点。

5. Momentum

深度学习中的优化方法

考虑到在物理世界里,如果一个小球顺着山坡向下走,即使遇到局部极小点,但是由于动量/惯性的缘故还是会越过小山坡跳出局部极小点,我们把动量引入Gradient Descent,便可以达到这种效果。

一般的Gradient Descent:

深度学习中的优化方法

引入动量的Gradient Descent:

我们在更新参数时会考虑到之前移动的方向,其中η\eta用于控制之前移动方向对当前点的影响(惯性的影响),η\eta大,惯性就大,η\eta小,惯性就小。

深度学习中的优化方法

从另一个方向来理解Momentum:

深度学习中的优化方法

其实这里的viv^i就是之前所有梯度的加权和,只不过引入λ\lambda来控制之前梯度的影响程度而已。

直观上理解如下图,其实每一个点的移动都是当前的负梯度与momentum叠加的结果。

深度学习中的优化方法

6. Adam

将RMSProp和Momentum两种优化方法结合起来就得到Adam方法,因此实际使用时,我们一般直接使用Adam优化器来优化损失函数。

深度学习中的优化方法

相关文章: