deeplearning.ai第二课第二周:优化算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cdknight_happy/article/details/85239050

本文作为对https://blog.csdn.net/cdknight_happy/article/details/84835809的补充。

1 mini-batch梯度下降算法

批梯度下降法持续收敛,但每一轮迭代的计算太耗时;随机梯度下降使用单个样本计算损失,波动较大;mini-batch进行以小batch为单位的梯度下降,既可以利用向量化带来的计算优势,又可以避免随机梯度下降过程中太大的波动。

选择合适的mini-batch大小,mini-batch梯度下降的速度会优于批梯度下降和随机梯度下降。

如何选择合适的mini-batch大小?

  • 如果处理的是小规模的训练集(m < 2000),则直接使用批梯度下降;
  • 如果处理的是大规模的训练集,则可以设置mini-batch的大小为64,128,256,512,一般设置为 2 n 2^n

划分mini-batch之前一般先对训练集进行shuffle操作。

2 指数加权平均

v t = β v t 1 + ( 1 β ) θ t v_t = \beta v_{t-1} + (1 - \beta)\theta_t ,则相当于是取前 1 1 β \frac{1}{1 - \beta} 个值的指数加权平均。

指数加权平均展开可得: v t = i = 0 t 1 ( 1 β ) β i θ t i v_t = \sum_{i=0}^{t-1}(1 - \beta)\beta^i\theta_{t - i} ,由于 ( 1 ϵ ) 1 ϵ 1 e (1 - \epsilon)^{\frac{1}{\epsilon}} \approx \frac{1}{e} ,而下降到 1 e \frac{1}{e} 之下的项一般也就不予考虑,因此,用 1 ϵ 1-\epsilon 代替 β \beta ,那么就有当 i &gt; 1 1 β i &gt; \frac{1}{1 - \beta} 之后就不予考虑。因此,指数加权平均就相当于是取当前值的前 1 1 β \frac{1}{1-\beta} 个值的指数加权平均。

实现:
v t = 0 v_t = 0

Repeatly{
     g e t   n e x t   θ t ~~~~get~next~\theta_t
     v t : = β v t + ( 1 β ) θ t ~~~~v_t := \beta v_t + (1 - \beta)\theta_t
}

指数加权平均的实现只占用单行的内存,相比于存储前面 1 1 β \frac{1}{1-\beta} 个值再进行取平均操作,大大降低了内存占用。

偏差修正:
偏差修正解决的是指数加权初期计算值小于应取值的问题。如下图中的绿色曲线和紫色曲线所示。
在这里插入图片描述
假设 β = 0.9 \beta = 0.9 ,由于 v 0 = 0 v_0 = 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
v 2 = 0.9 v 1 + 0.02 θ 2 = 0.98 0.02 θ 1 + 0.02 θ 2 v_2 = 0.9v_1 + 0.02\theta_2 = 0.98*0.02\theta_1 + 0.02\theta_2
假设 θ 1 θ 2 \theta_1、\theta_2 都为正值,则 v 1 , v 2 v_1,v_2 是远小于 θ 1 θ 2 \theta_1、\theta_2 的。也就出现了指数加权的起始位置的值远小于当前采集值。

解决办法是使用偏差修正,即使用 v t 1 β t \frac{v_t}{1-\beta^t} 代替 v t v_t 。 这样做,在 t 较小时, β t \beta^t 接近于 β \beta ,则起到了对 v t v_t 进行放大的作用,随着 t 的增大, β t \beta^t 逐渐接近于0,偏差修正的影响越来越小。也就是从上图的紫线变成了绿线。

3 动量梯度下降

动量梯度下降,也就是带momentum的梯度下降算法,收敛速度几乎总是快于mini-batch梯度下降算法。其实现的核心思想就是计算梯度的指数加权平均,并用其进行参数更新。

梯度下降中的波动如下图所示:
在这里插入图片描述
沿着y轴的波动减慢了算法的收敛过程,因此,我们期望的是减缓在y轴方向上的移动,而增加在x轴方向上的移动。

指数加权平均是求当前值的前 1 1 β \frac{1}{1 - \beta} 个值的平均值,由于相邻次迭代在y轴方向的震荡幅度非常接近且符号相反,因此,使用指数加权平均则减弱了y轴方向上的震荡,同时增加了x轴方向上的前进速度。

momentum的实现是:

在第 t 次迭代中:
计算基于当前mini-batch的梯度 d W , d b dW,db
v d w = β v d w + ( 1 β ) d W v_{dw} = \beta v_{dw} + (1 - \beta)dW
v d b = β v d b + ( 1 β ) d b v_{db} = \beta v_{db} + (1 - \beta)db

参数更新:
d w = d w α v d w dw = dw - \alpha v_{dw}
d b = d b α v d b db = db - \alpha v_{db}

一般在使用momentum的时候,不会使用偏差修正。
多了一个超参数 β \beta ,一般设置 β = 0.9 \beta = 0.9

4 RMSprop

RMSprop的核心思想是:

计算基于当前mini-batch的梯度 d W , d b dW,db
S d w = β 2 S d w + ( 1 β 2 ) d W 2 S_{dw} = \beta_2 S_{dw} + (1 - \beta_2)dW^2
S d b = β 2 S d b + ( 1 β 2 ) d b 2 S_{db} = \beta_2 S_{db} + (1 - \beta_2)db^2

参数更新:
d w = d w α d W S d w + ϵ dw = dw - \alpha \frac{dW}{\sqrt{S_{dw}}+\epsilon}
d b = d b α d b S d b + ϵ db = db - \alpha \frac{db}{\sqrt{S_{db}}+\epsilon}

核心思想是,对于波动较大的参数,除以其平方根,减弱其波动;对于波动较大的参数,除以其平方根,放大其移动速度。从而减弱波动,起到加速训练过程的目的,同时也允许了使用较大的学习率进行模型的训练过程。

5 Adam

Adam = Momentum + RMSprop

既考虑了一阶矩,又考虑了二阶矩。

Adam的核心思想:
初始化 v d w = 0 , v d b = 0 , S d w = 0 , S d b = 0 v_{dw}= 0,v_{db}=0,S_{dw}=0,S_{db}=0
在第 t 轮迭代中:
计算基于当前mini-batch的梯度 d W , d b dW,db
v d w = β 1 v d w + ( 1 β 1 ) d W v_{dw} = \beta_1 v_{dw} + (1 - \beta_1)dW
v d b = β 2 v d b + ( 1 β 1 ) d b v_{db} = \beta_2 v_{db} + (1 - \beta_1)db
S d w = β 2 S d w + ( 1 β 2 ) d W 2 S_{dw} = \beta_2 S_{dw} + (1 - \beta_2)dW^2
S d b = β 2 S d b + ( 1 β 2 ) d b 2 S_{db} = \beta_2 S_{db} + (1 - \beta_2)db^2

修正:
v d w c o r r e c t e d = v d w 1 β 1 t , v d b = v d b 1 β 1 t v_{dw}^{corrected} = \frac{v_{dw}}{1 - \beta_1^t},v_{db} =\frac{v_{db}}{1-\beta_1^t}
S d w c o r r e c t e d = S d w 1 β 2 t , S d b = S d b 1 β 2 t S_{dw}^{corrected}=\frac{S_{dw}}{1-\beta_2^t},S_{db}=\frac{S_{db}}{1 - \beta_2^t}

参数更新:
W : = W α v d w c o r r e c t e d S d w c o r r e c t e d + ϵ W := W - \alpha \frac{v_{dw}^{corrected}}{\sqrt{S_{dw}^{corrected}}+\epsilon}
b : = b α v d b c o r r e c t e d S d b c o r r e c t e d + ϵ b := b - \alpha \frac{v_{db}^{corrected}}{\sqrt{S_{db}^{corrected}}+\epsilon}

Adam广泛适用于各类神经网络。

推荐参数:
β 1 = 0.9 , β 2 = 0.999 , ϵ = 1 0 8 \beta_1 = 0.9,\beta_2 = 0.999,\epsilon = 10^{-8}

6 学习率衰减

为什么要进行学习率衰减?
随着学习过程的进行,如果保持恒定大小的学习率,模型训练后期在接近最优解的地方损失函数会存在反复震荡,无法收敛到真正的最优解;若适当减小学习率,则可以逐步接近最优解而不会造成震荡。因此,学习率衰减有助于模型收敛到最优解。

一个epoch(e pa k)表示训练样本集中所有的训练样本都参与了一次模型训练过程。

常用的学习率衰减策略:
α = 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 ,训练的epoch越多,学习率越小;
指数衰减: α = ( 0.95 ) e p o c h _ n u m α 0 \alpha = (0.95)^{epoch\_num} * \alpha_0
离散下降:经过一定的训练epoch数目后,学习率减半。

学习率衰减对加速模型训练具有较大的作用。

7 神经网络的局部最优问题

在这里插入图片描述
局部最优点

鞍点:saddle point,一个方向上的局部最小点,另一个方向上的局部最大点。

在高维空间中,局部极小点事实上远少于鞍点的数量。

另一个问题是高原(plateaus)会大大减缓模型的训练速度。plateaus是一个平坦区域,其中大量的区域梯度接近于0,因此使用梯度下降法进行训练时收敛速度相当慢。
在这里插入图片描述
总结下,在深度神经网络中:

  • 训练过程中不大可能卡在局部最优解;
  • 平稳区域会使得模型的训练过程比较缓慢,因为波动比较大,而使用动量、RMSprop、Adam可以使得参数尽快移动出平坦区域,从而加速训练过程。

8 作业

在大数据集上,momentum一般会由于mini-batch梯度下降法;但是,在小数据集上,可能momentum和mini-batch梯度下降法效果相当,特别是部分mini-batch的确难以拟合时。

Adam无论在大小数据集上,总是收敛的较快,并且算法需要的内存较小、除学习率外使用默认超参数就可以取得很好的模型训练加速的效果。

Adam可以作为深度神经网络训练中首选的最优化算法。

猜你喜欢

转载自blog.csdn.net/cdknight_happy/article/details/85239050