深度学习中的优化方法:
以下内容会包括下面几种优化方法:
- Gradient Descent
- Adagrad
- Momentum
- RMSProP
- Adam
1. Gradient Descent
首先,Gradient Descent是我们最常用的优化方法,梯度下降的参数更新公式为:
其中是损失函数的梯度,为学习速率。
针对以上公式,我们发现前面是负号,可是为什么前面是负号呢?下面结合梯度下降的过程来说明:
如下图所示:当梯度下降的时候,梯度为负数时(),说明损失函数在向右的方向上是下降的,因此参数应该增加;梯度为正数时(),说明损失函数在向左的方向上是下降的,参数应该减小。这样才能保证损失函数向更低点移动,因此参数的迭代与梯度的符号相反,前面添加负号。
由梯度下降公式(1),其中包含一个超参数需要我们调整:当调节超参数时,设置的过小会使模型收敛变慢,设置的过大使模型无法收敛到最低点。我们希望刚开始损失函数距离最低点较远时,学习速率更大,损失函数距离最低点较近时,学习速率减小。因此的值可以会随模型的迭代逐渐变化(刚开始距离最低点较远,更大,在逐渐接近最低点,减小),比如:使用倒数衰减1/t decay。公式如下:
使用上式,可以使得模型迭代次数越多,值越小。
但是利用上式仍旧是不够的,它对所有参数都使用相同的学习速率,而我们希望不同的参数给予不同的,其中比较常用的是Adagrad。
2. Adagrad:
Adagrad的参数迭代过程就是用学习速率除以过去所有参数的微分值的均方根,它能够对每个参数自适应不同的学习速率。公式如下:
其中:,是过去所有参数的微分值的均方根。
举例:
公式(2)化简后,得到:
根据上图,我们比较梯度下降和Adagrad,我们在计算梯度下降的时候,梯度这一项越大,参数更新越快;而在Adagrad中,分母中也包括梯度,并且梯度越大,参数更新越慢,这样的话,分子分母是不是存在冲突呢?
首先我们先考虑只有一个参数的情况:
我么发现,参数更新的最好步长与一次微分成正比,并且一次微分越大意味着距离最低点的距离越远。
但是如果有多个参数呢?
当不跨参数时,上面的结论是成立的;当跨参数时,我们发现c点的梯度值更大,但a点距离最低点更远。
我们再回到前面的图,我们发现:最优步长不仅与一次微分有关,同时与二次微分也有关系:
由上图可见,一次微分大的点,二次微分也比较大,因此距离最低点的距离需要同时考虑一次微分和二次微分,参数更新最好的步长与一次微分成正比,与二次微分成反比。
因此,我们需要考虑二次微分,但是却不想算二次微分,因为会使计算量变的很大,因此我们考虑使用一次微分来估计二次微分(我们发现二次微分大的曲线,在一次微分上的点会比较大。因此,计算二次微分的过程,相当于在一次微分上做采样,然后平方求和来估计二次微分)。
3. 关于梯度下降法的补充
Stochastic Gradient Descent:
采用随机梯度下降为什么比批量梯度下降要好?
在所有数据上采用批量梯度下降,每次迭代参数只更新一次,但是采用随机梯度下降,在相同的数据上做计算,参数可以更新很多次,收敛更快。
Gradient Descent:Feature Scaling
为什么要做scaling?
由上图:如果不做scaling,w1和w2做相同的变化,对y的影响是不同的。显而易见,x2的值更大,故w2对y的影响更大一些,因此对最终loss的影响也是不同的,需要更多训练步数才能达到最低点。scaling之后,w1和w2对y具有相同的影响力,从不同起点开始都是向最低点移动,效率更高。
现在我们提出一个问题,采用梯度下降法,是不是每一次更新参数都可以使损失函数下降?
这种表述是不正确的,并不能被保证每一次迭代都会使损失函数下降。
下面从数学原理上来解释其原因:
直观上,我们如何寻找最低点呢?一般就是先在当前位置的附近找到最低点,然后到达这个位置,继续在附近找寻最低点,重复这个过程,直到周围不存在更低的点,便找到我们希望的最低点。
首先我们先回顾一下泰勒展开:
接下来回到梯度下降法,我们对损失函数做泰勒展开:
通过泰勒展开,的优化转化为有约束的最小值问题,约束条件就是当前点附近足够小的区域(也就是红色圆圈的区域)。
通过上面的转化,求解的最小值就是求解的最小值,也就是求解图中两个向量内积的最小值,由余弦定理:
由于向量是一定的,要使内积最小,当时,,向量的长度达到最大,可以使最小,也就是向量的长度为d。
由上图的推导结果可知:最小化就是在梯度方向上做梯度下降。
所以,只有保证足够小,才满足泰勒展开,才能保证上面的式子是成立的,才能保证更新参数时使得越来越小。
4. RMSProp
根据前面的介绍,我们知道,Adagrad可以实现在不同的方向上使用不同的学习速率,但是对于更复杂的损失函数,可能需要在一个方向上learning rate也要能够快速变动:对于平坦的区域,使用较小的learning rate,对于陡峭的区域,使用较大的learning rate。
于是便引入RMSProp方法:
这里与Adagrad的差别在于,引入,如果我们倾向于相信最新的梯度告诉我们error surface平滑或陡峭的程度,无视之前的梯度,那么就把调小一点。
5. Momentum
考虑到在物理世界里,如果一个小球顺着山坡向下走,即使遇到局部极小点,但是由于动量/惯性的缘故还是会越过小山坡跳出局部极小点,我们把动量引入Gradient Descent,便可以达到这种效果。
一般的Gradient Descent:
引入动量的Gradient Descent:
我们在更新参数时会考虑到之前移动的方向,其中用于控制之前移动方向对当前点的影响(惯性的影响),大,惯性就大,小,惯性就小。
从另一个方向来理解Momentum:
其实这里的就是之前所有梯度的加权和,只不过引入来控制之前梯度的影响程度而已。
直观上理解如下图,其实每一个点的移动都是当前的负梯度与momentum叠加的结果。
6. Adam
将RMSProp和Momentum两种优化方法结合起来就得到Adam方法,因此实际使用时,我们一般直接使用Adam优化器来优化损失函数。