1. mini-batch 梯度下降算法
在对整个训练集执行梯度下降法时,每进行一步梯度下降法都必须处理整个训练集。训练集很大的时候,如有500万或5000万训练数据时,处理速度就会比较慢。
如果每次处理训练数据的一部分,即用其子集进行梯度下降,则我们的算法速度会执行的更快。而处理的这些一小部分训练子集即称为Mini-batch。
1.1 算法原理:
对于普通的梯度下降法,一个epoch只能进行一次梯度下降;而对于Mini-batch梯度下降法,一个epoch可以进行Mini-batch的个数次梯度下降。
1.2 batch vs. mini-batch
普通的batch梯度下降法和Mini-batch梯度下降法代价函数的变化趋势,如下图所示:
batch梯度下降(size=m):
- 对所有m个训练样本执行一次梯度下降,每一次迭代时间较长;
- Cost function 总是向减小的方向下降。
随机梯度下降(size=1):
- 对每一个训练样本执行一次梯度下降,但是丢失了向量化带来的计算加速;
- Cost function总体的趋势向最小值的方向下降,但是无法到达全局最小值点,呈现波动的形式。
Mini-batch梯度下降:
- 选择一个 1<size<m 的合适的size进行Mini-batch梯度下降,可以实现快速学习,也应用了向量化带来的好处;
- Cost function的下降处于前两者之间。
1.3 mini-batch大小的选择
- 如果训练样本的大小比较小时,如 m ⩽ 2000 m\leqslant 2000 m⩽2000 时,选择batch梯度下降法;
- 如果训练样本的大小比较大时,典型的大小为: 2 6 、 2 7 、 ⋯ 、 2 10 2^{6}、2^{7}、\cdots、2^{10} 26、27、⋯、210 ;
- Mini-batch的大小要符合CPU/GPU内存。
2. 指数加权平均
2.1 原理
指数加权平均的关键函数:
v t = β v t − 1 + ( 1 − β ) θ t v_{t} = \beta v_{t-1}+(1-\beta)\theta_{t} vt=βvt−1+(1−β)θt
下图是一个关于天数和温度的散点图:
- 当 β = 0.9 \beta =0.9 β=0.9 时,指数加权平均最后的结果如图中红色线所示;
- 当 β = 0.98 \beta =0.98 β=0.98 时,指数加权平均最后的结果如图中绿色线所示;
- 当 β = 0.5 \beta =0.5 β=0.5 时,指数加权平均最后的结果如下图中黄色线所示;
2.2 理解指数加权平均
例子,当 β = 0.9 \beta =0.9 β=0.9 时:
v 100 = 0.9 v 99 + 0.1 θ 100 v 99 = 0.9 v 98 + 0.1 θ 99 v 98 = 0.9 v 97 + 0.1 θ 98 … v_{100} = 0.9v_{99}+0.1\theta_{100}\\v_{99} = 0.9v_{98}+0.1\theta_{99}\\v_{98} = 0.9v_{97}+0.1\theta_{98}\\ \ldots v100=0.9v99+0.1θ100v99=0.9v98+0.1θ99v98=0.9v97+0.1θ98…
展开,有:
v 100 = 0.1 θ 100 + 0.9 ( 0.1 θ 99 + 0.9 ( 0.1 θ 98 + 0.9 v 97 ) ) = 0.1 θ 100 + 0.1 × 0.9 θ 99 + 0.1 × ( 0.9 ) 2 θ 98 + 0.1 × ( 0.9 ) 3 θ 97 + ⋯ v_{100}=0.1\theta_{100}+0.9(0.1\theta_{99}+0.9(0.1\theta_{98}+0.9v_{97}))\\=0.1\theta_{100}+0.1\times0.9\theta_{99}+0.1\times(0.9)^{2}\theta_{98}+0.1\times(0.9)^{3}\theta_{97}+\cdots v100=0.1θ100+0.9(0.1θ99+0.9(0.1θ98+0.9v97))=0.1θ100+0.1×0.9θ99+0.1×(0.9)2θ98+0.1×(0.9)3θ97+⋯
上式中所有 θ \theta θ 前面的系数相加起来为1或者接近于1,称之为偏差修正。
总体来说存在, ( 1 − ε ) 1 / ε = 1 e (1-\varepsilon)^{1/\varepsilon}=\dfrac{1}{e} (1−ε)1/ε=e1 ,在我们的例子中, 1 − ε = β = 0.9 1-\varepsilon=\beta=0.9 1−ε=β=0.9 ,即 0. 9 10 ≈ 0.35 ≈ 1 e 0.9^{10}\approx 0.35\approx\dfrac{1}{e} 0.910≈0.35≈e1 。相当于大约10天后,系数的峰值(这里是0.1)下降到原来的 1 e \dfrac{1}{e} e1 ,只关注了过去10天的天气。
指数加权平均实现
v 0 = 0 v 1 = β v 0 + ( 1 − β ) θ 1 v 2 = β v 1 + ( 1 − β ) θ 2 v 3 = β v 2 + ( 1 − β ) θ 3 … v_{0} =0\\ v_{1}= \beta v_{0}+(1-\beta)\theta_{1}\\ v_{2}= \beta v_{1}+(1-\beta)\theta_{2}\\ v_{3}= \beta v_{2}+(1-\beta)\theta_{3}\\ \ldots v0=0v1=βv0+(1−β)θ1v2=βv1+(1−β)θ2v3=βv2+(1−β)θ3…
因为,在计算当前时刻的平均值,只需要前一天的平均值和当前时刻的值,所以在数据量非常大的情况下,指数加权平均在节约计算成本的方面是一种非常有效的方式,可以很大程度上减少计算机资源存储和内存的占用。
2.3 指数加权平均的偏差修正
在我们执行指数加权平均的公式时,当
β
=
0.98
\beta=0.98
β=0.98 时,我们得到的并不是图中的绿色曲线,而是下图中的紫色曲线,其起点比较低。
原因:
v 0 = 0 v 1 = 0.98 v 0 + 0.02 θ 1 = 0.02 θ 1 v 2 = 0.98 v 1 + 0.02 θ 2 = 0.98 × 0.02 θ 1 + 0.02 θ 2 = 0.0196 θ 1 + 0.02 θ 2 v_{0}=0\\v_{1}=0.98v_{0}+0.02\theta_{1}=0.02\theta_{1}\\v_{2}=0.98v_{1}+0.02\theta_{2}=0.98\times0.02\theta_{1}+0.02\theta_{2}=0.0196\theta_{1}+0.02\theta_{2} v0=0v1=0.98v0+0.02θ1=0.02θ1v2=0.98v1+0.02θ2=0.98×0.02θ1+0.02θ2=0.0196θ1+0.02θ2
如果第一天的值为如 40 ,则 v 1 = 0.02 × 40 = 8 v_{1}=0.02\times40=8 v1=0.02×40=8 ,得到的值要远小于实际值,后面几天的情况也会由于初值引起的影响,均低于实际均值。
偏差修正:
使用 v t = v t 1 − β t v_{t}=\frac{v_{t}}{1-\beta^t} vt=1−βtvt
当 t=2 时:
1 − β t = 1 − ( 0.98 ) 2 = 0.0396 1-\beta^{t}=1-(0.98)^{2}=0.0396 1−βt=1−(0.98)2=0.0396
v 2 0.0396 = 0.0196 θ 1 + 0.02 θ 2 0.0396 \dfrac{v_{2}}{0.0396}=\dfrac{0.0196\theta_{1}+0.02\theta_{2}}{0.0396} 0.0396v2=0.03960.0196θ1+0.02θ2
偏差修正得到了绿色的曲线,在开始的时候,能够得到比紫色曲线更好的计算平均的效果。随着 t 逐渐增大, β t \beta^{t} βt 接近于0,所以后面绿色的曲线和紫色的曲线逐渐重合了。
在实际过程中,一般会忽略前期均值偏差的影响。
3. 动量(Momentum)梯度下降法
动量梯度下降的基本思想就是计算梯度的指数加权平均数,并利用该梯度来更新权重。
在我们优化 Cost function 的时候,以下图所示的函数图为例:
在利用梯度下降法来最小化该函数的时候,每一次迭代所更新的代价函数值如图中蓝色线所示在上下波动,而这种幅度比较大的波动,减缓了梯度下降的速度,而且我们只能使用一个较小的学习率来进行迭代。
如果用较大的学习率,结果可能会如紫色线一样偏离函数的范围,所以为了避免这种情况,只能用较小的学习率。
但是我们又希望在如图的纵轴方向梯度下降的缓慢一些,不要有如此大的上下波动,在横轴方向梯度下降的快速一些,使得能够更快的到达最小值点,而这里用动量梯度下降法既可以实现,如红色线所示。
算法实现
β
\beta
β 常用的值是0.9。
在我们进行动量梯度下降算法的时候,由于使用了指数加权平均的方法。原来在纵轴方向上的上下波动,经过平均以后,接近于0,纵轴上的波动变得非常的小;但在横轴方向上,所有的微分都指向横轴方向,因此其平均值仍然很大。最终实现红色线所示的梯度下降曲线。
在对应上面的计算公式中,将Cost function想象为一个碗状,想象从顶部往下滚球,其中:
- 微分项 dw,db 想象为球提供的加速度;
- 动量项 v_{dw},v_{db} 相当于速度;
小球在向下滚动的过程中,因为加速度的存在使得速度会变快,但是由于 \beta 的存在,其值小于1,可以认为是摩擦力,所以球不会无限加速下去。
4. RMSprop(root mean square prop)
除了上面所说的Momentum梯度下降法,RMSprop(root mean square prop)也是一种可以加快梯度下降的算法。
同样算法的样例实现如下图所示:
这里假设参数b的梯度处于纵轴方向,参数w的梯度处于横轴方向(当然实际中是处于高维度的情况),利用RMSprop算法,可以减小某些维度梯度更新波动较大的情况,如图中蓝色线所示,使其梯度下降的速度变得更快,如图绿色线所示。
在如图所示的实现中,RMSprop将微分项进行平方,然后使用平方根进行梯度更新,同时为了确保算法不会除以0,平方根分母中在实际使用会加入一个很小的值如 ε = 1 0 − 8 \varepsilon=10^{-8} ε=10−8 。
5. Adam 优化算法
Adam (Adaptive Moment Estimation)优化算法的基本思想就是将 Momentum 和 RMSprop 结合起来形成的一种适用于不同深度学习结构的优化算法。
算法实现:
初始化: V d w = 0 , S d w = 0 , V d b = 0 , S d b = 0 V_{dw} = 0,S_{dw}=0,V_{db}=0,S_{db} = 0 Vdw=0,Sdw=0,Vdb=0,Sdb=0
第 t 次迭代:
- C o m p u t e d w , d b o n t h e c u r r e n t m i n i − b a t c h Compute dw,db on the current mini-batch Computedw,dbonthecurrentmini−batch
- V d w = β 1 V d w + ( 1 − β 1 ) d w , V d b = β 1 V d b + ( 1 − β 1 ) d b − − − − − “ M o m e n t u m ” V_{dw}=\beta_{1}V_{dw}+(1-\beta_{1})dw,V_{db}=\beta_{1}V_{db}+(1-\beta_{1})db ----- “Momentum” Vdw=β1Vdw+(1−β1)dw,Vdb=β1Vdb+(1−β1)db−−−−−“Momentum”
- S d w = β 2 S d w + ( 1 − β 2 ) ( d w ) 2 , S d b = β 2 S d b + ( 1 − β 2 ) ( d b ) 2 − − − − − “ R M S p r o p ” S_{dw}=\beta_{2}S_{dw}+(1-\beta_{2})(dw)^{2},S_{db}=\beta_{2}S_{db}+(1-\beta_{2})(db)^{2} ----- “RMSprop” Sdw=β2Sdw+(1−β2)(dw)2,Sdb=β2Sdb+(1−β2)(db)2−−−−−“RMSprop”
- V d w c o r r e c t e d = V d w / ( 1 − β 1 t ) , V d b c o r r e c t e d = V d b / ( 1 − β 1 t ) − − − − − 偏 差 修 正 V_{dw}^{corrected} = V_{dw}/(1-\beta_{1}^{t}),V_{db}^{corrected} = V_{db}/(1-\beta_{1}^{t}) ----- 偏差修正 Vdwcorrected=Vdw/(1−β1t),Vdbcorrected=Vdb/(1−β1t)−−−−−偏差修正
- S d w c o r r e c t e d = S d w / ( 1 − β 2 t ) , S d b c o r r e c t e d = S d b / ( 1 − β 2 t ) − − − − − 偏 差 修 正 S_{dw}^{corrected} = S_{dw}/(1-\beta_{2}^{t}),S_{db}^{corrected} = S_{db}/(1-\beta_{2}^{t}) ----- 偏差修正 Sdwcorrected=Sdw/(1−β2t),Sdbcorrected=Sdb/(1−β2t)−−−−−偏差修正
- w : = w − α V d w c o r r e c t e d S d w c o r r e c t e d + ε , b : = b − α V d b c o r r e c t e d S d b c o r r e c t e d + ε w:=w-\alpha\dfrac{V_{dw}^{corrected}}{\sqrt{S_{dw}^{corrected}}+\varepsilon},b:=b-\alpha\dfrac{V_{db}^{corrected}}{\sqrt{S_{db}^{corrected}}+\varepsilon} w:=w−αSdwcorrected+εVdwcorrected,b:=b−αSdbcorrected+εVdbcorrected
超参数的选择
α
\alpha
α :需要进行调试;
β
1
\beta_{1}
β1 :常用缺省值为0.9,
d
w
dw
dw 的加权平均;
4
β
2
4\beta_{2}
4β2 :推荐使用0.999,
d
w
2
dw^{2}
dw2 的加权平均值;
ε
\varepsilon
ε :推荐使用
1
0
−
8
10^{-8}
10−8 。
6. 学习率衰减
在我们利用 mini-batch 梯度下降法来寻找Cost function的最小值的时候,如果我们设置一个固定的学习速率 α \alpha α ,则算法在到达最小值点附近后,由于不同batch中存在一定的噪声,使得不会精确收敛,而一直会在一个最小值点较大的范围内波动,如下图中蓝色线所示。
但是如果我们使用学习率衰减,逐渐减小学习速率 α \alpha α ,在算法开始的时候,学习速率还是相对较快,能够相对快速的向最小值点的方向下降。但随着 α \alpha α 的减小,下降的步伐也会逐渐变小,最终会在最小值附近的一块更小的区域里波动,如图中绿色线所示。
学习率衰减的实现:
- 常用: α = 1 1 + d e c a y _ r a t e ∗ e p o c h _ n u m α 0 \alpha = \dfrac{1}{1+decay\_rate*epoch\_num}\alpha_{0} α=1+decay_rate∗epoch_num1α0
- 指数衰减: α = 0.9 5 e p o c h _ n u m α 0 \alpha = 0.95^{epoch\_num}\alpha_{0} α=0.95epoch_numα0
- 其他: α = k e p o c h _ n u m ⋅ α 0 \alpha = \dfrac{k}{epoch\_num}\cdot\alpha_{0} α=epoch_numk⋅α0
- 离散下降(不同阶段使用不同的学习速率)
7. 局部最优问题
在低维度的情形下,我们可能会想象到一个Cost function 如左图所示,存在一些局部最小值点,在初始化参数的时候,如果初始值选取的不得当,会存在陷入局部最优点的可能性。
但是,如果我们建立一个高维度的神经网络。通常梯度为零的点,并不是如左图中的局部最优点,而是右图中的鞍点(叫鞍点是因为其形状像马鞍的形状)。
在一个具有高维度空间的函数中,如果梯度为0,那么在每个方向,Cost function可能是凸函数,也有可能是凹函数。但如果参数维度为2万维,想要得到局部最优解,那么所有维度均需要是凹函数,其概率为
2
−
20000
2^{-20000}
2−20000 ,可能性非常的小。也就是说,在低维度中的局部最优点的情况,并不适用于高维度,在梯度为0的点更有可能是鞍点,而不是局部最小值点。
在高纬度的情况下:
- 几乎不可能陷入局部最小值点;
- 处于鞍点的停滞区会减缓学习过程,利用如Adam等算法进行改善。
参考资料
[1] 吴恩达深度学习视频教程连载笔记:https://zhuanlan.zhihu.com/p/30034654
[2] 吴恩达深度学习网易云视频课
总结的真的很好哎。。这一趴的貌似没改动。QAQ