深度学习(三) 优化算法
3.1 梯度下降
基本思想:
利用当前位置的负梯度作为搜索方向,因为该方向为当前位置的最快下降方向
缺点:
靠近极小值时收敛速度减慢,可能成之字形下降
GD 梯度下降:
最小化所有训练样本的损失函数,使得最终求解的是全局的最优解,即求解的参数是使得风险函数最小
大规模样本问题效率低下,使用全部的数据集 速度慢,占内存(用全部可能几次就不变了 梯度 陷入局部最优)
SGD随机梯度下降:
最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况。
噪音比较多 并不是每次迭代都向着整体最优的方向
随机梯度下降方法以损失很小的一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升
Mini batch SGD:
它是 GD 与 SGD 的一个折中选择,有着较好的收敛效果与速度
**Mini batch部分能够代表全局数据,产生于全部
数据较为相似的梯度方向。**
Mini batch之间可能相互抵消梯度的学习,也容易收噪声干扰,从而减慢收敛速度。
3.2 动量加速
3.2.1 Momentum
随机梯度下降每次迭代计算 有着较大的噪音,Momentum可以缓解这一问题,尤其是面对小而一致的梯度 且含有很多噪音时(更新梯度的方向不是全局的方向) 可以很好的学习 加速
借用了物理中动量的概率,当前梯度的计算也会使用前几次的梯度
α α 为衰减速度 η η 为学习率
g←1mΔθ∑i=1mL(f(xi;θ),yi)v←αv−ηgθ←θ+v(3.2.1) g ← 1 m Δ θ ∑ i = 1 m L ( f ( x i ; θ ) , y i ) v ← α v − η g (3.2.1) θ ← θ + v
一般α的取值有0.5,0.9,0.99这几种.当然,也可以让α的值随着时间而变化,一开始小点,后来再加大.不过这样一来,又会引进新的参数.
下降初期时,使用上一次参数更新,下降方向一致,乘上较大的 能够进行很好的加速
下降中后期时,在局部最小值来回震荡的时候,使得更新幅度增大,跳出陷阱
在梯度改变方向的时候, 能够减少更新 总而言之,momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛
3.2.2 Nesterov Momentum
nesterov项在梯度更新时做一个校正,避免前进太快,同时提高灵敏度。
g←1mΔθ∑i=1mL(f(xi;θ+αv),yi)v←αv−ηgθ←θ+v(3.2.2) g ← 1 m Δ θ ∑ i = 1 m L ( f ( x i ; θ + α v ) , y i ) v ← α v − η g (3.2.2) θ ← θ + v
之前的动量并没有直接改变当前梯度,所以Nesterov的改进就是让之前的动量直接影响当前的动量
momentum首先计算一个梯度(短的蓝色向量),然后在加速更新梯度的方向进行一个大的跳跃(长的蓝色向量),nesterov项首先在之前加速的梯度方向进行一个大的跳跃(棕色向量),计算梯度然后进行校正(绿色梯向量)
3.3 二阶近似算法
3.3.1 牛顿法
牛顿法使用损失函数的泰勒级数前几项来寻找方程的根,加速收敛
J(θ)≈J(θ0)+(θ−θ0)TΔθJ(θ0)+12(θ−θ0)TH(θ−θ0)(3.3.1) (3.3.1) J ( θ ) ≈ J ( θ 0 ) + ( θ − θ 0 ) T Δ θ J ( θ 0 ) + 1 2 ( θ − θ 0 ) T H ( θ − θ 0 )
θ∗=θ−H−1ΔθJ(θ0)(3.3.2) (3.3.2) θ ∗ = θ − H − 1 Δ θ J ( θ 0 )
从本质上去看,牛顿法是
二阶收敛,梯度下降是一阶收敛,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,
不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。
缺点:
Hessian矩阵的逆矩阵的计算
n3 n 3 数量级,与存储问题
Hessian矩阵的逆不正定时,不能保证产生的方向一定是目标函数下降的方向,尤其是若其不可逆时算法无法进
行(+正则)
3.3.2 拟牛顿法
本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。n阶矩阵近似矩阵来代替海森矩阵
算法产生的方向近似于牛顿方向,确保算法具有较快的收敛速度。
通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。 要存储Hessian矩阵的逆近似矩阵空间
n2 n 2 复杂度,过高。
3.3.3 共轭梯度法
共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点
3.4 自适应学习率算法
3.4.1 Adagrad
AdaGrad可以自动变更学习速率,只是需要设定一个全局的学习速率ϵ,但是这并非是实际学习速率。对学习率进行了一个约束, nt+ϵ−−−−−√ n t + ϵ 相当于约束项
nt=nt−1+gt⊙gtΔθ=−ηnt−−√+ϵ⊙gt(3.4.1) n t = n t − 1 + g t ⊙ g t (3.4.1) Δ θ = − η n t + ϵ ⊙ g t
设置全局学习率之后,每次通过全局学习率逐参数的除以历史梯度平方和的平方根,使得每个参数的学习率不同
优点:
前期
gt g t 较小的时候,regularizer较小,能够放大梯度
后期
gt g t 较大的时候,regularizer较大,能够约束梯度
适合处理稀疏梯度
缺点:
由公式可以看出,仍依赖于人工设置一个全局学习率
η设置过大的话,会使regularizer过于敏感,对梯度的调节太大
中后期,分母上梯度平方的累加将会越来越大,使得训练提前结束,对一般的学习任务而言性能不错,而在深度学习可
能会提前训练结束
3.4.2 Adadelta
Adadelta是对Adagrad的扩展,最初方案依然是对学习率进行自适应约束,但是进行了计算上的简化。做了一定的处理之后(类似牛顿法),可以看出Adadelta已经不用依赖于全局学习率了。
nt=ρnt−1+(1−ρ)gt⊙gtΔθt=−ηnt+ϵ−−−−−√⊙gt≈−∑t−1r=1Δ2θr−−−−−−−−√nt+ϵ−−−−−√⊙gt(3.4.2) n t = ρ n t − 1 + ( 1 − ρ ) g t ⊙ g t Δ θ t = − η n t + ϵ ⊙ g t (3.4.2) ≈ − ∑ r = 1 t − 1 Δ θ r 2 n t + ϵ ⊙ g t
优点:
训练初中期,加速效果不错,很快
一大优势时可以避免手动调节学习率,比如设置初始的缺省学习率为0.01,另其在学习的过程中自己变化。
适合处理稀疏梯度
缺点:
训练后期,反复在局部最小值附近抖动
它计算时要在分母上计算梯度平方的和,由于所有的参数平法必为正数,这样就造成在训练的过程中,分母累积的和
会越来越大。这样学习到后来的阶段,网络的更新能力会越来越弱,能学到的更多知识的能力也越来越弱,因为学习率会
变得极其小
3.4.3 RMSProp
nt=ρnt−1+(1−ρ)gt⊙gtΔθt=−ηnt+ϵ−−−−−√⊙gt(3.4.3) n t = ρ n t − 1 + ( 1 − ρ ) g t ⊙ g t (3.4.3) Δ θ t = − η n t + ϵ ⊙ g t
优点:
RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间
适合处理非平稳目标 对于RNN效果很好
缺点:
RMSprop依然依赖于全局学习率
3.4.4 Adam
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop。它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
s s 相当于动量项, r r 相当于RMSProp项
ρ1 ρ 1 、 ρ2 ρ 2 为指数衰减率建议为0.9,0.999
s←ρ1s+(1−ρ1)gr←ρ2r+(1−ρ2)g⊙gs^←s1−ρt1r^←r1−ρt2Δθ=−ηs^r^−−√+ϵ(3.4.4) s ← ρ 1 s + ( 1 − ρ 1 ) g r ← ρ 2 r + ( 1 − ρ 2 ) g ⊙ g s ^ ← s 1 − ρ 1 t r ^ ← r 1 − ρ 2 t (3.4.4) Δ θ = − η s ^ r ^ + ϵ
优点:
结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
对内存需求较小
对超参数的选择鲁棒
为不同的参数计算不同的自适应学习率
也适用于大多非凸优化 - 适用于大数据集和高维空间