第二门课 改善深层神经网络:超参数调试、正则化以及优化
1.1 训练,验证,测试集(Train / Dev / Test sets)
应用深度学习是一个典型的迭代过程,需要多次循环往复,才能为应用程序找到一个称心的神经网络,因此循环该过程的效率是决定该项目进展速度的一个关键因素,而创造高质量的训练数据集,验证集和测试集也有助于提高循环效率。
在机器学习发展的小数据量时代,常见做法是将所有数据三七分,就是人们常说的70%验证集,30%测试集,如果没有明确设置验证集,也可以按照60%训练,20%验证和20%测试集来划分。这是前几年机器学习领域普遍认可的最好的实践方法。
但是在大数据时代,我们现在的数据量可能是百万级别,那么验证集和测试集占数据总量的比例会趋向于变得更小。假设我们有100万条数据,其中1万条作为验证集,1万条作为测试集,100万里取1万,比例是1%,即:训练集占98%,验证集和测试集各占1%。对于数据量过百万的应用,训练集可以占到99.5%,验证和测试集各占0.25%,或者验证集占0.4%,测试集占0.1%。
验证集的目的就是验证不同的算法,检验哪种算法更有效。测试集的主要目的是正确评估分类器的性能。可以只有训练集和验证集,没有测试集。
1.2 偏差,方差(Bias /Variance)
以下分析的前提都是假设基本误差很小,训练集和验证集数据来自相同分布。
高偏差对应欠拟合;高方差对应过拟合。
理解偏差和方差的两个关键数据是训练集误差(Train set error)和验证集误差(Dev set error)。
假定训练集误差是1%,验证集误差是11%,像这种情况,我们称之为“高方差”。
假设训练集误差是15%,验证集误差是16%,这种算法偏差高,因为它甚至不能拟合训练集。
1.3 机器学习基础(Basic Recipe for Machine Learning)
有两点需要大家注意:
第一点,高偏差和高方差是两种不同的情况,我们后续要尝试的方法也可能完全不同,我通常会用训练验证集来诊断算法是否存在偏差或方差问题,然后根据结果选择尝试部分方法。
第二点,在机器学习的初期阶段,关于所谓的偏差方差权衡的讨论屡见不鲜,原因是我们能尝试的方法有很多。可以增加偏差,减少方差,也可以减少偏差,增加方差,但是在深度学习的早期阶段,我们没有太多工具可以做到只减少偏差或方差却不影响到另一方。但在当前的深度学习和大数据时代,只要持续训练一个更大的网络,只要准备了更多数据,那么也并非只有这两种情况,我们假定是这样,那么,只要正则适度,通常构建一个更大的网络便可以,在不影响方差的同时减少偏差,而采用更多数据通常可以在不过多影响偏差的同时减少方差。这两步实际要做的工作是:训练网络,选择网络或者准备更多数据,现在我们有工具可以做到在减少偏差或方差的同时,不对另一方产生过多不良影响。我觉得这就是深度学习对监督式学习大有裨益的一个重要原因,也是我们不用太过关注如何平衡偏差和方差的一个重要原因,但有时我们有很多选择,减少偏差或方差而不增加另一方。最终,我们会得到一个非常规范化的网络。
机器学习中存在偏差方差的权衡问题。而深度学习,大量可利用的数据,以及可训练的更深的网络,是的我们可以在减小偏差和方差一方的同时,不会过多地影响另一方。
1.4 正则化(Regularization)
深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但你可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高,但正则化通常有助于避免过拟合或减少你的网络误差。
L1正则化使模型变得稀疏,减小了过拟合,同时也进行了特征选择的过程。
L2正则化则使模型的参数更小,一般认为,参数较小的模型⽐较简单,能适应不同的数据集,也在⼀定程度上避免了过拟合现象。
1.5 为什么正则化有利于预防过拟合呢?(Why regularization reduces overfitting?)
以神经网络为例,
直观上理解如果正则化参数设置的足够大,权重被设置为接近于0的值,相当于某些连接不存在,简化了神经网络,可是深度却很大,会使这个网络从过拟合的状态变成高偏差的状态。但是会有一个中间值,一个“Just Right”的状态。
1.6 dropout 正则化(Dropout Regularization)
假设网络中的每一层,每个节点都以抛硬币的方式设置概率,每个节点得以保留和消除的概率都是0.5,设置完节点概率,我们会消除一些节点,然后删除掉从该节点进出的连线,最后得到一个节点更少,规模更小的网络,然后用backprop方法进行训练。
假设keep-prob=0.8,则代表去掉20%的神经元。
训练阶段为了保证某一层输出的期望值不变,需要将保留神经元的权重和输入的乘积和除以0.8。
此外,测试阶段不需要进行dropout。
1.7 理解 dropout(Understanding Dropout)
直观上理解:不要依赖于任何一个特征,因为该单元的输入可能随时被清除,因此该单元通过这种方式传播下去,并为单元的四个输入增加一点权重,通过传播所有权重,dropout将产生收缩权重的平方范数的效果,和之前讲的L2正则化类似;实施dropout的结果实它会压缩权重,并完成一些预防过拟合的外层正则化;L2对不同权重的衰减是不同的,它取决于激活函数倍增的大小。
如果你担心某些层比其它层更容易发生过拟合,可以把某些层的keep-prob值设置得比其它层更低,缺点是为了使用交叉验证,你要搜索更多的超级参数,另一种方案是在一些层上应用dropout,而有些层不用dropout,应用dropout的层只含有一个超级参数,就是keep-prob。
要牢记一点,dropout是一种正则化方法,它有助于预防过拟合,因此除非算法过拟合,不然我是不会使用dropout的,所以它在其它领域应用得比较少,主要存在于计算机视觉领域。
dropout的一大缺点就是代价函数J不在被明确定义,每次迭代,都会随机移除一些节点,如果再三检查梯度下降的性能,实际上是很难进行复查的。
1.8 其他正则化方法(Other regularization methods)
(1)数据扩增 增大数据集
比如对于图片来说,可以翻转图片和裁剪图片。
(2)早停
1.9 归一化输入(Normalizing inputs)
训练神经网络,其中一个加速训练的方法就是归一化输入。假设一个训练集有两个特征,输入特征为2维,归一化需要两个步骤:
(1)零均值
(2)归一化方差
归一化是的参数学习的过程更加简单快速。
1.10 梯度消失/梯度爆炸(Vanishing / Exploding gradients)
权重参数大于1时,经过很多层,以指数级增长,会导致梯度爆炸。1.5的N次方
权重参数小于1时,经过很多层,以指数级增长,会导致梯度消失。0.5的N次方
1.11 神经网络的权重初始化(Weight Initialization for Deep NetworksVanishing / Exploding gradients)
输入特征被零均值和标准方差化,方差是1,确实降低了梯度消失和爆炸问题。
1.12 梯度的数值逼近(Numerical approximation of gradients)
简单来说就是导数的定义。
1.13 梯度检验(Gradient checking)
对参数
θ
\theta
θ增加
ϵ
\epsilon
ϵ,其他项保持不变。
1.14 梯度检验应用的注意事项(Gradient Checking Implementation Notes)
参考:
吴恩达深度学习课程
http://www.ai-start.com/dl2017/