教程总体简介:循环神经网络、4.2 词嵌入与NLP、学习目标、4.3 seq2seq与Attention机制、总结、每日作业、5.1 生成对抗网络(GAN)、高级主题、5.2 自动编码器、在职高新课-深度学习、要求、目标、课程安排、环境要求、1.1 深度学习介绍、深度学习与神经网络、1.2 神经网络基础、1.3 浅层神经网络、1.4 深层神经网络、深度学习进阶、2.1 多分类与TensorFlow、5、得出每次训练的准确率(通过真实值和预测值进行位置比较、每个样本都比较)、2.2 梯度下降算法改进、2.3 深度学习正则化、2.4 BN与神经网络调优、卷积神经网络、3.1 图像数据与边缘检测、3.2 卷积神经网络(CNN)原理、3.3 经典分类网络结构、4.1 循环神经网络、课程内容总结
<!-- start:bj1 --> 项目完整code和文档,小伙伴们---->git仓库
<!-- end:bj1 -->
全套教程部分目录:
深度学习进阶
知道softmax回归的原理
应用softmax_cross_entropy_with_logits实现softamx以及交叉熵损失计算
应用matmul实现多隐层神经网络的计算
应用TensorFlow完成Mnist手写数字势识别了解深度学习遇到的一些问题
知道批梯度下降与MiniBatch梯度下降的区别
知道指数加权平均的意义
知道动量梯度、RMSProp、Adam算法的公式意义
知道学习率衰减方式
知道参数初始化策略的意义了解偏差与方差的意义
知道L2正则化与L1正则化的数学意义
知道Droupout正则化的方法
了解早停止法、数据增强法的其它正则化方式知道常用的一些神经网络超参数
知道BN层的意义以及数学原理
2.2 梯度下降算法改进
学习目标
-
目标
- 了解深度学习遇到的一些问题
- 知道批梯度下降与MiniBatch梯度下降的区别
- 知道指数加权平均的意义
- 知道动量梯度、RMSProp、Adam算法的公式意义
- 知道学习率衰减方式
- 知道参数初始化策略的意义
-
应用
- 无
深度学习难以在大数据领域发挥最大效果的一个原因是,在巨大的数据集基础上进行训练速度很慢。而优化算法能够帮助我们快速训练模型,提高计算效率。接下来我么就去看有哪些方法能够解决我们刚才遇到的问题或者类似的问题
2.2.1 优化遇到的问题
- 梯度消失
- 局部最优
2.2.1.1 梯度消失
在梯度函数上出现的以指数级递增或者递减的情况分别称为梯度爆炸或者梯度消失。
假设<span>g(z)=z,b[l]=0g(z) = z, b^{[l]} = 0g(z)=z,b[l]=0</span><span>y^=W[L]W[L−1]...W[2]W[1]X\hat{y} = W^{[L]}W^{[L-1]}...W^{[2]}W^{[1]}Xy^=W[L]W[L−1]...W[2]W[1]X</span>
- 对于<span>W[l]W^{[l]}W[l]</span>
- 对于<span>W[l]W^{[l]}W[l]</span>
在计算梯度时,根据不同情况梯度函数也会以指数级递增或递减,导致训练导数难度上升,梯度下降算法的步长会变得非常小,需要训练的时间将会非常长。
2.2.1.2 局部最优
**鞍点(saddle)**是函数上的导数为零,但不是轴上局部极值的点。通常梯度为零的点是上图所示的鞍点,而非局部最小值。减少损失的难度也来自误差曲面中的鞍点,而不是局部最低点。
- 在训练较大的神经网络、存在大量参数,并且成本函数被定义在较高的维度空间时,困在极差的局部最优基本不会发生
- 鞍点附近的平稳段会使得学习非常缓慢,而这也是需要后面的动量梯度下降法、RMSProp 以及 Adam 优化算法能够加速学习的原因,它们能帮助尽早走出平稳段。
解决办法有多种形式,通常会结合一些形式一起进行
-
初始化参数策略(第一部分第四节提到)
-
Mini梯度下降法
-
梯度下降算法的优化
-
学习率衰减
2.2.2 参数初始化策略(复习)
由于在<span>z=w1x1+w2x2+...+wnxn+bz={w}_1{x}_1+{w}_2{x}_2 + ... + {w}_n{x}_n + bz=w1x1+w2x2+...+wnxn+b</span><span>wiw_iwi</span><span>zzz</span>
2.2.3 批梯度下降算法(Batch Gradient Descent)
- 定义:批梯度下降法(btach),即同时处理整个训练集。
其在更新参数时使用所有的样本来进行更新。对整个训练集进行梯度下降法的时候,我们必须处理整个训练数据集,然后才能进行一步梯度下降,即每一步梯度下降法需要对整个训练集进行一次处理,如果训练数据集很大的时候,处理速度就会比较慢。
所以换一种方式,每次处理训练数据的一部分进行梯度下降法,则我们的算法速度会执行的更快。
2.2.3.1 Mini-Batch Gradient Descent
- 定义:Mini-Batch 梯度下降法(小批量梯度下降法)每次同时处理固定大小的数据集。
不同
-
种类:
- mini-batch 的大小为 1,即是随机梯度下降法(stochastic gradient descent)
使用 Mini-Batch 梯度下降法,对整个训练集的一次遍历(epoch)只做 mini-batch个样本的梯度下降,一直循环整个训练集。
2.2.3.2 批梯度下降与Mini-Batch梯度下降的区别
batch梯度下降法和Mini-batch 梯度下降法代价函数的变化趋势如下:
那么对于梯度下降优化带来的影响
2.2.3.3 梯度下降优化影响
-
batch 梯度下降法:
- 对所有 m 个训练样本执行一次梯度下降,每一次迭代时间较长,训练过程慢;
- 相对噪声低一些,成本函数总是向减小的方向下降。
-
随机梯度下降法(Mini-Batch=1):
- 对每一个训练样本执行一次梯度下降,训练速度快,但丢失了向量化带来的计算加速;
- 有很多噪声,需要适当减小学习率,成本函数总体趋势向全局最小值靠近,但永远不会收敛,而是一直在最小值附近波动。
因此,选择一个合适的大小进行 Mini-batch 梯度下降,可以实现快速学习,也应用了向量化带来的好处,且成本函数的下降处于前两者之间。
2.2.3.4 大小选择
- 如果训练样本的大小比较小,如<span>m≤2000m\le2000m≤2000</span>
- 如果训练样本的大小比较大,选择 Mini-Batch 梯度下降法。为了和计算机的信息存储方式相适应,代码在 mini-batch 大小为 2 的幂次时运行要快一些。典型的大小为<span>26,27,28,292^6, 2^7,2^8,2^926,27,28,29</span>
需要根据经验快速尝试,找到能够最有效地减少成本函数的值。
那么第二种方式是通过优化梯度下降过程,会比梯度下降算法的速度更快些
2.2.4 指数加权平均
**指数加权平均(Exponentially Weight Average)**是一种常用的序列数据处理方式,通常用在序列场景如金融序列分析、温度变化序列分析。
假设给定一个序列,例如北京一年每天的气温值,图中蓝色的点代表真实数据。
那么这样的气温值变化可以理解成优化的过程波动较大,异常较多。那么怎么平缓一些呢,这时候就要用到加权平均值了,如指数加权平均值。首先看一些效果。
这条红线怎么计算出来?通过指数加权的公式即:
<span>无法显示</span>
其中<span>YtY_{t}Yt</span><span>StS_{t}St</span><span>β\betaβ</span>
上图的红线中,<span>β\betaβ</span><span>S1=Y1S_{1} = Y1S1=Y1</span>
<span>S2=0.9S1+0.1Y2S_{2} = 0.9 S_{1} + 0.1 Y_{2}S2=0.9S1+0.1Y2</span>
<span>.........</span>
<span>S99=0.9S98+0.1Y99S_{99} = 0.9 S_{98} + 0.1 Y_{99}S99=0.9S98+0.1Y99</span>
<span>S100=0.9S99+0.1Y100S_{100} = 0.9 S_{99} + 0.1 Y_{100}S100=0.9S99+0.1Y100</span>
<span>.........</span>
假设就100天,那么合并的结果<span>S100=0.1Y100+0.1∗0.9Y99+0.1∗(0.9)2Y98+...S_{100} = 0.1 Y_{100} + 0.1 * 0.9 Y_{99} + 0.1 * {(0.9)}^2 Y_{98} + {...}S100=0.1Y100+0.1∗0.9Y99+0.1∗(0.9)2Y98+...</span>
下图中,当取权重值 β=0.98 时,可以得到图中更为平滑的绿色曲线。而当取权重值<span>β\betaβ</span><span>β\betaβ</span>,曲线自然就会越平滑而且越滞后。这些系数被称作偏差修正(Bias Correction)**
上述点数据,我们是否可以理解成梯度下降的过程,每一迭代优化计算出来的梯度值,
2.2.5 动量梯度下降法
动量梯度下降(Gradient Descent with Momentum)是计算梯度的指数加权平均数,并利用该值来更新参数值。动量梯度下降法的整个过程为:
<span>SdW[l]=βSdW[l]+(1−β)dW[l]S_{dW^{[l]}} = \beta S_{dW^{[l]}} + (1 - \beta) dW^{[l]}SdW[l]=βSdW[l]+(1−β)dW[l]</span>
<span>Sdb[l]=βSdb[l]+(1−β)db[l]S_{db^{[l]}} = \beta S_{db^{[l]}} + (1 - \beta) db^{[l]}Sdb[l]=βSdb[l]+(1−β)db[l]</span>
<span>W[l]:=W[l]−αSdW[l]W^{[l]} := W^{[l]} - \alpha S_{dW^{[l]}}W[l]:=W[l]−αSdW[l]</span>
<span>b[l]:=b[l]−αSdb[l]b^{[l]} := b^{[l]} - \alpha S_{db^{[l]}}b[l]:=b[l]−αSdb[l]</span>
那么这样梯度下降过程会有什么变化,如下图所示:
使用动量梯度下降时,通过累加过去的梯度值来减少抵达最小值路径上的波动,加速了收敛,因此在横轴方向下降得更快,从而得到图中红色或者紫色的曲线。当前后梯度方向一致时,动量梯度下降能够加速学习;而前后梯度方向不一致时,动量梯度下降能够抑制震荡。
我们可以这样形象的理解,小球在向下运动过程中会有加速度,导致越来越快,由于<span>β\betaβ</span>
2.2.6 RMSProp 算法
**RMSProp(Root Mean Square Prop)**算法是在对梯度进行指数加权平均的基础上,引入平方和平方根。
<span>sdw=βsdw+(1−β)(dw)2s_{dw} = \beta s_{dw} + (1 - \beta)(dw)^2sdw=βsdw+(1−β)(dw)2</span>
<span>sdb=βsdb+(1−β)(db)2s_{db} = \beta s_{db} + (1 - \beta)(db)^2sdb=βsdb+(1−β)(db)2</span>
<span>w:=w−αdwsdw+ϵw := w - \alpha \frac{dw}{\sqrt{s_{dw} + \epsilon}}w:=w−α√sdw+ϵdw</span>
<span>b:=b−αdbsdb+ϵb := b - \alpha \frac{db}{\sqrt{s_{db} + \epsilon}}b:=b−α√sdb+ϵdb</span>
其中<span>ϵ\epsilonϵ</span><span>(dw)2,(db)2(dw)^{2}, (db)^{2}(dw)2,(db)2</span><span>sdws_dwsdw</span><span>dbsdb+ϵ\frac{db}{\sqrt{s_{db} + \epsilon}}√sdb+ϵdb</span>
最终RMSProp 有助于减少抵达最小值路径上的摆动,并允许使用一个更大的学习率 α,从而加快算法学习速度。
2.2.7 Adam算法
**Adam 优化算法(Adaptive Moment Estimation,自适应矩估计)**将 Momentum 和 RMSProp 算法结合在一起。
假设用每一个 mini-batch 计算 dW、db,第<span>ttt</span>
<span>vdW=β1vdW+(1−β1)dWv_{dW} = \beta_1 v_{dW} + (1 - \beta_1) dWvdW=β1vdW+(1−β1)dW</span>
<span>vdb=β1vdb+(1−β1)dbv_{db} = \beta_1 v_{db} + (1 - \beta_1) dbvdb=β1vdb+(1−β1)db</span>
<span>vdW[l]corrected=vdW[l]1−(β1)tv^{corrected}{dW^{[l]}} = \frac{v{dW^{[l]}}}{1 - (\beta_1)^t}vdW[l]corrected=1−(β1)tvdW[l]</span>
<span>sdW=β2sdW+(1−β2)(dW)2s_{dW} = \beta_2 s_{dW} + (1 - \beta_2) {(dW)}^2sdW=β2sdW+(1−β2)(dW)2</span>
<span>sdb=β2sdb+(1−β2)(db)2s_{db} = \beta_2 s_{db} + (1 - \beta_2) {(db)}^2sdb=β2sdb+(1−β2)(db)2</span>
<span>sdW[l]corrected=sdW[l]1−(β1)ts^{corrected}{dW^{[l]}} = \frac{s{dW^{[l]}}}{1 - (\beta_1)^t}sdW[l]corrected=1−(β1)tsdW[l]</span>
其中<span>lll</span><span>ttt</span>
Adam 算法的参数更新:
2.2.8 TensorFlow Adam算法API
- tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999,epsilon=1e-08,name='Adam')
Adam 优化算法有很多的超参数:
- 学习率<span>α\alphaα</span>需要尝试一系列的值,来寻找比较合适的
- β1:常用的缺省值为 0.9
- β2:Adam 算法的作者建议为 0.999
- ϵ:Adam 算法的作者建议为epsilon的默认值1e-8
注:β1、β2、ϵ 通常不需要调试
2.2.9 学习率衰减
如果设置一个固定的学习率 α
- 在最小值点附近,由于不同的 batch 中存在一定的噪声,因此不会精确收敛,而是始终在最小值周围一个较大的范围内波动。
- 如果随着时间慢慢减少学习率 α 的大小,在初期 α 较大时,下降的步长较大,能以较快的速度进行梯度下降;而后期逐步减小 α 的值,即减小步长,有助于算法的收敛,更容易接近最优解。
最常用的学习率衰减方法:<span>α=11+decay_rate∗epoch_num∗α0\alpha = \frac{1}{1 + decay_rate * epoch_num} * \alpha_0α=1+decay_rate∗epoch_num1∗α0</span>
其中,decay_rate为衰减率(超参数),epoch_num为将所有的训练样本完整过一遍的次数。
还有一种指数衰减
- <span>α=0.95epoch_num∗α0\alpha = 0.95^{epoch_num} * \alpha_0α=0.95epoch_num∗α0</span>
对于大型的数据模型,需要使用这些方式去自动进行学习率衰减。而一些小型网络可以直接手动进行调整
那么最后我们来看一张动态度,表示不同优化的算法的效果图
2.2.10 其它非算法优化的方式-标准化输入
对网络输入的特征进行标准化,能够缓解梯度消失或者梯度爆炸
-
标准化公式:
- <span>x=x−μσx = \frac{x - \mu}{\sigma}x=σx−μ</span>
这个公式其实与特征工程中的处理是一样的,<span>μ\muμ</span><span>σ\sigmaσ</span>
那么这种有什么好处?主要是对于损失函数带来的好处.
- 标准化前的损失函数
- 标准化后的损失函数
这样的话,对于梯度下降无论从哪个位置开始迭代,都能以相对较少的迭代次数找到全局最优解。可以加速网络的学习。
理解这个原理,其实还是最初的这样的公式:<span>z=w1x1+w2x2+...+wnxn+bz={w}_1{x}_1+{w}_2{x}_2 + ... + {w}_n{x}_n + bz=w1x1+w2x2+...+wnxn+b</span>
如果激活函数的输入X近似设置成均值为 0,标准方差为 1,神经元输出 z 的方差就正则化到1了。虽然没有解决梯度消失和爆炸的问题,但其在一定程度上确实减缓了梯度消失和爆炸的速度。
2.2.11 总结
-
掌握参数初始化策略的优点
-
掌握Mini-batch的特点以及优势
-
掌握梯度下降算法优化的目的以及效果
- 掌握指数移动平均值的好处
- 掌握动量梯度下降法的优点以及RMSProp、Adam的特点
- 掌握学习率衰减方式
-
掌握标准化输入带来的网络学习速度的提升