1.小批量(Mini batch)梯度下降。

当待训练的样本数量比较多时(例如5000000个样本),之前所使用的梯度下降算法会一次性向量化所有样本,这样规模的向量将是非常巨大的,因此我们将样本分割成一个个小批量的数据集,例如每1000个样本作为一个样本集进行梯度下降训练。然后进行5000次循环,完成整个样本一轮训练。这种将大数据集按固定数量划分为众多小批量的数据集的方法便是小批量梯度下降算法。

2.理解小批量梯度下降算法

 小批量梯度下降算法中,损失函数并不是严格地单调下降,而是在5000次循环计算梯度下降时损失函数会存在波动现象,如下图所示,但是它整体仍然会呈现下降趋势:

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_梯度下降

 图1 梯度下降算法损失函数变化vs小批量梯度下降算法

其原因是,这一批次的小批量样本相比于下一批次的样本有更少的误差数据,那么下一批次计算出的损失函数值可能就会比上一批次大。

一种极端情况是将小批量样本数设定为1,此时损失函数所走的路线将是如下图紫色部分所示,其噪声值会严重影响到梯度的下降算法的正常运行。

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_机器学习_02

 图2 小批量中设置每批量样本数量大小对于梯度下降的影响

可见将批量样本数量值设置成合适值很重要,如上图绿色部分,虽然它不会像普通的梯度下降那样总是沿着直线进行梯度下降,但是最终也会达到理想的效果。

通常我们会选择2的幂次数量作为小批量样本数,例如64,128,256,512等等,这个原因是这个值与计算机内存访问的值相同,这样会提高下降算法的效率。

3.指数加权平均算法

给出一个伦敦的一年的气温变化如图所示:

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_深度学习_03

图3 伦敦一年的气温情况 

如果我们进行以下计算

V0=0

V1=0.9V0+0.1θ1

V2=0.9V1+0.1θ2

V3=0.9V2+0.1θ3

V4=0.9V3+0.1θ4

...

其中Vx代表计算后的第x天的温度结果,θx代表实际的在第x天的温度。

经过上述计算,结果的Vx温度曲线将是红色部分,如果将上述的0.9和0.1替换成0.98和0.02(这个值在课件中被称为β和1-β)那么结果曲线将变成图中绿色部分。

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_人工智能_04

 图4 经过指数加权平均后的伦敦气温

可以看到,当前实际温度占计算结果温度比例越小(1-β值越小),计算后结果曲线随着当前实际温度变化越小,且变化趋势相对于原来的温度曲线趋势越往后延时,并且曲线越平滑。所以指数加权算法能有效降低个别点的噪声。这个算法会在后续的神经网络优化中用到。

4.理解指数加权平均算法

如果将第3节中的V100展开将会得到

V100=0.1*θ(100)+0.1*0.9*θ(99)+...+0.1*pow(0.9,99)*θ(1)+0.1*pow(0.9,100)*θ(0)

其中pow(x,y)代表x的y次幂。

可以看到只有前几个θ(θ(100),θ(99),θ(98)等)值会影响到最终的V100的气温。这就相当于算法永远是将最近几天的气温做平均来估计今天的温度,这样既能做到较为准确的估计值,又能去除某一天气温不正常带来的噪声。

并且由于气温是迭代计算的,所以需要的内存比较少,永远只用存储上一步的V值便可以,所以这种算法占用计算机资源较少,很适合用于参数量巨大的神经网络。

5.指数加权平均中的偏差矫正

上两节提到的算法存在一个问题,就是当天数为0时,

V0=0

V1=0*0.9+0.1*θ1 

V2=0*0.9*0.9+0.1*0.9*θ1+0.1*θ2

...

可以看到V0,V1,V2,接近于0,这与实际偏差有点大(实际第0-3天温度不总是接近0的)。所以我们要对这个指加权平均做个优化。

在每一次得到Vt后令Vt=Vt/(1-pow(β,t))

这样计算的Vt便能消除前几天Vt接近0的问题,并且随着t增大(1-pow(β,t))越接近1,该修正项的影响会越来越小。

6.动量(Momentum)梯度下降算法

动量梯度下降算法的核心是:对每次计算所得的梯度进行指数加权运算,然后再对加权运算的结果作为梯度进行梯度下降。

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_机器学习_05

 图5 动量梯度下降与普通梯度下降

如图所示 普通的小批量运算的梯度下降会出现梯度波动的现象,如果使指数加权对所求得的梯度进行指数加权,那么梯度结果会和上几节所讲的指数加权运算一样,在纵向会更加平稳,从而减小波动,使得学习速度增加,以下是具体的算法:

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_梯度下降_06

 这里的超参数是α和β,而β值通常取0.9会比较好。dW和db是每一个小批量梯度计算结果的原始梯度,而Vdw和Vdb是指数加权后的结果。在得到Vdw和Vdb后用此值对W和b进行更新。

动量算法通常不需要进行偏差修正,因为在10次迭代后通常会求得正确的指数加权,而前几次的指数加权虽然接近0但是不会影响后续的动量梯度运算的效果。

在有的文献中βVdw+(1-β)dW项会被简化为βVdw+dW,这是因为我们可以调整α值来达到和未简化的公式一样的效果。只不过作者这种方式在数学表达上显得更加直观。

7.RMSprop均方根传递算法

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_梯度下降_07

 图6 均方根传递算法

如图所示将指数加权的一些项进行修改便得到均方根传递算法, 其中ε是防止除数为0增加的一个修正项。大小大概为10的-8次方。

8.Adam优化算法

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_梯度下降_08

图7 Adam算法

可以看到Adam算法是指数加权和RMSprop算法的结合。

超参数选择:

α基于实际情况选择。

β1取0.9 

β2取0.999

ε 取10 E-8

9.学习缩率衰减

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_神经网络_09

图8 不同学习速率下梯度运行的轨迹

当学习速率比较大时,如蓝色线。虽然能够很快达到接近损失最小值附近,但是始终达不到最小值,而是在最小值附近徘徊。即使不管怎么降低学习速率,也只能是大约近似达到最小值。然而降低学速率虽然能使得最后的学习结果更接近损失函数最小值,但是也会影响学习的速度。

因此我们可以逐步减小学习速率,在每次迭代后稍微减少一点学习速率,这就是学习速率衰减。

10.局部最优问题

在早期的机器学习中,人们会担心一个问题,会不会梯度下降算法最后求得的最小值是局部最优而不是全局最优,如下图所示:

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_人工智能_10

 图9 在三维空间函数局部最优解情况

但是这种情况在高维空间内很难出现(一般一个模型的w值有非常多个,因此有多少个w,最终的损失函数就有多少维度)。这样会出现一个情况:

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_机器学习_11

图10 马鞍形梯度 

在高维空间中,J沿着一个维度下降到最低值时,J仍然可以沿着另一个维度继续下降,直到所有的w都不能下降位置(假设w值有n个这种情况一般出现的概率只有2的n-1次方),而这个变化所有的w都不能使得J下降的点几乎一定是损失函数J的最小值。

而此时梯度下降走的曲线永远是马鞍形,沿着马鞍的头部到马鞍的中间最低点,又从马鞍中间,继续往另一个维度更低的马背处行走。

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_机器学习_12

图 11 梯度在马鞍型损失函数上下降

而在马鞍的中间很容易达到停滞区,在这里梯度下降很慢,学习速率会变得非常慢,而一些复杂的算法如Adam算法,会很好的解决这个问题。

11.编程作业

小批量梯度下降和随机梯度下降那个下降最快 小批量梯度下降算法_神经网络_13

图12 学习速率阶梯式下降 

指数下降的方法会很容易使得学习速率下降到0,使得还没有达到最优点附近时,模型就停止了学习,这是不希望看到的。而阶梯式下降可解决这个问题。具体代码为:

learning_rate=learning_rate0/(1+decay_rate*np.floor(epoch_num/time_interval))

其中learning_rate0为上一epoch的学习速率,decay_rate为衰减速率。epoch_num为已进行的epoch 数量,而time_interval,为间隔多少次进行一次梯度衰减。learning_rate为修正后的学习速率。