01 Mini-batch 梯度下降法
- X代表训练样本的集合,向量化能够相对较快地处理所有m个样本,但是如果m过大,处理速度仍然缓慢。在对整个训练集执行梯度下降法时,原本是需要处理完所有样本,才能进行一步梯度下降法,然后再重新处理所有样本,才能进行下一步梯度下降,但是如果在处理完所有样本之前,先让梯度下降法处理一部分,那么算法速度将会更快。因此我们可以将训练集分割为小一点地子集(子集就叫Mini-batch ),我们用X^ {t}代表第t个子集,当然Y也需要分割。
- 在使用Mini-batch 梯度下降法时,同样要设有一个循环,这个循环是遍历所有的子训练集,同样的也要计算前向传播、代价函数J及执行后向传播来计算J^ {t}的梯度,只使用X^ {t}和Y^ {t},然后更新权值。这只是遍历了一次训练集,如果还想多次遍历需要使用for或者while。
02 理解 mini-batch 梯度下降法
- Batch梯度下降法:成本函数J会随着每次迭代而减小;mini-batch 梯度下降法:由于每次迭代都在训练不同的样本集(X^ {t}和Y^ {t}),所以成本函数J会产生波动,但是总体趋势是下降的。
-
决定mini-batch的大小有两种极端的情况:
- mini-batch = m(整个训练集)–>Batch梯度下降法(如果m很大,则单次迭代耗时太长)
- mini-batch = 1–>随机梯度下降法(会失去所有向量化带来的加速,效率过于低下,并且结果永远都不会收敛,会一直在最小值附近徘徊)
-
在这两种极端情况下,成本函数的优化情况:蓝色(Batch梯度下降法),紫色(随机梯度下降法)
-
所以要选择不大不小的mini-batch尺寸,实际上学习速率达到最快:一方面得到大量向量化,另一方面不需要等待整个训练集被处理完,就可以开始进行后续工作了。当然mini-batch 梯度下降法的结果也都不会收敛,会一直在最小值附近徘徊,这时可以慢慢减小学习率。
- 那么该如何选择mini-batch尺寸呢:如果训练集较小,直接使用batch梯度下降(m<2000);如果训练集较大,mini-batch尺寸一般选择在64~512,经常将mini-batch尺寸设成2次方,这样代码会运行的比较快。最后要注意的是在mini-batch中X^ {t}和Y^ {t}要符合CPU/GPU内存,如果不相符无论使用什么方法,算法都会表现得急转直下。
03 指数加权平均
- 计算下面温度散点图的趋势或者是温度的局部平均值或者说移动平均值:首先V_0=0,然后运用公式:某天的V等于前一天的V的0.9倍加上当日温度的0.1倍,这样计算后用红线作图就得到了移动平均值/每日温度的指数加权平均值。
- 大体公式如下所示:在计算平均多少天温度时用1/(1-b)来计算,如果b=0.9将其带入该式子,可得10也就是十天的平均值,如果b为0.98就是绿色的线为50(平均过去50天的温度),如果b为0.5得到黄色线。b这个参数的大小决定了上一个值得权重。
04 理解指数加权平均
-
我们首先画一个每天温度得图(右上第一个),然后构建一个指数衰减函数(右上第二个)看sita的系数,sita99就是0.1×0.9、sita98就是0.1×(0.9)^ 2,以此类推画出图。计算V_100就是讲两个图对应的元素相乘然后求和。sita的系数加起来为1或者逼近1,我们称之为偏差修正,正是因为有偏差修正,这才是指数加权平均数。
-
那么到底需要平均多少天数呢:就是看几天后权重下降到不到当日权重的三分之一(设b等于一个数,他需要多少次方才能达到1/e,多少次方用1/(1-b)来计算)
- 如何在实际中执行:看右图就是初始化v,然后直接讲这个v带入公式来更新新的v,不断地更新。注意:左图是=,右图是:=
05 指数加权平均的偏差修正
- 如果你在设置b为0.98时不是绿色的线而是起点低的紫色的曲线,那么我们就不要用V_t,而是用V_t/(1-b^t)。假如t=2,经过计算就是1号和2号数据的加权平均数并除去偏差,随着t的增加,b的t次方接近0,所以当t很大时,偏差修正几乎没有作用,因此当t很大时紫色线基本和绿色线重合了。如果关心初始时期的偏差,那么在刚开始计算指数加权移动平均数的时候,偏差修正能帮助在早期获得更好的估测。
06 动量梯度下降法
还有一种算法叫Momentum梯度下降法,运行速度几乎总是快于标准的梯度下降算法。基本思想是:计算梯度的指数加权平均数,并用该梯度更新权重。
- Momentum梯度下降法在第t次迭代过程中,用现有的Mini-batch计算dW、db 。然后通过指数加权平均计算得到dw及db的移动平均数,最后重新赋值权重,这样就可以减缓梯度下降的幅度(即纵轴方向的摆动小了),也可以增加横轴方向的运动速度(红色线)。如果要最小化碗装函数,其中dW、db相当于为你从山上往下滚的球提供了加速度,V_dW、V_db相当于速度。由于β稍小于1,相当于有摩擦力,所以球不会无限的加速下去。
- 最后我们看看具体如何计算:就用左边的公式包含1-β,因为右边的公式,如果你最后要调整超参数β,那么就会影响V_dW、V_db,也许还要修改学习率α(α要根据1/(1-β)相应变化)。
07 RMSprop(均方根)
RMSprop也可以加速梯度下降,因为将微分进行平方,最后还使用了平方根所以叫均方根
- 分析这个纵轴幅度大,横轴向前推进的例子,假设纵轴代表参数b,横轴代表参数w,想要减缓b方向的学习同时推进横轴方向的学习,RMSprop算法可以将其实现。同样的RMSprop也会在第t次迭代中计算当下mini-batch的微分dW、db,接着通过计算得到(dw)^ 2及(db)^ 2的加权平均数,在更新参数时也做了些许改动,公式如下:从斜率可以看出纵轴的斜率比横轴的大(dW>db)结果就变为绿色线。同样还可以用一个较大的学习率α来加快学习,而无须在纵轴上垂直方向偏离。为了保证数值能稳定一些,需要确保分母不为0,就要在分母上加一个很小很小的ε。
08 Adam算法
Adam算法基本就是将Momentum和RMSprop结合在一起
- 使用Adam算法,首先要初始化,接着在第t次迭代中用当前的mini-batch计算dW、db,接下来计算momentum指数加权平均数,然后用RMSprop进行更新,相当于momentum更新了超参数β_1,RMSprop更新了β_2。一般使用Adam算法时要计算偏差修正,最后就可以更新权重了。
- 其中有几个超参数:
- 学习率α可以尝试一系列的值看哪个有效
- β_1常用值为0.9,这是dW / db的移动平均值也就是加权平均数
- β_2常用值为0.999,这是(dW)^ 2 / (db)^ 2的移动平均值也就是加权平均数
- ε建议是10^ -8,但是没有必要设置
09 学习率衰退
加快学习算法的一个办法就是随着时间慢慢减小学习率,我们称之为学习率衰退
- 蓝色的是使用同一学习率,而绿色的是随着时间慢慢减小学习率。慢慢减小学习率的本质在于:在学习初期你能承受较大的步伐,但当开始收敛时,小的学习率能让步伐小一些,不必在最小值范围内大幅度摆动。
- 可以这样来进行学习率衰退:第一次遍历训练集叫做一代,第二次就是二代。可以将学习率设为(1/(1+衰退率* 第几代)*α_0,α_0为初始学习率。如果想使用学习率衰退就需要不断地尝试参数α及超参数衰退率,找到合适的值。
- 除了学习率衰减的公式,人们还使用指数衰减等其他公式:其中t代表mini-batch的数字。还会用离散下降,学习率一会减一半一会减一半。当然还可以手动调试学习率(在训练集小的时候)
10 局部最优的问题
- 在高维度空间更有可能碰到右图的鞍点(导数为0的点),而不会碰到局部最优。
- 平稳段会减缓学习。慢慢下降到平稳段,然后在走出平稳段。
- 在训练较大的神经网络存在大量参数并且成本函数J被定义在较高的维度空间时,不大可能困在极差的局部最优中。
- 平稳段是一个问题,这样使得学习十分缓慢,这也是像Momentum或者是RMSprop或者是Adam这样的算法加快学习算法的地方,让你尽早走出平稳段。