2.2 优化算法
Mini-batch(小批量)梯度下降算法
在大数据领域中的深度学习表现的并不算完美,因为庞大的数据量让训练变得很慢。Mini-batch梯度下降算法是快速优化算法的一种,能够在大数据中大幅提高效率。
吴恩达在这里介绍的不是很清晰,梯度下降算法分为批量、小批量和随机三种。
批量就是使用全部的数据进行迭代(也就是我们在前面的学习中默认使用的这一种),使得最终的求解是全局最优解,由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,批量一定能够稳定的一步一步收敛至最优值。
如果将所有数据看作分组梯度下降,那第一种批量就是只分一组,该组就是全体数据。相反的另一种极端,有多少个样本就分多少组,每组只有一个样本就是随机梯度下降,这种方法在梯度下降时的噪声非常大,它可能朝着正确的方向也可能朝着错误的任意方向发展,最终有可能会收敛在最优值附近,但也不会稳定,可能会在最优值附近乱跳。但好在速度快。
小批量通常使用在数据量非常大时的一个中间方案,假如现在有一百万个样本,分为一千组,每组一千个样本。注意用大写的X\Y加上标{t}表示第t组的训练集和样本真值。将第一个组进行一个完整的前向传播和反向传播,这时也就是梯度下降一次,将算出来的参数喂给第二个组,以此类推每组仅进行一次梯度下降,那么全体样本就可以下降一千次,极大的增加了收敛速度。之前遍历一遍全体样本只能下降一次,但是小批量梯度下降不能保证每一次下降都是朝着最优方向去的,过程可能会曲折,但趋势是下降的。
这里刚好可以再深刻理解一下梯度下降算法,一个前向传播算出一个代价函数值,再反向传播更新一次参数,这是一次完整的梯度下降。将更新后的参数再从头开始,完成下一次更新,直至收敛。
Mini-batch大小如何选择:
如果你的训练集很小,那就使用默认的批量梯度下降算法。例如小于2000.
如果你有一个更大的训练集,一般选择64-512等作为分组大小,这是考虑到计算机内存的布局和访问方式,将分组定义为2的幂数会加快代码的运行速度。当然mini-batch的分组大小也是一个超参数,一般情况下需要多尝试几个,看看哪个更好。
指数加权平均
统计学称其为指数加权滑动平均。
如果你有一个某地全年气温的样本,将其画在图上将是一个有大致走向的散点图,但如果你要计算温度趋势,可以使用指数加权平均。
取一个v0设为0,然后从第一天开始每一天的温度vt都是前一天温度*0.9+当天温度*0.1,即取加权平均。将这一步写成公式就是图中第一行蓝色字体。我们的例子中取β=0.9。我们可以认为这个公式计算出来的vt近似于1/(1-β)天温度的平均,即本例中从vt这一天起约前十天温度的平均,也就是图中红线。如果将β=0.98,则相当于取前约五十天气温的平均,那这条曲线肯定会更加平滑,就是图中绿线。同时绿线相比于红线也右移了一些,因为我们计算平均气温的范围更大了,这意味着这个平均值感受到的温度变化有所延迟。同时取另一个极端β=0.5,则体现为约两天的平均值,则会体现更大的噪音,其受异常值的影响更大。这个β也是一个超参数,通常我们会选择一个中间数,也就是绿线。
图中写出了β=0.9时一百天的指数加权平均气温计算公式,将第一百天的计算公式单独列出,再将公式中前一天的气温带入,不断迭代,计算其系数,就会发现,v100的值中,第一百天的气温权值最大为0.1,再往前的气温将逐步减小其系数,也就是对v100的影响力,如图中右边折线所示。β=0.9表示大概只关注前十天的气温,十天以前的系数微乎其微不做考虑。
指数加权平均的偏差修正
当我们使用指数加权平均时,我们设v0为0,很明显这个0会影响前几个v的值,使其不能很好的反应指数加权平均初段的均值,如上图紫线所示。通常情况下,我们可以无视这个偏差,但如果指数加权平均在预热阶段就开始考虑偏差,那我们需要使用偏差修正。也就是图中竖线右边那个公式,分子就是原来的v,下面是1-βt,例如计算第二天的v那么就用1-β的二次方。用这种方法就可以得到修正后的绿线。
动量梯度下降算法
这种算法几乎总是比普通的梯度下降算法更快,简单地说就是计算梯度的指数加权平均,然后使用这个梯度来更新权重。
首先,在当前的Mini-batch上计算dw,db。然后计算dw和db的指数加权平均值(滑动平均值),并在更新参数的公式中用滑动平均值代替原先的dw\db,这样在某些来回震荡的梯度下降时,在震荡方向上的值会正负抵消,梯度下降的方向会趋于平滑。
在算法具体实现中,有两个超参数学习率α和指数加权平均参数β,β常用0.9,也就是计算前十次迭代的梯度的平均值。至于偏差修正,一般情况下不做考虑,因为十次以后你的滑动平均就不再有偏差,而梯度下降次数往往很大。
RMSprop (均方根传递)
RMSprop是优化梯度下降的一种,当梯度下降如图所示,纵轴表示参数b横轴表示参数w,你希望加快横向的速度,减慢纵向的震动速度时,就可以使用RMSprop。
具体实现方法:先计算当前Mini-batch上的dw和db,注意这里第二步的指数加权平均项由字母v换成了s,其计算公式将最后一项加了一个平方。第三步更新参数也按公式计算即可。
RMSprop算法可以减少本图中纵向方向上的震动(和动量方法一样),并可以选取更大的学习率,使得每一步更大。将该方法和动量法结合在一起将得到一个更优的方法,但需要说明的是图中紫色字体,为了和动量法区别开,这里的β参数写一个下标2;为了不要让最后一步的分母趋近于0而造成结果太大,分母上可以加一个epsilon,该值通常用10-8较为合理。
Adam 算法(动量和RMSprop的结合)
算法实现:和之前一样,先在该mini-batch上计算dw和db,然后计算动量指数加权平均值(v)以及RMSpropz指数加权平均值(s),然后下面两行是修正偏差,注意v和s的上标corredted是指修正后的值。最后更新参数,这里注意分子是v,分母用的是s,这就将这两种方法结合在了一起。
这个算法现在有几个参数,其中两个β,在业内通常直接采用adam算法论文中作者提供的默认值0.9和0.999。epsilon一般也是默认值,且其值不影响算法性能,不需要关注。实际上只需要关注α的取值,不断的尝试以取得较优值。
学习率衰减
当你使用mini-batch梯度下降算法时,当样本量较小时步长会有些浮动,它会逐渐向最小值靠近并在附近跳动但不会收敛到最优点,因为学习率α使用了固定值。如果我们逐步缩小学习率,那么最终它将在离最小值更近的位置摆动,如图中绿线。
如图右上角,我们把遍历一次训练集称为一次迭代epoch1,然后按照图中的公式计算,其中衰减率为decay-rate,迭代次数为epoch num,初始学习率为α0。我们假定初始学习率α0=0.2,衰减率为1。下面的表和图表示随着迭代次数的增加,学习率不断减小(弹幕说表中数值计算错了)。
上图是几种其他衰减学习率的方法,你甚至还可以手工调整。
当然,比起其他超参数的选择,衰减学习率是一个较为靠后的需要考虑的问题,下面一章将谈到系统的安排所有超参数的方式。
局部最优问题
当人们担心会陷入局部最优(局部极值很可能不是全局最优点)的时候,脑中浮现的可能是左边这张图。但这是低维图像对我们的误导,实际上代价函数中大部分导数为零的点并不是局部最优,而是右图中的鞍点,在某一个方向上是凹点,另一个方向上却是凸点。也就是说,如果是在两千维空间(两千个参数)中,则需要在两千个方向上都是凹点,才是局部最优点,这件事发生的概率极低,也就是说并不需要过于担心局部最优的问题。
真正会降低学习速率的实际上是停滞区,停滞区指导数长时间接近零的一段区域。如图所示你的梯度下降算法可能在停滞区花费了很长时间,最终才离开。这也是上面介绍的优化算法例如Adam算法能够加快优化速度的地方。