吴恩达《深度学习-改善深层神经网络》2--优化算法

1. Mini-batch gradient descent

1)是什么?

在Batch gradient descent时,每次迭代都要遍历整个训练集,当训练集数目过大时,会导致学习速度很慢。

如果训练集巨大,将训练集分为t个子集,即mini-batch(如1000个样本),用每一个子集对神经网络进行训练,这样一个训练集就可以对神经网络训练t次,加上对神经网络迭代的次数s,所以总的训练次数为s*t。

吴恩达《深度学习-改善深层神经网络》2--优化算法

上图假设训练集大小为5000000,mini-batch大小为size=1000,那么t=5000,对每一个子集进行前向传播和反向传播计算,注意计算时m=1000.

2)理解mini-batch

吴恩达《深度学习-改善深层神经网络》2--优化算法

  如果size=m,就是batch gradient descent

  如果size=1,就是stochastic gradient descent随机梯度下降,随机梯度下降噪声比较大,在学习的过程中,会不断的向最小值靠近,最终在最小值附近波动,但是无法收敛到最小值,而且学习的过程很曲折(噪声大),虽然其可以通过减小学习速率来降低噪声的影响,但是依旧不推荐此方法,因为这种方法没能利用向量计算来节约时间

  mini-batch的size应该在1~m之间,mini-batch是学习速度最快的一个,有两个突出的优点:一,能利用大量的向量计算加快速度,二,不需要等整个训练集都处理完就能进行后续工作。它也会像随机梯度那样不能每次都向最小值靠近,但是其比随机梯度能更持续地靠近最小值的方向,它也不一定收敛或在一个很小的范围波动,出现这样的情况可以通过减小学习速率来改善。


吴恩达《深度学习-改善深层神经网络》2--优化算法

如何选择mini-batch大小?

如果训练集较小(<2000),直接采用batch gradient descent。

如果训练集较大,子集大小一般为64~512,考虑到电脑内存的设置和使用方式,如果size是2的次方,运行会快一些,所以一般取{64,128,256,512},也可以尝试1024,不过用的比较少

注意:子集mini-batch要符合GPU/CPU的内存,取决于应用目的以及训练集大小。

2. 指数加权平均

还有很多比梯度下降更优秀的优化算法,但是讲到其他优化算法之前,需要先介绍一下指数加权平均

1)指数加权移动平均值

在统计学中被称为指数加权移动平均值,我们一般简称为指数加权平均数。

以伦敦的气温为例:

吴恩达《深度学习-改善深层神经网络》2--优化算法

有了这些数据,如何计算趋势?也就是温度的局部平均值/移动平均值。设V0=0,第一天的加权平均数为:V1=0.9V0+0.1θ1即由前一天的加权平均数和当天的气温来决定。最终得到图中红色曲线。

这种滑动平均算法称为指数加权平均(exponentially weighted average)。根据之前的推导公式,其一般形式为:

Vt=βVt1+(1β)θt

上面的例子中,β=0.9β值决定了指数加权平均的天数,即Vt大约为1/(1-β)天的每日平均温度。

例如,当β=0.9,则1/(1-β)=10,表示10天的每日平均温度。当β=0.98,则1/(1-β)=50,表示50天的每日平均温度。β值越大,则指数加权平均的天数越多,平均后的趋势线就越平缓,但是由于之前信息对当前数据影响增大,计算获得的数据对温度变化也就越迟缓,如下图绿色曲线相对于红色曲线更平缓并向右平移。当β=0.5时,如黄色曲线所示,平均了两天的温度,所以其噪声较为明显,但也对温度变化反应更迅速。

吴恩达《深度学习-改善深层神经网络》2--优化算法


吴恩达《深度学习-改善深层神经网络》2--优化算法

我们将指数加权平均公式的一般形式写下来:

V=βVt1+(1β)θt(1β)θt+(1β)βθt1+(1β)β2θt2++(1β)βt1θ1+βtV0
根据公式,若要计算V100,需要用到之前的温度,那用到哪一天的呢?
一般规定系数小于1/e就忽略不计了,即βn=1/e

两边取ln得 n*lnβ=-1    (1)

对lnβ做泰勒展开(吴恩达《深度学习-改善深层神经网络》2--优化算法令x0=1,lnβ=ln1+1*(β-1)=β-1,带入(1)式得:

n=1/(1-β)


2)如何执行指数加权平均?

吴恩达《深度学习-改善深层神经网络》2--优化算法

这样做的好处是电脑内存中只保存一个实数,然后把最新数据带入公式,不断更新覆盖就可以了,代码也只有一行。虽然这种做法不是最精确的做法,但是其计算以及内存效率都很高。

3)Bias Correction指数加权平均的偏差修正

由于我们假设V0=0,导致V1的大小其实只是(1β)θ1,其值远远小于实际值,不能做出很好的估计,这种情况在估计初期比较明显,就如图中紫色曲线的开端,绿色取消代表我们想要的估计曲线,为了获得绿色曲线,需要对紫色曲线进行偏差修正,具体做法是:
吴恩达《深度学习-改善深层神经网络》2--优化算法
当t较小时,分母小于1,会对V进行修正,当t较大时,分母趋近于1,即随着t的增加会逐渐降低修正强度。
吴恩达《深度学习-改善深层神经网络》2--优化算法

偏差估计可以帮助获得更好的早期估计值,但在实际的机器学习中,人们倾向于不进行偏差修正,虽然初始时期的估计有偏差,但是随着计算的进行,会逐渐修正的。

3.  优化算法之 ---- Gradient Descent with Momentum动量梯度下降
吴恩达《深度学习-改善深层神经网络》2--优化算法
图中蓝色是普通梯度下降的学习轨迹,红色是动量梯度下降的学习轨迹,可以发现动量梯度下降震荡幅度更小,所以允许更大的学习率,从而学习速度变得更快,普通的梯度下降如果选用较大的学习率,那么很有可能因为震荡幅度过大而导致无法收敛。
具体来说,动量梯度下降对梯度进行指数加权平均,这样使当前梯度由当前梯度和之前的梯度共同决定,这样处理让梯度前进方向更加平滑,减少振荡,能够更快地到达最小值处。

1)如何执行?
吴恩达《深度学习-改善深层神经网络》2--优化算法
初始时,令VdW=0,Vdb=0
在实际应用中β=0.9表现就很不错,0.9鲁棒性非常好,当然也可以尝试其他值。
关于偏差修正,实际中,人们并不进行偏差修正,大概10次迭代之后,移动平均值就过了初始阶段,不再具有偏差。

值得一提的是,动量梯度下降的实现还有另外一种写法:
VdW=βVdW+dW
Vdb=βVdb+db
这种写法,需要通过调节学习因子α也可以达到跟上一种写法一样的效果,但是不推荐这么写,这样的话α跟β相关,每次改变β都需要重新调试α

4.  优化算法之 ---- RMSprop(Root Mean Square Prop)

吴恩达《深度学习-改善深层神经网络》2--优化算法
上图蓝色曲线表示普通梯度下降算法的学习轨迹,绿色表示RMSProp的学习轨迹,可以看到RMSProp有跟动量梯度下降类似的效果,即减少了学习过程中的震荡,可以支持更大的学习率α,从而使学习速度更快

RMSprop是另外一种优化梯度下降速度的算法。每次迭代训练过程中,其权重W和常数项b的更新表达式为:

SW=βSdW+(1β)dW2

Sb=βSdb+(1β)db2

吴恩达《深度学习-改善深层神经网络》2--优化算法

注意这里的平方是逐元素的平方!

原理:理想的优化算法是尽可能的沿着起始点到最小值的方向下降,如上图中的水平方向,但实际中又总会出现一些震荡,如图垂直方向的震荡,为了便于分析,假设水平方向为W,垂直方向为b,通过观察斜率可以得到,函数在垂直方向的斜率要大,在水平方向的斜率要小,也就是垂直方向梯度db较大,水平方向梯度dw相对较小,于是Sw相对Sb较小,那么相对来讲,最终导致,W变化的步长增加,b变化的步长减小,也就是震荡剧烈的方向步长减小,而震荡平缓的方向步长增加,从而达到减少震荡快速收敛的目的。

注:需要注意的是为了避免RMSprop算法中分母为零,通常可以在分母增加一个极小的常数ε

吴恩达《深度学习-改善深层神经网络》2--优化算法

ε=108,或者其它较小值。

5.  优化算法之 ---- Adam(Adaptive Moment Estimation)

将momentum和RMSprop结合起来,并加入偏差修正。这是一种极为常用的优化算法,且被证明有效适用于不同结构的神经网络.

其算法流程为:

VdW=0, SdW, Vdb=0, Sdb=0

On iteration t:

    Compute dW, db with current mini-batch gradient descent

    VdW=β1VdW+(1β1)dW, Vdb=β1Vdb+(1β1)db

    SdW=β2SdW+(1β2)dW2, Sdb=β2Sdb+(1β2)db2

  吴恩达《深度学习-改善深层神经网络》2--优化算法

Adam算法包含了几个超参数,分别是:α,β1,β2,ε。其中,β1通常设置为0.9,β2通常设置为0.999,ε通常设置为108。一般只需要对α进行调试。

吴恩达《深度学习-改善深层神经网络》2--优化算法


6.  学习率衰减 Learning Rate Decay

假设使用mini-batch梯度下降,在迭代的过程中会有噪声,迭代的过程中会朝着最小值的方向下降,但是不会精确收敛,最终会在最小值附近震荡,这是因为我们使用的学习率α是固定的,如果能够缓慢的减小学习率,那么初期的时候,学习率还比较大,所以学习速度依旧相对较快,但是随着学习率的减小,学习的步伐越来越小,最后会在最小值附近的一小块区域摆动,而不是原来的在最小值附近大幅震荡

吴恩达《深度学习-改善深层神经网络》2--优化算法

Learning rate decay中对α可由下列公式得到:
吴恩达《深度学习-改善深层神经网络》2--优化算法
其中,deacy_rate和α0是参数(可调),epoch是训练完所有样本的次数。随着epoch增加,α会不断变小。

吴恩达《深度学习-改善深层神经网络》2--优化算法

此外,还有其它可供选择的计算公式:

吴恩达《深度学习-改善深层神经网络》2--优化算法

其中,k为可调参数,t为mini-bach number。

除此之外,还可以设置α为关于t的离散值,随着t增加,α呈阶梯式减小。当然,也可以根据训练情况手动调整α值,对于大数据来说不太实用。

7.  局部最优问题Local Optima

在低维空间中我们经常担心被困在局部最优解中,但是在高维空间中,几乎不会存在这个问题,在高维空间中,导数为0的点通常是鞍点。

吴恩达《深度学习-改善深层神经网络》2--优化算法

对于高维空间来说,其问题是在平缓区,学习将会十分的缓慢,这时利用优化算法如Adam将会大大提高学习速度。