深度学习中的优化方法:
以下内容会包括下面几种优化方法:
- Gradient Descent
- Adagrad
- Momentum
- RMSProP
- Adam
1. Gradient Descent
首先,Gradient Descent是我们最常用的优化方法,梯度下降的参数更新公式为:
(1) θ i = θ i − 1 − η ∇ L ( θ i − 1 ) \theta^i = \theta^{i-1} - \eta \nabla L(\theta^{i-1}) \tag 1 θi=θi−1−η∇L(θi−1)(1)
其中 ∇ L ( θ i − 1 ) \nabla L(\theta^{i-1}) ∇L(θi−1)是损失函数的梯度, η \eta η为学习速率。
针对以上公式,我们发现 η \eta η前面是负号,可是为什么 η \eta η前面是负号呢?下面结合梯度下降的过程来说明:
如下图所示:当梯度下降的时候,梯度为负数时( θ 0 \theta^0 θ0),说明损失函数在向右的方向上是下降的,因此参数 θ \theta θ应该增加;梯度为正数时( θ 3 \theta^3 θ3),说明损失函数在向左的方向上是下降的,参数 θ \theta θ应该减小。这样才能保证损失函数向更低点移动,因此参数的迭代与梯度的符号相反, η \eta η前面添加负号。
由梯度下降公式(1),其中包含一个超参数 η \eta η需要我们调整:当调节超参数时, η \eta η设置的过小会使模型收敛变慢, η \eta η设置的过大使模型无法收敛到最低点。我们希望刚开始损失函数距离最低点较远时,学习速率更大,损失函数距离最低点较近时,学习速率减小。因此 η \eta η的值可以会随模型的迭代逐渐变化(刚开始距离最低点较远, η \eta η更大,在逐渐接近最低点, η \eta η减小),比如:使用倒数衰减1/t decay。公式如下:
η t = η t + 1 \eta^t = {\eta \over \sqrt{t+1}} ηt=t+1η
使用上式,可以使得模型迭代次数越多, η \eta η值越小。
但是利用上式仍旧是不够的,它对所有参数都使用相同的学习速率,而我们希望不同的参数给予不同的 η \eta η,其中比较常用的是Adagrad。
2. Adagrad:
Adagrad的参数迭代过程就是用学习速率 η \eta η除以过去所有参数的微分值的均方根,它能够对每个参数自适应不同的学习速率。公式如下:
(2) w t + 1 = w t − η t σ t g t w^{t+1} = w^t - {\eta^t \over \sigma^t} g^t \tag 2 wt+1=wt−σtηtgt(2)
其中: g t = ∂ L ( w t ) ∂ w g^t = {\partial L(w^t) \over \partial w} gt=∂w∂L(wt), σ t \sigma^t σt是过去所有参数的微分值的均方根。
举例:
公式(2)化简后,得到:
根据上图,我们比较梯度下降和Adagrad,我们在计算梯度下降的时候,梯度 g t g^t gt这一项越大,参数更新越快;而在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 ( θ ) L(\theta) L(θ)的最小值就是求解 u Δ θ 1 + v Δ θ 2 u \Delta \theta_1 + v \Delta \theta_2 uΔθ1+vΔθ2的最小值,也就是求解图中两个向量内积的最小值,由余弦定理:
a ⋅ b = ∣ a ∣ ∣ b ∣ c o s θ a·b = |a||b|cos \theta a⋅b=∣a∣∣b∣cosθ
由于向量 ( u , v ) (u, v) (u,v)是一定的,要使内积最小,当 θ = 180 ° \theta = 180° θ=180°时, c o s θ = − 1 cos \theta = -1 cosθ=−1,向量 ( Δ θ 1 , Δ θ 2 ) (\Delta \theta_1, \Delta \theta_2) (Δθ1,Δθ2)的长度达到最大,可以使 L ( θ ) L(\theta) L(θ)最小,也就是向量 ( Δ θ 1 , Δ θ 2 ) (\Delta \theta_1, \Delta \theta_2) (Δθ1,Δθ2)的长度为d。
由上图的推导结果可知:最小化 L ( θ ) L(\theta) L(θ)就是在梯度方向上做梯度下降。
所以,只有保证 η \eta η足够小,才满足泰勒展开,才能保证上面的式子是成立的,才能保证更新参数时使得 L ( θ ) L(\theta) L(θ)越来越小。
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:
其实这里的 v i v^i vi就是之前所有梯度的加权和,只不过引入 λ \lambda λ来控制之前梯度的影响程度而已。
直观上理解如下图,其实每一个点的移动都是当前的负梯度与momentum叠加的结果。
6. Adam
将RMSProp和Momentum两种优化方法结合起来就得到Adam方法,因此实际使用时,我们一般直接使用Adam优化器来优化损失函数。