深度学习学习笔记(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

此篇博客主要记录机器深度学习第二周的课程笔记。


提示:以下是本篇文章正文内容,下面案例可供参考

一、深度学习的实践层面

1.1 训练,验证,测试集

在配置训练、验证和测试数据集的过程中做出正确决策会在很大程度上帮助大家创建高效的神经网络。

一般而言,我们通过验证集或简单交叉验证集选择最好的模型,并在测试集上进行评估。

具体的划分规则如下
我们通常将样本分成训练集,验证集和测试集三部分,数据集规模相对较小,适用传统的划分比例,数据集规模较大的,验证集和测试集要小于数据总量的20%或10%。

补充 测试集不一定是必须的。测试集的目的是对最终所选定的神经网络系统做出无偏估计,如果不需要无偏估计,就不需要设置测试集。

数据的获取最好能够使得验证集和测试集以及训练集数据属于同一分布。

1.2 偏差,方差

高偏差 (欠拟合 underfitting)
高方差 (过度拟合 overfitting)
适度拟合(just right)

部分详情可见机器学习,其中这些理论建立在基本误差较小,同时训练集和验证集数据来自相同分布。

补充 分析偏差与方差时需要考虑最优误差。

一般系统的方法去训练神经网络如下
在这里插入图片描述通过不断的尝试方法来降低偏差(新的网络,更多的隐藏层,隐藏单元)与方差(正则化,更多的数据)

1.3 正则化

L2 正则化
在这里插入图片描述L1正则化
在这里插入图片描述补充 用L1正则化,w最终会是稀疏的,即w中有很多0
L2正则化又被称为权重衰减 ,它相当于为w乘以一个小与1的系数。
在神经网络中使用正则化则如下所示
在这里插入图片描述

1.3.1 为什么正则化有利于预防过拟合?

直观上理解就是如果正则化设置得足够大,权重矩阵被设置为接近于0的值,直观理解就是把多隐藏单元的权重设为0,于是基本上消除了这些隐藏单元的许多影响,也就是简化了神经网络。

又或者可以这样理解当你通过正则化时,会导致w变的非常小,同时使得z也变小,此时激活函数就近似于一个线性函数,那么他也就不太会过拟合。

1.3.2 Dropout regularization

dropout会遍历网络的每一层,并设置消除神经网络中节点的概率。设置完节点概率,我们会消除一些节点,然后删除掉从该节点进出的连线,最后得到一个节点更少,规模更小的网络,然后用backprop方法进行训练。
对于每个训练样本,我们都将采用一个精简后神经网络来训练它。
最常用来实现Droupout 正则化的方法时 inverted dropout(反向随机失活)

具体的步骤如下
1.我们首先定义一个dropout向量,由随机数组成,然后我们观察他是否小于某个值keep_prob,这表示他保留某个隐藏单元的概率。
2.然后对于单个样本进行计算,最后的计算结果a3需要弥补丢失的隐藏单元的损失,所以需要除以keep_prob。

补充 在测试阶段时不需要使用dropout。(不需要预测结果是随机的)
在测试时候使用dropout:不要随机消除节点,也不要在训练中使用的计算中保留1 / keep_prob因子

直观理解Dropout
因为任何一个节点都有可能被删除,所以神经网络不会让某个节点的权重变得特别大,着类似于L2正则化收缩权重的平方范数的效果。

补充 dropout 对于不同的层可以有着不同的keep-prob值。
一般而言dropout对于计算机视觉领域有着比较多的应用。(输入的特征太多,没有足够的数据来进行训练拟合)
同时,dropout的代价函数J也不再被明确定义,难以去进行梯度下降的检查。(一般先关闭dropout,检查梯度再运用dropout进行正则化)

1.3.3 其他正则化方法

  1. 数据扩增
    例如对于图片,可以通过水平翻转,剪裁放大来生成更多的假训练数据。
    通过更多的数据来减少过拟合。

2.early stopping
在运行梯度下降时,我们可以绘制训练误差以及验证集误差。
一般而言,验证集误差通常会先呈现下降趋势,然后在某个节点处开始上升。early stopping要做就是在中间点停止迭代过程。(通常w在迭代过程中会不断增大,由此也可以直观的认识到early stopping 也在选择w范数较小的神经网络)

同样 early stopping 也存在缺点,即无法独立的处理优化代价函数与防止过拟合两个问题。

1.4 提升神经网络训练速度的方法

归一化一般需要两个步骤
1.零均值
2.归一化方差
通过归一化的技巧,来确保所有特征都在相似范围内,通常这可以帮助学习算法运行得更快。

1.5 梯度消失和梯度爆炸

在这样一个深度神经网络中,如果激活函数或梯度函数以与相关的指数增长或递减,它们的值将会变得极大或极小,从而导致训练难度上升,尤其是梯度指数小于时,梯度下降算法的步长会非常非常小,梯度下降算法将花费很长时间来学习。

1.6 神经网络的权重初始化

一般对于某层权重矩阵的初始化如下
在这里插入图片描述当使用的激活函数为Relu激活函数时,一般将方差设置为2/n

对于tanh激活函数,我们一般使用Xavier初始化
与上述公式相同。或者使用如下公式
在这里插入图片描述同样我们也可以对于该方差作为一个需要调整的超级参数。但一般而言该参数的优先级较低。

1.7 梯度检验

为了确保backprop能够正确实施,我们会考虑使用梯度检验这个技巧。
一般我们考虑双边误差。这比单边误差更为准确。

在神经网络中实现梯度检验的具体步骤如下
我们将w1,b1,w2,b2…wl,bl合成一个大的向量θ
同时将dw1,db1,dw2,db2…dwl,dbl合成一个大向量dθ
然后对其中某一项θ增加一个小值,然后考虑它的双边误差。

那么如何验证梯度检验得到的θ与原dθ是否接近呢?
我们考虑用两者的距离来描述
公式如下
在这里插入图片描述补充 相关应用事项
1.不要在训练中使用梯度检验
2.如果在梯度检验中使用正则化,那么对应的梯度包括这个正则项。
3.梯度检验不能与dropout同时使用。由于dropout每次随机消除不同的子集,会导致代价函数难以计算,故而难以使用梯度下降来进行检验。

二、优化算法

深度学习对于大数据领域没有发挥最大的效果。对于数量巨大的数据集,神经网络的训练速率很慢。通常,使用一个快速的优化算法,能够大大提高你的效率。

2.1 Mini-batch梯度下降

在之前,我们学习过批量梯度下降,他能够通过向量化的方式对m个样本进行计算。
但是如果对于m很大时,会使得处理速度比较缓慢。因为你需要对于整个训练集处理完后,才能执行梯度下降,如果只是处理一部分的数据就先梯度下降处理一部分,那么算法的速度会更快。
这就是Mini-batch梯度下降的基本思想。
具体i如下
在这里插入图片描述即将数据分成n组,每组有着m个样本,对于n组分别进行梯度下降计算。具体的步骤与batch 梯度下降类似。
使用batch梯度下降法,一次遍历训练集只能让你做一个梯度下降,使用mini-batch梯度下降法,一次遍历训练集,能让你做n个梯度下降。
如果要多次遍历训练集,可以加上一个while循环或者for循环。

Mini-batch梯度下降原理
使用batch 梯度下降法时,每次迭代都需要遍历整个训练系,这也就导致了每次迭代成本都会下降。(如果出现代价上升则要么学习率过大,要不出现了bug)

但是使用Mini-batch时,它无法做到每次迭代代价都是下降的。
但是走势仍旧是向下的。

对于mini-batch size的大小我们一般按下述规则选取。
1.如果训练集较小(m<=2000),那么直接使用batch 梯度下降
2.否则一般选取mini-batch size=64-512

2.2 指数加权平均数

指数加权平均数在统计中也称为指数加权移动平均。
此处以一年的气温为例,
我们考虑计算数据的局部平均(移动平均)
方法如下
在这里插入图片描述在计算时,可以认为vt大概是1/(1-β) 天的平均温度。
当平均的数据太少时,会出现很多噪声,平均的天数较多时则会适应的更缓慢一些,具有一定的延迟。
在这里插入图片描述在这里插入图片描述
指数加权平均数的本质是通过一个指数衰减函数,来将数据求和。
其中每个数据前的系数被称为修正偏差(相加为1或者逼近1)

对于估计是多少数据的平均
可知在这里插入图片描述
此时大约为0.35,也就是说过了这些天后,权重下降到当日权重的1/3,那么我们认为此时就是我们平均的数据的量。
在这里插入图片描述
对于实际执行中,我们考虑如下方式
在这里插入图片描述
指数加权平均并不是最精确的计算平均数的方法,但是它占用极少的内存,同时只有一行代码,效率高,在机器学习中经常会使用。

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

我们可以发现,当平均数据量较多时,会使得前几个数据有着较大的偏差,比如
在这里插入图片描述
紫色线即为所得到的的曲线(β=0.98)

我们考虑使用如下方法来完成

在这里插入图片描述
此时可以降低前面的偏差,而对于后面的数据则无影响。(1-β^t=0)

2.4 动量梯度下降法(Momentum gradient descent)

该算法的运行速度几乎总是快于标准的梯度下降算法。
它的基本思想就是计算梯度的指数加权平均数,并利用该梯度来更对应的权重。
实现的具体步骤
我们需要计算
在这里插入图片描述在这里插入图片描述
然后利用这两个参数来更新W,b 具体如下
在这里插入图片描述在这里插入图片描述
这样实现的效果可以以下面的例子来描述
在这里插入图片描述
通过平均,可以发现在纵轴方向上的平均值都=0,此时会使得纵轴方向的摆动变小,横轴方向运动更快。
它的每一步梯度下降不在独立,而是与前面的具有一定的联系。

总结
实现的步骤如下
在这里插入图片描述对于偏差修正,实际上,我们不要如此做,因为当迭代多次后,便不会受到偏差修正的影响。

补充 相应的Momentum的梯度下降算法,还有另一种形式,即
在这里插入图片描述此时学习率α需要随着1/(1-β)变化,一般不用

2.5 RMSprop(Root Mean Square Prop)

RMSprop 算法也可以加速梯度下降
RMSprop 算法的具体更新公式如下
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可知对于下面的例子
在这里插入图片描述此时db方向的微分较大,dw方向的微分较小。所以此时b就会除以一个较大的数从而降低在b轴上的摆动。而dw会除以一个较小的数,来使得该方向继续推进。

补充 你需要保证你的算法不会除以0,此时可以考虑在分母上加上一个很小的值,10^-8。

RMSprop跟Momentum有很相似的一点,可以消除梯度下降中的摆动,包括mini-batch梯度下降,并允许你使用一个更大的学习率,从而加快你的算法学习速度。

2.6 Adam 优化算法(Adam optimizatio algorithm)

Adam 优化算法基本上就是将Momentum 和RMSprop 结合在一起。

具体的步骤如下
在这里插入图片描述对于不同超参数的设置
在这里插入图片描述

2.7 学习率衰减(learning rate decay)

加快学习算法的一个办法就是随时间慢慢减少学习率,我们将之称为学习率衰减,

部分学习衰减的公式
在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.8 局部最优的问题

通常梯度为零的点并不是这个图中的局部最优点,实际上成本函数的零梯度点,通常是鞍点。

平稳段会减缓学习,平稳段是一块区域,其中导数长时间接近于0,如果你在此处,梯度会从曲面从从上向下下降,因为梯度等于或接近0,曲面很平坦,你得花上很长时间慢慢抵达平稳段的这个点,
平稳段是一个问题,这样使得学习十分缓慢,这也是像Momentum或是RMSprop,Adam这样的算法,能够加速学习算法的地方。在这些情况下,更成熟的优化算法,如Adam算法,能够加快速度,让你尽早往下走出平稳段。

补充
您在伦敦温度数据集上使用指数加权平均值, 您可以使用以下公式来追踪温度:vt = βvt -1 +(1 - β)θt。 下面的红线使用的是β= 0.9来计算的。 当你改变β时,你的红色曲线会怎样变化?
在这里插入图片描述
增加β会使红线稍微向右移动。
减少β会在红线内产生更多的振荡
在这里插入图片描述这些图是由梯度下降产生的; 具有动量梯度下降(β= 0.5)和动量梯度下降(β= 0.9)。 哪条曲线对应哪种算法?
(1)是梯度下降。 (2)是动量梯度下降(β值比较小)。 (3)是动量梯度下降(β比较大)

三、超参数调试、Batch正则化和程序框架

3.1 超参数选择

对于不同的超参数,有着以下可供参考的优先级
在这里插入图片描述

补充 对于adam优化算法中的参数beta1,beta2,epsilon一般选定其分别为0.9,0.999和10^-8

3.1.1 选取参数的方法

1.当参数的数量较少时,可以考虑使用网格化的选取方式。

2.当参数较多时,可以使用随机选择点。通过随机选择点来对于不同的参数都会独立的实验多个值。

同样一般而言,我们采用由粗糙到精细的策略。
即通过随机选取的方式得到了某个效果最好的点,然后考虑在点附近选取一些值来进行调试。

3.1.2 为超参数选择合适的范围

上述已经说明了随机选择能够提升你的搜索效率,但随机取值并非在有效范围内均匀取值,而是使用合适的标尺来对于超参数进行探究。

例如对于学习率α的选取,假设你认为其有效范围为0.0001~1,那么如果随机均匀取值,就会使得有90%的概率落到0.1-1之间,而对于0.0001-0.1之间的搜索只占到了10%,这是不合理的。

于是我们考虑用log标尺来进行搜索。我们依次取0.0001,0.001,0.01,0.1,1,在对数轴上取值[-4,0]
以此来得到对应的值,然后得到对应的真实的参数值。

类似的对于beta的取值也相似。
同样考虑对数取值。从0.1到0.001,即[-3,0]
这样使得你在0.9到0.99区间探究的资源,和在0.99到0.999区间探究的一样多。

补充
对于当beta接近1时,会使得结果的灵敏度有所变化,即,在0.9到0.9005之间取值,无关紧要,但值如果在0.999到0.9995之间,这会对你的算法产生巨大影响。

3.1.3 超参数的调优实践

随着时间的推移,你的训练集的数据也会发生相应的变化,所以最好能够隔一段时间去重新测试和评估你的超参数。

对于如何搜索超参数的两种方式
1.在你没有许多计算资源或者足够的CPU和GPU的前提下,只照看一个模型,然后看是逐渐改进,调整参数。

2.当给你有着较多的计算资源时,可以同时实验多个模型,以从中选取工作效果最好的那个。

3.2 归一化网络的激活函数

Batch归一化会使你的参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,超参数的范围会更加庞大,工作效果也很好,也会是你的训练更加容易,甚至是深层网络。

补充,在实践中,一般归一化Z。

具体步骤如下
在这里插入图片描述
其中为了让隐藏神经单元有不同的分布,我们会考虑使用如下的公式。(为了让隐藏单元均值和方差标准化)
在这里插入图片描述

3.2.1 将Batch Norm 拟合进神经网络

Batch归一化的做法是将Z值进行Batch归一化,简称BN,在这个过程中,有β和γ来控制对应归一化后的均值和方差。

实践中,Batch归一化通常和训练集的mini-batch一起使用。

补充
参数b对于归一化而言无关紧要,因为Batch归一化会将zl归一化成均值为0和标准方差,再由β和γ进行缩放。这意味着,无论b的值是多少,最后都是要被减去的,因为在Batch归一化中你要计算zl的均值在减去平均值,因此,增加任何常数,其最后的数值都不会改变。

3.2.2 Batch Norm奏效的原因

通过从logitic中我们可以了解到通过归一化所有的输入特征值x来使得值处于类似范围,能够加速学习。
但是同样Batch归一化有效的第二个原因是,它可以使权重比你的网络更滞后或更深层。
也就是说,它能够使得当你前层的数据在随着参数的变化而不断变化时,它的均值和方差保持不变,也就是说它的分布保持不变。由此它使得对于深层的神经网络的输入变得更稳定,以使得每层网络都能够相对独立的学习,这有助于加速整个网络的学习。

Batch归一化还有一个作用,它有轻微的正则化效果,由于它是对于mini-batch使用的,也就是说,他得到的均值和方差含有一定的噪声,这类似于dropout,通过增加噪音的方式来进行正则化。

补充,对于dropout,如果使用size较大的mini-batch会使得dropout的正则化更强。

3.2.3 测试时的Batch Norm

Batch归一化将你的数据以mini-batch的形式逐一处理,但在测试时,你可能需要对每个样本逐一处理。
此时我们考虑使用指数加权平均来进行计算。
在这里插入图片描述
在训练时,和是在整个mini-batch上计算出来的包含了像是64或28或其它一定数量的样本,但在测试时,你可能需要逐一处理样本,方法是根据你的训练集估算和,估算的方式有很多种,理论上你可以在最终的网络中运行整个训练集来得到和,但在实际操作中,我们通常运用指数加权平均来追踪在训练过程中你看到的和的值。

3.3 Softmax 回归

到目前为止,我们使用的都是二分类问题,那么对于多分类问题,我们应该如何解决呢。

这里我们提出Softmax层,在网络的最后一层,我们计算相应的zl,然后使用softmax激活函数来完成相应的计算,具体如下
在这里插入图片描述

softmax激活函数需要将所有可能的输出归一化,因此需要输入一个向量,然后输出一个向量。

补充 与softmax相对应的是hardmax函数。它将z中最大的元素设置为1,其他元素设置为0.
Softmax回归将logistic回归推广到了两种分类以上。

在softmax分类问题中,我们一般用到的损失函数为在这里插入图片描述此处,i仅为举例

补充 算法希望最小化损失,也就是需要最大化logy,因此你需要对应的真实的标签的概率尽可能的大。

可知
在这里插入图片描述

3.4 深度学习框架

不同的深度学习框架
在这里插入图片描述
tensorflow 代码示例
在这里插入图片描述在这里插入图片描述TensorFlow之类的编程框架已经内置了必要的反向函数。

习题
批处理规范中关于 γ 和 β的以下哪些陈述是正确的?

1它们可以在Adam、具有动量的梯度下降或RMSprop使中用,而不仅仅是用梯度下降来学习。
2它们设定给定层的线性变量 z[l]的均值和方差。

Guess you like

Origin blog.csdn.net/weixin_43869415/article/details/120311111