Practical aspects of Deep Learni

作者: Lexie_qiqi | 来源:发表于2020-02-03 09:09 被阅读0次

Train / Dev / Test sets


在实际应用中,如何使你的神经网络高效工作,这些方法包括超参数调整,数据准备,再到如何确保你的优化算法运行的足够快,以使得你的学习算法能在合理的时间内完成学习任务。

在考虑如何设置你的训练集/开发集/测试集时,如果能够做出一个好的选择,将会帮助你快速建立一个高性能的神经网络,在训练一个神经网络时,你必须做出许多的决定,例如你的是神经网络将会有多少层,并且每一层中包含多少个隐藏神经元,学习速率是多少还有每一层你想用什么激活函数,当你开始一个新的应用时,你几乎不可能一次性地就正确地才到上面提及的,以及未提及的超参数的准确数值。

因此在实际应用中,机器学习是一个高度迭代的过程,在这个过程中,你经常以一个想法为起点,例如你想建立一个具有一定层数,一定数量的隐藏神经元,或许是基于某个特定数据集的或者满足其他的需求神经网络,然后你只要将你的想法转换为代码,并运行你的代码来尝试实现它,在你运行并且实验之后,你将会得到一个结果,这个结果会告诉你这个特定的网络或者说这个特定的配置执行得好不好,然后根据这个结果,你可能会改进你的想法,并改变你的选择,而且你也许会为了尝试找出一个越来越好的神经网络而不断迭代。

highly iterative process

如今深度学习在许多领域获得成功,从自然语言处理到计算机视觉到语音识别再到许多基于结构化数据的应用,结构化数据包括很多东西,包括广告,额昂也搜索,而网页搜索不止包括搜索引擎,还包括例如购物网站等所有的这些。从一个研究领域或应用领域中的直觉,通常是并不能直接套用到其他的领域的,最好的选择可能取决于你所拥有的数据量,输入数据的特征个数,也取决于你的计算机配比,比如你是在GPU上训练还是在CPU上训练,以及GPU和CPU和具体配置是怎样的,还有很多其他因素,所以我认为对很多应用来说,想猜准超参数几乎是不可能的,所以目前,机器学习的应用是相当反复的,迭代的过程,你只需要将这个循环进行许多次,就有希望能为你的应用中的网络找出好的参数,所以有一件事决定你能多块地取得进展,那就是你进行迭代过程时的效率,而恰当你将你的数据集分为训练集,开发集和测试集,就能让你的迭代效率更高。

Train / Dev / test sets

假设这个大矩形是你的训练数据,取出一部分,作为训练集training set,然后再留出一部分作为开发集development set,简称dev set,最后取出一部分用作测试集。

整个工作流程是首先你不停地用训练集来训练你的算法,然后用你的开发集或者说是hold-out交叉验证集来测试,许多不同的模型在哪一个开发集上效果最好,当这个过程进行的时间够长之后,你可能想评估一下你最终的训练结果,你可以用测试集对结果中最好的模型进行评估,这样使得评估算法性能时不引入偏差。

在这个大数据时代,不同集的占比趋势可能会变化,开发集的意义是用来测试不同的算法并确定哪种最好,所以开发集只要足够大到能够用来评估两种不同的算法,或是十种不同的算法时快速选出较好的一种,达成这个目标可能不需要多达20%的数据,所以如果你有100万个训练样本,可能开发集只要1万个样本就足够了。

与开发集相似,测试集的主要功能是对训练好的分类器的性能,给出可信度较高的评估,同样如果你可能有100万个样本,但是只要1万个,就足够评估单个分类器的性能,能够对其性能给出比较准确的估计了。最好确保开发集和测试集中的数据分布相同。

测试集的目的是给你一个无偏估计,来评价你最终所选取的网络性能,但如果你不需要无偏的估计的话,没有测试集也许也没有问题,所以当你只有开发集而没有测试集的时候,你所做的就是用训练集尝试不同的模型结构,然后用开发集去评估它们,根据结果进一步迭代,并尝试得到一个好的模型,因为你的模型拟合了开发集中的数据,所以开发集不能给你无偏的估计,但如果你不需要无偏估计的话,也完全无妨。在机器学习的世界里,如果你只有训练集和开发集,而没有单独的测试集的话, 大多数人会将开发集称为测试集,但他们实际做的事是,把测试集当成了hold-out交叉验证集。

Bias / Variance


如果用一条直线来区分样本数据。

那么用逻辑回归可能画出图上的这条直线(图1),这条直线和训练数据的拟合度并不高,这样的分类称之为高偏差high bias,或是欠拟合的underfitting

如果使用一个极为复杂的分类器,例如深度神经网络,或者含有所有隐藏神经元的神经网络,或许可以像(图3),中画的完美区分训练数据,但这看上去并不是一个非常好的分类算法,这个高方差high variance的分类器,也称之为过拟合overfitting

在这两种分类器中,可以找到一种不那么复杂但正确的分类的算法,如(图2),这看起来对数据的区分非常合理,我们认为这才是完美匹配的算法,结果居于欠拟合和过拟合之间,像图中的这个有两个特征值的2D样例,横轴标记为x1,纵轴标为x2,你可以绘制数据,把偏差和方差可视化,在高维度问题中,你无法将数据绘制在图上,并可视化决策边界。

猫的图片分类的例子。

如果训练集误差为1%,开发集误差为11%,说明你的模型对训练集处理得非常好,但是相对来说,开发集处理的就有些不尽人意,所以这可能是在处理训练集时过拟合了,模型在某种程度上对于交叉验证集合(开发集)泛化性不够好,定义为高方差high variance

如果训练集误差是15%,开发集误差为16%,在这种情况下,我们假设人工识别误差是0%,则这个算法在训练集处理上表现得不尽人意,如果它并未将训练集数据处理得很好,这就是欠拟合,我们认为这个算法是高偏差high bias,但相比之下,这个算法在应用于开发集时还处于一个可接受的水准和在训练集时的表现相比,误差只多了一个1%,所以这个算法是高偏差。

如果训练集误差是15%,开发集误差为30%,在这种情况下,定义为高方差&高偏差

如果训练集误差是0.5%,开发集误差为1%,这个算法是低偏差和低方差的

example

这种分析方法的前提是基于真人识别的,误差为0%的假设,一般来说,我们称之为理想误差,或者有时称之为贝叶斯误差,贝叶斯误差接近0%。

假如你的图像真的很模糊,哪怕是真人或者是任何系统都不能进行分类,那贝叶斯误差就会非常高,然后会有一些不同的手段来改变分析方法。

Basic Recipe for Machine Learning


训练一个神经网络时遵循的基本原则。

当训练好了最初的神经网络时,首先会问这个算法是否有高偏差high bias,如果存在高偏差,则说明模型在训练集上不能良好的拟合,解决方法是,1.挑选一个新的神经网络,比如,带有更多隐藏层或更多隐藏单元的,或是延长训练时间,让梯度下降法运行更长时间,或换用一些更高级的优化算法。2.找到一个更适合当前问题的神经网络结构

当把偏差减小到可以接受的范围之后,就再问这个算法是否有高方差high variance?要判断这一点,会看模型在开发集上的表现,看模型是否具备一般化的能力,如在训练集上性能良好,当一般化到开发集上,仍能性能较好,则不存在此问题。如果有比较高的方差,解决高方差的问题的最好方法是取得更多的数据(More data),或者就可以尝试正则化(Regularization),用它可以减少过拟合。

直到最后找到一种低偏差低方差的网络,然后问题就解决了。训练一个更大的神经网络从来都没有坏处,当训练的神经网络太大时,主要的代价只是计算时间,只要你采取正则化就行。

相关文章

网友评论

    本文标题:Practical aspects of Deep Learni

    本文链接:https://www.haomeiwen.com/subject/bbnfxhtx.html