优化算法--DeepLearning.ai 学习笔记(2-2)

课程笔记地址https://blog.csdn.net/column/details/26931.html
课程代码地址https://github.com/duboya/DeepLearning.ai-pragramming-code/tree/master
欢迎大家forkstar!(-O-)

#改善深层神经网络:超参数调试、正则化以及优化 —优化算法

1. Mini-batch 梯度下降法

对整个训练集进行梯度下降法的时候,我们必须处理整个训练数据集,然后才能进行一步梯度下降,即每一步梯度下降法需要对整个训练集进行一次处理,如果训练数据集很大的时候,如有500万或5000万的训练数据,处理速度就会比较慢。

但是如果每次处理训练数据的一部分即进行梯度下降法,则我们的算法速度会执行的更快。而处理的这些一小部分训练子集即称为Mini-batch。

1.1 算法核心:

对于普通的梯度下降法,一个epoch只能进行一次梯度下降;而对于Mini-batch梯度下降法,一个epoch可以进行Mini-batch的个数次梯度下降。

  1. one epoch:pass through training set.(即一次epoch就是完整遍历一次train set)
  2. 对应batch gradient descent,默认是一个epoch遍历计算(train set里所有样本的损失和)/(样本数),遍历一次train set计算一个完整的loss,进行一次梯度下降,更新一次分类器参数。
  3. 对于Mini-batch,将一个epoch分成update_number = (number of train set) / (number of Mini-batch)份,若是不能整除,则update_number + 1,这样,完整遍历一次train set,参数就可以更新update_number次。
  4. 当Mini-batch = 1时候,则就是随机梯度下降(stochastic gradient descent)。

1.2 不同size大小的比较

普通的batch梯度下降法和Mini-batch梯度下降法代价函数的变化趋势,如下图所示:

  • batch梯度下降:
    • 对所有m个训练样本执行一次梯度下降,每一次迭代时间较长;
    • Cost function 总是向减小的方向下降。
  • 随机梯度下降:
    • 对每一个训练样本执行一次梯度下降,但是丢失了向量化带来的计算加速;
    • Cost function总体的趋势向最小值的方向下降,但是无法到达全局最小值点,呈现波动的形式。
  • Mini-batch梯度下降:
    • 选择一个1 < size < m 的合适的size进行Mini-batch梯度下降,可以实现快速学习,也应用了向量化带来的好处。
    • Cost function的下降平稳性介于前两者之间。

1.3 Mini-batch 大小的选择

  • 如果训练样本的大小比较小时,如 m ≤ 2000 m \le 2000 m2000时 —— 选择batch梯度下降法;
  • 如果训练样本的大小比较大时,典型的大小为: 2 6 2^6 26 2 7 2^7 27 ⋯ \cdots 2 10 2^{10} 210
  • Mini-batch的大小要符合CPU/GPU内存。

2. 指数加权平均

指数加权平均的关键函数:
v t = β v t − 1 + ( 1 − β ) θ t v_t = \beta v_{t-1} + (1 − \beta)\theta_t vt=βvt1+(1β)θt
下图是一个关于天数和温度的散点图:

β = 0.9 \beta = 0.9 β=0.9时,指数加权平均最后的结果如图中红色线所示;
β = 0.98 \beta = 0.98 β=0.98时,指数加权平均最后的结果如图中绿色线所示;
β = 0.5 \beta = 0.5 β=0.5时,指数加权平均最后的结果如下图中黄色线所示;

3. 理解指数加权平均

例子,当 β = 0.9 \beta = 0.9 β=0.9时:

v 100 = 0.9 v 99 + 0.1 θ 100 v_{100} = 0.9v_{99} + 0.1\theta_{100} v100=0.9v99+0.1θ100
v 99 = 0.9 v 98 + 0.1 θ 99 v_{99} = 0.9v_{98} + 0.1\theta_{99} v99=0.9v98+0.1θ99
v 98 = 0.9 v 97 + 0.1 θ 98 v_{98} = 0.9v_{97} + 0.1\theta_{98} v98=0.9v97+0.1θ98
⋯ \cdots

展开:
v 100 = 0.1 θ 100 + 0.9 ( 0.1 θ 99 + 0.9 ( 0.1 θ 98 + 0.9 v 97 ) ) v_{100} = 0.1\theta_{100} + 0.9(0.1\theta_{99} + 0.9(0.1\theta_{98} + 0.9v_{97})) v100=0.1θ100+0.9(0.1θ99+0.9(0.1θ98+0.9v97))
= 0.1 θ 100 + 0.1 × 0.9 θ 99 + 0.1 × ( 0.9 ) 2 θ 98 + 0.1 × ( 0.9 ) 3 θ 97 + ⋯ = 0.1\theta_{100} + 0.1 \times 0.9\theta_{99} + 0.1 \times (0.9)^2\theta_{98} + 0.1 \times (0.9)^3 \theta_{97} + \cdots =0.1θ100+0.1×0.9θ99+0.1×(0.9)2θ98+0.1×(0.9)3θ97+

上式中所有θθ前面的系数相加起来为1或者接近于1,称之为偏差修正。

总体来说存在, ( 1 − ϵ ) 1 / ϵ = 1 e (1 − \epsilon)^{1/\epsilon} = \frac{1}{e} (1ϵ)1/ϵ=e1,在我们的例子中, 1 − ϵ = β = 0.9 1- \epsilon = \beta = 0.9 1ϵ=β=0.9,即 0. 9 10 ≈ 0.35 ≈ 1 e 0.9^{10} \approx 0.35 \approx \frac{1}{e} 0.9100.35e1。相当于大约10天后,系数的峰值(这里是0.1)下降到原来的 1 e \frac{1}{e} e1,只关注了过去10天的天气。

从公式中不难发现, β \beta β 越大,则当前值 v c u r r e n t − 1 v_{current -1} vcurrent1 v c u r r e n t v_{current} vcurrent占比越大,即过去影响的影响越大,当前变化带来的影响越小,曲线越平稳;反之,则曲线变动越大。

3.1 指数加权平均实现

v 0 = 0 v_0 = 0 v0=0
v 1 = β v 0 + ( 1 − β ) θ 1 v_1 = \beta v_0 + (1- \beta)\theta_1 v1=βv0+(1β)θ1
v 2 = β v 1 + ( 1 − β ) θ 2 v_2 = \beta v_1 + (1- \beta)\theta_2 v2=βv1+(1β)θ2
v 3 = β v 2 + ( 1 − β ) θ 3 v_3 = \beta v_2 + (1- \beta)\theta_3 v3=βv2+(1β)θ3
⋯ \cdots
因为,在计算当前时刻的平均值,只需要前一天的平均值和当前时刻的值,所以在数据量非常大的情况下,指数加权平均在节约计算成本的方面是一种非常有效的方式,可以很大程度上减少计算机资源存储和内存的占用。

3.2 指数加权平均的偏差修正

在我们执行指数加权平均的公式时,当 β = 0.98 \beta = 0.98 β=0.98时,我们得到的并不是图中的绿色曲线,而是下图中的紫色曲线,其起点比较低。

  • 原因
    v 0 = 0 v_0 = 0 v0=0
    v 1 = 0.98 v 0 + 0.02 θ 1 = 0.02 θ 1 v_1 = 0.98v_0 + 0.02\theta_1 = 0.02\theta_1 v1=0.98v0+0.02θ1=0.02θ1
    v 2 = 0.98 v 1 + 0.02 θ 2 = 0.98 × 0.02 θ 1 + 0.02 θ 2 = 0.0196 θ 1 + 0.02 θ 2 v_2 = 0.98v_1 + 0.02\theta_2 = 0.98 \times 0.02\theta_1 + 0.02\theta_2 = 0.0196\theta_1 + 0.02\theta_2 v2=0.98v1+0.02θ2=0.98×0.02θ1+0.02θ2=0.0196θ1+0.02θ2

如果第一天的值为如40,则得到的 v 1 = 0.02 × 40 = 8 v_1 = 0.02\times40 = 8 v1=0.02×40=8,则得到的值要远小于实际值,后面几天的情况也会由于初值引起的影响,均低于实际均值。

这个上面分析也不难理解, β \beta β越大,则当前值受过去值影响越大,对于开始处,由于初始值设置为0,则对应开始阶段由于过去值对当前值影响较大,导致 β \beta β越大的地方开始处越低。

  • 偏差修正:

    使用
    v t 1 − β t \frac{v_t}{1 - \beta^t} 1βtvt

  • 当t = 2时:
    1 − β t = 1 − ( 0.98 ) 2 = 0.0396 1 - \beta^{t} = 1 - (0.98)^2 = 0.0396 1βt=1(0.98)2=0.0396
    v 2 0.0396 = 0.0196 θ 1 + 0.02 θ 2 0.0396 \frac{v_2}{0.0396} = \frac{0.0196\theta_1 + 0.02\theta_2}{0.0396} 0.0396v2=0.03960.0196θ1+0.02θ2

偏差修正得到了绿色的曲线,在开始的时候,能够得到比紫色曲线更好的计算平均的效果。随着t逐渐增大, β t \beta^t βt接近于0,所以后面绿色的曲线和紫色的曲线逐渐重合了。

虽然存在这种问题,但是在实际过程中,一般会忽略前期均值偏差的影响。

4. 动量(Momentum)梯度下降法

动量梯度下降的基本思想就是计算梯度的指数加权平均数,并利用该梯度来更新权重。

即在当前值的计算中引入指数加权平均思想,将参数更新做了指数加权平均,阻止梯度更新方向变化过快,如下图,缓和了梯度下降方向。

在我们优化 Cost function 的时候,以下图所示的函数图为例:

在利用梯度下降法来最小化该函数的时候,每一次迭代所更新的代价函数值如图中蓝色线所示在上下波动,而这种幅度比较大波动,减缓了梯度下降的速度,而且我们只能使用一个较小的学习率来进行迭代。

如果用较大的学习率,结果可能会如紫色线一样偏离函数的范围,所以为了避免这种情况,只能用较小的学习率。

但是我们又希望在如图的纵轴方向梯度下降的缓慢一些,不要有如此大的上下波动,在横轴方向梯度下降的快速一些,使得能够更快的到达最小值点,而这里用动量梯度下降法既可以实现,如红色线所示。

4.1 算法实现

On iteration t:

  • Compute dW, db on the current mini-bitch
  • v d W = β v d W + ( 1 − β ) d W v_{dW} = \beta v_{dW} + (1 - \beta)dW vdW=βvdW+(1β)dW
  • v d b = β v d b + ( 1 − β ) d b v_{db} = \beta v_{db} + (1 - \beta)db vdb=βvdb+(1β)db
  • W = W − α v d W W = W - \alpha v_{dW} W=WαvdW, b = b − α v d b b = b - \alpha v_{db} b=bαvdb

β \beta β常用的值是0.9。

在我们进行动量梯度下降算法的时候,由于使用了指数加权平均的方法。原来在纵轴方向上的上下波动,经过平均以后,接近于0,纵轴上的波动变得非常的小;但在横轴方向上,所有的微分都指向横轴方向,因此其平均值仍然很大。最终实现红色线所示的梯度下降曲线。

momentum 主在针对 SGD 下降速度慢,而且可能会在沟壑的两边持续震荡的缺点进行优化,引入一阶动量(一阶动量是各个时刻梯度方向的指数移动平均值),旨在 t 时刻的下降方向,不仅由当前点的梯度方向决定,而且由此前累积的下降方向决定。 加速主梯度,抑制震动方向;而 RMSprop 旨在引入二阶动量进行动态更新梯度下降速率;Adam 则是两者的集大成者,既具有加速主方向,抑制震动的momentum特性,又具备 RMSprop 的自适应梯度更新速率调整功能。

4.2 算法本质解释

在对应上面的计算公式中,将Cost function想象为一个碗状,想象从顶部往下滚球,其中:

  • 微分项 d W dW dW, d b db db想象为球提供的加速度;
  • 动量项 v d w v_{dw} vdw, v d b v_{db} vdb相当于速度;

小球在向下滚动的过程中,因为加速度的存在速度会变快,但是由于 β \beta β的存在,其值小于1,可以认为是摩擦力,所以球不会无限加速下去。

5. RMSprop

除了上面所说的Momentum梯度下降法,RMSprop(root mean square prop)也是一种可以加快梯度下降的算法。

同样算法的样例实现如下图所示:

这里假设参数b的梯度处于纵轴方向,参数w的梯度处于横轴方向(当然实际中是处于高维度的情况),利用RMSprop算法,可以减小某些维度梯度更新波动较大的情况,如图中蓝色线所示,使其梯度下降的速度变得更快,如图绿色线所示。

在如图所示的实现中,RMSprop将微分项进行平方,然后使用平方根进行梯度更新,同时为了确保算法不会除以0,平方根分母中在实际使用会加入一个很小的值如 ϵ = 1 0 − 8 \epsilon = 10 ^ {-8} ϵ=108

RMSprop与moment在表达式的区别一是将微分项 d b db db, d W dW dW(即所谓的加速度项)做了平方,二是在进行参数更新的表达式,添加了分母项 S d w S_{dw} Sdw, S d b S_{db} Sdb的平方根(即参数更新量=加速度/当前速度的平方根),为防止除0,分母加了极小值 ϵ \epsilon ϵ

RMSprop 的主要创新点在于引入二阶动量,其目的在于自适应地对各个参数进行更新;降低经常更新参数的学习速率,增大偶尔更新参数的学习速率,其衡量标准就是二阶动量,即文中的分母项的 dw^2 项,分母做二阶动量的滑动平均,代表过去一段时间的二阶动量的平均水准,放入分母,用于自适应调解各参数更新速率。这才是 RMSprop 的目的所在,其是有 Adaprop 更新而来(Adaprop 是直接将二阶动量累加作为分母项来自适应调整更参数更新速度,而 RMSprop 则是将二阶动量累加换位了二阶动量的滑动平均值),momentum 才是依靠累加梯度方向来加速主方向,抑制此方向。

6. Adam 优化算法

Adam是一种很常用的梯度下降优化算法,即分别计算momentum及RMSprop,参数更新量即为learning_rate * (momentum / RMSprop的平方根)。

7. 学习率衰减

在我们利用 mini-batch 梯度下降法来寻找Cost function的最小值的时候,如果我们设置一个固定的学习速率 α \alpha α,则算法在到达最小值点附近后,由于不同batch中存在一定的噪声,使得不会精确收敛,而一直会在一个最小值点较大的范围内波动,如下图中蓝色线所示。

但是如果我们使用学习率衰减,逐渐减小学习速率 α \alpha α,在算法开始的时候,学习速率还是相对较快,能够相对快速的向最小值点的方向下降。但随着 α \alpha α的减小,下降的步伐也会逐渐变小,最终会在最小值附近的一块更小的区域里波动,如图中绿色线所示。

7.1 学习率衰减的实现

  • 常用:

α = 1 1 + d e c a y _ r a t e ∗ e p o c h _ n u m α 0 \alpha = \frac{1}{1 + decay\_rate * epoch\_num}\alpha_0 α=1+decay_rateepoch_num1α0

  • 指数衰减:

α = 0.9 5 e p o c h _ n u m α 0 \alpha = 0.95^{epoch\_num}\alpha_0 α=0.95epoch_numα0

  • 其他:
    α = k e p o c h _ n u m ⋅ α 0 \alpha = \frac{k}{epoch\_num}\cdot\alpha_0 α=epoch_numkα0

  • 离散下降(不同阶段使用不同的学习速率)

学习率衰减有很多种方法,上面介绍了三种。但在实际应用中,学习率衰减用的并不多。

8. 局部最优问题

在低纬度的情形下,我们可能会想象到一个Cost function 如左图所示,存在一些局部最小值点,在初始化参数的时候,如果初始值选取的不得当,会存在陷入局部最优点的可能性。

但是,如果我们建立一个神经网络,通常梯度为零的点,并不是如左图中的局部最优点,而是右图中的鞍点(叫鞍点是因为其形状像马鞍的形状)。

在一个具有高维度空间的函数中,如果梯度为0,那么在每个方向,Cost function可能是凸函数,也有可能是凹函数。但如果参数维度为2万维,想要得到局部最优解,那么所有维度均需要是凹函数,其概率为 2 − 20000 2^{-20000} 220000,可能性非常的小。也就是说,在低纬度中的局部最优点的情况,并不适用于高纬度,我们在梯度为0的点更有可能是鞍点。

在高纬度的情况下:

  • 几乎不可能陷入局部最小值点;
  • 处于鞍点的停滞区会减缓学习过程,利用如Adam等算法进行改善。

参考文献:https://zhuanlan.zhihu.com/p/32230623

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值