第二门课-改善深层神经网络 第一周(重点总结)


注:图片来自网络

第一周:深度学习的实用层面(Practical aspects of Deep Learning)

1.1 训练,验证,测试集(Train / Dev / Test sets)

深度学习是一个典型的迭代过程,需要多次循环往复,才能为应用程序找到一个称心的神经网络,因此循环该过程的效率是决定项目进展速度的一个关键因素,而创建高质量的训练数据集,验证集和测试集也有助于提高循环效率。
我们通常将样本分成训练集,验证集和测试集三部分。
①如果数据集规模相对较小,适用传统的三七分,也就是70%验证集,30%测试集,数据集规模较大的,验证集和测试集要小于数据总量的20%或10%,如果没有明确设置验证集,也可以按照60%训练,20%验证和20%测试集来划分。
②如果我们有100万条数据,其中1万条作为验证集,1万条作为测试集,100万里取1万,比例是1%,即:训练集占98%,验证集和测试集各占1%。
③对于数据量过百万的应用,训练集可以占到99.5%,验证和测试集各占0.25%,或者验证集占0.4%,测试集占0.1%。

确保验证集和测试集的数据来自同一分布

1.2 偏差,方差(Bias /Variance)

在这里插入图片描述
-----------------------------------------------------欠拟合------------------------------- 适度拟合--------------------------------过拟合----------------------------------------------------
①假设训练集误差是15%,验证集误差是16%,算法并没有在训练集中得到很好训练,如果训练数据的拟合度不高,就是数据欠拟合,就可以说这种算法偏差比较高。相反,它对于验证集产生的结果却是合理的,验证集中的错误率只比训练集的多了1%,所以这种算法偏差高,因为它甚至不能拟合训练集。
②假定训练集误差是0.5%,验证集误差是1%,偏差和方差都很低
③假定训练集误差是1%,验证集误差是11%,可以看出训练集设置得非常好,而验证集设置相对较差。我们可能过度拟合了训练集,在某种程度上,验证集并没有充分利用交叉验证集的作用,像这种情况,我们称之为“高方差”。
④假定训练集误差是15%,偏差相当高,但是,验证集的评估结果更糟糕,错误率达到30%,在这种情况下,我会认为这种算法偏差高,因为它在训练集上结果不理想,而且方差也很高,这是方差偏差都很糟糕的情况。

训练集误差 15 0.5 1 15
验证集误差 16 1 11 3013
- 欠拟合,高偏差 - 过拟合,高方差 高偏差,高方差

通过查看训练集误差,我们可以判断数据拟合情况,可以判断是否有偏差问题,然后查看错误率有多高。当完成训练集训练,开始使用验证集验证时,从训练集到验证集的这个过程中,我们可以判断方差是否过高。
接近线性的分类器,数据拟合度低。
采用曲线函数或二次元函数会产生高方差,因为它曲线灵活性太高以致拟合了错误样本和活跃数据。

1.3 机器学习基础(Basic Recipe for Machine Learning)

高偏差和高方差是两种不同的情况,要尝试的方法也可能完全不同
高偏差:
选择一个新的网络,比如含有更多隐藏层或者隐藏单元的网络,或者花费更多时间来训练网络,或者尝试更先进的优化算法。训练学习算法时,不断尝试这些方法,直到解决掉偏差问题,这是最低标准,反复尝试,直到可以拟合数据为止,至少能够拟合训练集。
高方差:
为了评估方差,我们要查看验证集性能,最好的解决办法就是采用更多数据,也可以尝试通过正则化来减少过拟合。
同时减少方差和偏差:
不断重复尝试,直到找到一个低偏差,低方差的框架。
只要正则适度,通常构建一个更大的网络便可以,在不影响方差的同时减少偏差,而采用更多数据通常可以在不过多影响偏差的同时减少方差。这两步实际要做的工作是:训练网络,选择网络或者准备更多数。

1.4 正则化(Regularization)

L2正则化:λ/2m 乘以W范数的平方
W和b是逻辑回归的两个参数,W是一个多维度参数矢量,b是一个实数,在逻辑回归函数中加入正则化,只需添加参数λ,也就是正则化参数
在这里插入图片描述
λ是正则化参数,我们通常使用验证集或交叉验证集来配置这个参数,尝试各种各样的数据,寻找最好的参数,我们要考虑训练集之间的权衡,把参数设置为较小值,这样可以避免过拟合,所以λ是另外一个需要调整的超级参数
神经网络含有一个成本函数,该函数包含W[1],b[1]到W[L],b[L]所有参数,L是神经网络所含的层数,因此成本函数等于m个训练样本损失函数的总和乘以1/m,正则项为
在这里插入图片描述
在这里插入图片描述
实现梯度下降:

在这里插入图片描述
在这里插入图片描述
该正则项说明,不论w是什么,我们都试图让它变得更小
该系数小于1,因此范数正则化也被称为“权重衰减”,因为它就像一般的梯度下降
选择λ的方法:①针对k个不同的值,用训练集训练出k个不同的正则化模型②在交叉验证集上用k个模型分别计算出对应的交叉验证误差,选出使J值最小的模型③计算误差

1.5 为什么正则化有利于预防过拟合呢?(Why regularization reduces overfitting?)

直观上理解就是如果正则化参数λ设置得足够大,权重矩阵被设置为接近于0的值,直观理解就是把多隐藏单元的权重设为0,于是基本上消除了这些隐藏单元的许多影响。如果是这种情况,这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑回归单元,可是深度却很大,它会使这个网络从过度拟合的状态更接近高偏差状态。

1.6 dropout 正则化(Dropout Regularization)

Dropout(随机失活)(用于训练集和验证集)

在这里插入图片描述
dropout会遍历网络的每一层,并设置消除神经网络中节点的概率。
假设网络中的每一层,每个节点得以保留和消除的概率都是0.5,设置完节点概率,我们会消除一些节点,然后删除掉从该节点进出的连线,最后得到一个节点更少,规模更小的网络,然后用backprop方法进行训练。
这是网络节点精简后的一个样本。对于每个训练样本,我们都将采用一个精简后神经网络来训练它。
keep-prob是一个具体数字,它表示保留某个隐藏单元的概率。
在这里插入图片描述
在这里插入图片描述
实施dropout:
①定义向量:d[3]表示一个三层的dropout向量
d3 = np.random.rand(a3.shape[0],a3.shape[1])
②keep-prob:d[3]中大于keep-prob的随机数字的对应值为1,其余为0。
③a元素相乘:a3 = np.multiply(a3,d3)
④向外扩展a3(修正期望):a3 = a3/keep-prob

在测试阶段,并未使用dropout,也就不用决定要消除哪些隐藏单元了,因为在测试阶段进行预测时,我们不期望输出结果是随机的。

1.7 理解 dropout(Understanding Dropout)

直观上理解:不要依赖于任何一个特征,因为该单元的输入可能随时被清除,实施dropout的结果是它会压缩权重,并完成一些预防过拟合的外层正则化。
对于有可能出现过拟合,且含有诸多参数的层,我们可以把keep-prob设置成比较小的值,以便应用更强大的dropout,有点像在处理L2正则化的正则化参数λ。
dropout一大缺点代价函数J不再被明确定义,每次迭代,都会随机移除一些节点,如果再三检查梯度下降的性能,实际上是很难进行复查的。

1.8 其他正则化方法(Other regularization methods)

1)数据扩增: 翻转,裁剪等
这些额外的假的数据无法包含像全新数据那么多的信息,但我们这么做基本没有花费,代价几乎为零,除了一些对抗性代价。以这种方式扩增算法数据,进而正则化数据集,减少过拟合比较简便
2)early stopping:
验证集误差通常会先呈下降趋势,然后在某个节点处开始上升。
当你还未在神经网络上运行太多迭代过程的时候,参数W接近0,因为随机初始化W值时,它的值可能都是较小的随机值,所以在你长期训练神经网络之前W依然很小,在迭代过程和训练过程中W的值会变得越来越大。所以early stopping要做就是在中间点停止迭代过程,我们得到一个值中等大小的弗罗贝尼乌斯范数,与正则化相似,选择参数w范数较小的神经网络。
优点:只运行一次梯度下降,你可以找出W的较小值,中间值和较大值,而无需尝试L2正则化超级参数λ的很多值。
缺点:不能独立地处理这两个问题。提早停止梯度下降,也就是停止了优化代价函数J,所以代价函数J的值可能不够小,同时你又希望不出现过拟合,你没有采取不同的方式来解决这两个问题,而是用一种方法同时解决两个问题,这样做的结果是我要考虑的东西变得更复杂。

1.9 归一化输入(Normalizing inputs)

我们希望无论是训练集和测试集都是通过相同的μ和σ2定义的数据转换
①零均值化:x等于每个训练数据x减去μ
②归一化方差:把所有数据除以方差σ2
在这里插入图片描述
优点:归一化特征后,代价函数平均起来看更对称,那么不论从哪个位置开始,梯度下降法都能够更直接地找到最小值,你可以在梯度下降法中使用较大步长,而不需要反复执行。
在这里插入图片描述

1.10 梯度消失/梯度爆炸(Vanishing / Exploding gradients)

训练神经网络时,导数或梯度有时会变得非常大,或者非常小,这加大了训练的难度。
权重W只比1略大一点,或者说只是比单位矩阵大一点,深度神经网络的激活函数将爆炸式增长,
权重W只比1略小一点,或者说只是比单位矩阵小一点,深度神经网络的激活函数将以指数级递减。

在这里插入图片描述

1.11 神经网络的权重初始化(Weight Initialization for Deep NetworksVanishing /Exploding gradients)

为了预防Z值过大或过小,你可以看到n越大,你希望Wi越小,因为Z是WiXi的和,如果你把很多此类项相加,希望每项值更小,最合理的方法就是设置Wi=1/n,n表示神经元的输入特征数量。

在这里插入图片描述
如果激活函数的输入特征被零均值和标准方差化,方差是1,Z也会调整到相似范围,所以梯度没有爆炸或消失过快。
不同的激活函数适合值不同
在这里插入图片描述

1.12 梯度的数值逼近(Numerical approximation of gradients)

在执行梯度检验时,我们使用双边误差,而不是单边公差,因为双边误差公式的结果更准确。
在这里插入图片描述

1.13 梯度检验(Gradient checking)

1)
在这里插入图片描述
在这里插入图片描述
也可以将J函数展开为
在这里插入图片描述
2)计算双边误差
对于每个i,求
在这里插入图片描述
其它项全都保持不变。
3)检验
在这里插入图片描述
如果你发现计算方程式得到的值为10^(-7)或更小,导数逼近很有可能是正确的。
如果它的值在10^(-5)范围内,需要再次检查这个向量的所有项,确保没有一项误差过大,可能有bug
如果这个方程式结果是10^(-3),也许存在bug。

1.14 梯度检验应用的注意事项(Gradient Checking Implementation Notes)

1)不要在训练中使用梯度检验,它只用于调试,因为它太慢了。
2)如果算法的梯度检验失败,要检查所有项,估测需要在哪些地方追踪bug,并试着找出bug。
3)在实施梯度检验时,如果使用正则化,请注意包括正则项。
4)梯度检验不能与dropout同时使用。
5)当W和b接近0时,梯度下降的实施是正确的,当W和b变大时,它会变得越来越不准确。

发布了1 篇原创文章 · 获赞 0 · 访问量 291

猜你喜欢

转载自blog.csdn.net/qq_35024702/article/details/104877136