当X是一个数量很大的数据集,例如m=5000000;根据Mini-batch的思想,将这个大数据集X和Y以同样的方式划成小的数据集,如下图:
符号:
- x(i) : 第i个数据集
- X{t}、Y{t} : 第t个mini-batch数据集
之前的梯度下降法是同时处理整个数据集,即整个batch训练集的样本被处理;mini-batch梯度下降每次同时处理的是单个的mini-batch的X{t}和Y{t}。
mini-batch gradient descent:
假设有X的样本个数为5000 000,将数据集分成每1000个样本为一个mini-batch;可以分出5000个mini-batch数据集。
对这5000个数据集X{t}和Y{t}分别进行梯度下降,即一个mini-batch数据集进行一次梯度下降。
具体过程如下图:
上面的代码可被称为一代(one epoch)训练,即只遍历了一次训练集。
使用原来的batch梯度下降法,每遍历一次数据集只能进行一次梯度下降;使用mini-batch梯度下降一次遍历数据集可以进行m/b次梯度下降
。【m:样本数;b:每个mini-batch的数据样本数】
批量梯度下降代价函数会光滑些,曲线相对噪声低些,幅度也大些。
随机梯度下降代价函数曲线会有很多噪声,平均来看是接近局部最优解的,但是有时候下降的方向会错误;因为随机梯度下降法永远不会收敛,所有会一直在局部最优解附件波动
。
小批量梯度下降可以不用遍历整个数据集就可以进行一次梯度下降;当样本数很大时,相比批量梯度下降会减少很多计算代价。随机梯度下降每次梯度下降的计算代价少,但是会失去所有向量化带来的加速效果(矩阵计算运算速度会比较快);所有在具体实践中,应该选择一个不大不小的mini-batch size。
选择合适的mini-batch size可以获得两个好处:(1)享受向量化的加速;(2)不必遍历整个数据集就进行一次梯度下降
现在我们拥有伦敦的每日温度数据,如下图:
图像存在许多噪声,为了方便观看每日温度的总体趋势,可以通过移动平均的方法来对每天气温进行平滑处理。
对该数据采用移动平均(指数加权平均)进行处理,处理过程如下:
公式可表示为
指数加权平均:vt =βvt-1+(1-β)θ t
对于vt 可以近似的认为是过去1/(1-β)天的初略平均(这里不理解先记着,看下一节就会了)。
如β=0.9,那么vt可以看作是粗略估计过去10天的温度平均值,图像如上图红色部分;
如β=0.98,那么vt可以看作是粗略估计过去50天的温度平均值,图像如下图绿色部分;
可以看出绿色曲线更加平缓,原因在于多平均了几天的温度;缺点如图像的右边,温度发生了变化,图像下降地更缓慢些。
因此,当β越大,说明越考虑过去的数值,图像会较为平缓,当当前数值波动对整体也不会有太大影响;当β越小,说明越在乎当前的数值,不重视过去的数值,当前数据波动整体数据也会造成波动,图像较为起伏。
下面是指数加权平均的公式:
令β=0.9,将v100进行展开可以得到:
v100=0.1xθ100+0.1x0.9xθ99+0.1x(0.9)2θ98+0.1x(0.9)3θ97+0.1x(0.9)4θ96+……
v100=(1-β)θ100+(1-β)βθ99+(1-β)(β)2θ98+(1-β)(β)3θ97+(1-β)(β)4θ96+……
可以看出第100个数据依赖于0~100的当日温度,从左到右依次看系数,可以看出相邻系数之间相差一个β,呈指数型增长。
用图片来表示如下面所示:
数据如下图所示,接着我们在构建一个指数衰减函数。
指数衰减函数从左边的第一个系数0.1开始构造,然后成语0.9构造第二点,以此类推。如下图示:
然后计算v100就是把两个函数对应的元素相乘,然后求和。
vt 可以近似的认为是过去1/(1-β)天的粗略平均的解释:
上述例子β=0.9,(0.9)10=0.35≈e-1
可以得到:(1- ε)1/ε ≈e-1
具体的含义是,当过了1/ε天,衰减函数值就会降到峰值的e-1,即权重下降不到当日权重的1/3。所以看作是过去1/(1-β)天的粗略平均
实施指数加权平均
计算加权平均十分节省内存,只要记录当前vθ和下一个θt,不断覆盖vθ即可。相比正常的求平均值,指数加权平均不用存储过去的n个数值,但数值上会不是那么准确。
偏差修正可以让平均数运算更加准确
首先看一个存在的问题,令β=0.98,得到下图的紫色曲线:
紫色曲线在一开始比较低,因为一开始假设了v0=0,若第一天温度是40度
第一天的指数加权平均就是:
v1=0.98*v0+0.02 θ1=0.02 * 40 = 8;
第二天的指数加权平均就是:
v2=0.98v1+0.02 *θ2=0.98 * 0.02 * θ1 +0.02 * θ2= 0.0196 * θ1 + 0.02 *θ2;
计算后v2的值要远小于θ1和θ2,并不能很好的估测前两天的温度。
为了解决上述问题,用vt/(1-βt)代替vt。
例如,当t=2:1-βt = 1- (0.98)2 = 0.0396。第二天的数值变成v2/0.0396 = (0.0196 * θ1 + 0.02 *θ2)/ 0.0396
式子变成了θ1和θ2的加权平均数并除于对应的偏差。
可以看出随着t的增加,βt接近于0,所以当t很大的时候,偏差修正几乎没有作用
。
原来的梯度下降过程如上图蓝线所示,一路慢慢摆动向局部最优靠近;这个上下摆动减缓了梯度下降的速度,导致无法使用更大的学习率;因为更大的学习率会导致更大的摆动,如上图紫色线条所示。
因此在纵轴上希望学习的慢一点,不想要这些摆动;在横轴上希望加快学习,希望快速的从左向右移动。
gradient with momentum:
每次迭代都进行以下操作
(1)计算dw和db
(2)Vdw=βVdw+(1-β)dw
(3)Vdb=βVdb+(1-β)db
(4)W = W - αVdw
(5)b = W - αVdb
上述的方法(gradient with momentum)可以减缓下降的摆动程度,且横轴移动速度变快(因为积分方向大致都指向了局部最优解)。因此动量梯度下降可以加快梯度下降,可以使用更大的学利率
物理角度理解:
把梯度下降想象成小球在一个山谷下落,下落的梯度由下面两个公式提供:
Vdw=βVdw+(1-β)dw
Vdb=βVdb+(1-β)db
公式右部的Vdw和Vdb是原来的下落速度,β是小于1的数,可以看作下落过程中的阻力,因此小球不会无止境下落;右部的dw和db看作当前样本提供的加速度,让小球更快速的向局部最优下落。
因此,动量梯度下降法的每一步梯度下降都不会独立于之前梯度下降
gradient with momentum 实现细节:
所以需要控制两个超参数:学习率α和参数β,β控制着指数加权平均数;β最常用的数值是0.9
关于偏差修正,只需要将Vdw和Vdb除于(1-βt),但一般不这么做,因为过了1/t次迭代后,移动平均就已经过了初始阶段,不再是一个具有偏差的预测
。
现在有的版本动量梯度下降的梯度计算如下:
Vdw=βVdw+dw
Vdb=βVdb+db
去掉了(1-β),这个不会影响最后的结果,但是会影响对应最佳α的值
RMSprop是另一种优化梯度下降的算法。
每次迭代都进行以下操作
(1)计算dw和db
(2)Sdw=βSdw+(1-β)dw2
(3)Sdb=βSdb+(1-β)db2
(4)更新方式如下图:
- 理解RMSprop:
为了简化理解,只考虑b和w两个参数,横轴为方向为w,纵轴方向为b。梯度下降过程如下图蓝色线条所示:
我们想要的效果是在横轴w方向能够快速移动,纵轴方向b能够减少摆动。上图曲线可以看出纵轴摆动很大,从而db也会很大,因此Sdb也很大;横轴移动速度较慢,从而dw较小,因此Sdw也较小。结果就是纵轴b上的更新要被一个很大的数相除,就能消除摆动;而横轴w的更新则被较小的数相除,就能加速移动。【这里的w可以是一个多维的参数】
该方法的好处是:可以使用更大的学习率
,然后加快学习,而无须在纵轴上垂直方向偏离。
实现细节:
在现实时,为了确保更新时除的分子不是0或者接近于0的数(更新幅度会非常大),通常会在分子加上ε,ε=10-8是一个不错的选择。
Adam算法结合了动量梯度下降算法和RMSprop算法。算法流程如下:
Adam能够有效适用于不同神经网络,适用于广泛的结构。
本算法有很多超参数:
α:学习率需要调整
β1:可以设置为0.9
β2:推荐设置为0.999
ε:推荐设置为10-8,不设置也行,不会影响算法表现
Adam全称:Adaptive Moment Estimation
加快学习算法的一个办法就是随时间减少学习率
,称之为学习率衰减。
为什么要用学习率衰减?
假设使用mini-batch梯度下降, mini-batch数量不大,则在迭代过程中会有噪音,最后在局部最优的范围内进行徘徊,如下图所示。徘徊的原因就是使用了固定的学习率α。
但要逐渐减少学习率的话,在迭代初期,学习率较大,学习还是相对较快;随着α的减小,步伐也会变慢变小,所以最后曲线会最小值附件的一小块区域里摆动(即收敛于更小的一片区域),如下图的绿色线条。
可以这样做:
1epoch=一个mini-batch被遍历完
学习率可以定义为下图的式子:
decay_rate为衰减率,一个新的需要设置的超参数。上述学习率与迭代次数成反比,随着迭代次数的增加,学习率递减。
其他计算公式:
α = 0.95epoch α0 (指数衰退)
【t为mini-batch的数量】
还有将α设置为关于t的离散值:
下图是我们脑海中局部最优的图像,到处存在这局部最优,算法有可能困在某个局部最优里面,而不能抵达全局最优。
对于局部最优解是一个个小山谷其实是错误的理解;在神经网络中,梯度为0的点并不是这个突得局部最优点,其实就只是代价函数的0梯度点,通常是鞍点,如下图所示:
这只是二维的情况下,在高维的数据下,若是局部最优,要求在每个维度下都是凸函数或者是凹函数,但维度很高时发生的概率很小。所以,在高维数据更可能遇到鞍点
但鞍点的平稳段会减缓学习,平稳段是一块区域,其导数长时间接近于0。因此需要多次梯度下降才能缓慢的走出平稳段,如下图所示。