训练、测试、验证集
今天主要讨论神经网络机器学习中的问题,然后是随机神经网络,还会学习确保神经网络正确运行的技巧。
在训练神经网络时,我们需要做出很多决策,例如:
神经网络分多少层;每层含有多少个隐藏单元;学习速率是多少;各层采用哪些激活函数等。
创建新应用的过程中,我们不可能从一开始就准确预测出这些信息和其他超参数。实际上,应用型深度学习是一个高度迭代的过程,通常在项目启动时,我们会先有一个初步想法,比如构建一个含有特定层数,隐藏单元数量或者数据集个数等等的神经网络,然后编码,并尝试运行这些代码,通过运行和测试得到该神经网络或这些配置信息的运行结果,你可能会根据输出结果重新完善自己的想法,改变策略,或者为了找到更好的神经网络不断迭代更新自己的方案。
所以说,应用深度学习是一个典型的迭代过程,需要多次循环往复,才能为应用程序找到一个称心的神经网络,因此循环该过程的效率是决定项目进展速度的一个关键因素,而创建高质量的训练数据集,验证集和测试集也有助于提高循环效率。
通常将数据划分几部分,一部分作为训练集,一部分作为简单交叉验证集,有时也称为验证集,最后一部分则作为测试集。接下来,我们开始对训练集执行算法,通过验证集选择最好的模型,经过充分验证,我们选定了最终模型,然后就可以在测试集上进行评估,为了无偏评估算法的运行状况。
在机器学习发展的小数据量时代,常见做法是将所有数据三七分,就是人们常说的 70% 验证集,30%测试集,如果没有明确设置验证集,也可以按照 60%训练,20%验证和 20%测 试集来划分。这是前几年机器学习领域普遍认可的最好的实践方法。
但是在大数据时代,我们现在的数据量可能是百万级别,那么验证集和测试集占数据总量的比例会趋向于变得更小。因为验证集的目的就是验证不同的算法,检验哪种算法更有效,测试集的主要目的是正确评估分类器的性能,对最终所选定的神经网络系统做出无偏估计。假设我们有 100 万条数据,其中 1 万条作为验证集,1 万条作为测试集, 100 万里取 1 万,比例是 1%,即:训练集占 98%,验证集和测试集各占 1%。对于数据量过 百万的应用,训练集可以占到 99.5%,验证和测试集各占 0.25%,或者验证集占0.4%,测试集占 0.1%。
总结一下,在机器学习中,我们通常将样本分成训练集,验证集和测试集三部分,数据集规模相对较小,适用传统的划分比例,数据集规模较大的,验证集和测试集要小于数据总量的 20%或10%。
另外,确保验证集和测试集的数据与训练集都来自同一分布。
最后一点,就算没有测试集也不要紧,测试集的目的是对最终所选定的神经网络系统做 出无偏估计,如果不需要无偏估计,也可以不设置测试集。所以如果只有验证集,没有测试 集,我们要做的就是,在训练集上训练,尝试不同的模型框架,在验证集上评估这些模型, 然后迭代并选出适用的模型。因为验证集中已经涵盖测试集数据,其不再提供无偏性能评估。
偏差、方差
假设这就是数据集,如果给这个数据集拟合一条直线,可能得到一个逻辑回归拟合,但 它并不能很好地拟合该数据,这是高偏差(highbias)的情况,我们称为“欠拟合(” underfitting)。
相反的如果我们拟合一个非常复杂的分类器,比如深度神经网络或含有隐藏单元的神经 网络,可能就非常适用于这个数据集,但是这看起来也不是一种很好的拟合方式分类器方差较高(high variance),数据过度拟合(overfitting)。
在两者之间,可能还有一些像图中这样的,复杂程度适中,数据拟合适度的分类器,这 个数据拟合看起来更加合理,我们称之为“适度拟合”(just right)是介于过度拟合和欠拟合中间的一类。
理解偏差和方差的两个关键数据是训练集误差(train set error)和验证集误差(dev set error)。
假定训练集误差是1%,为了方便论证,假定验证集误差是11%,可以看出训练集设置得非常好,而验证集相对较差,我们可能过度拟合了训练集,在某种程度上,验证集并没有充分利用交叉验证集的作用,像这种情况,我们称之为“高方差”。
通过查看训练集误差和验证集误差,我们便可以诊断算法是否具有高方差。也就是说衡 量训练集和验证集误差就可以得出不同结论。
假设训练集误差是 15%,我们把训练集误差写在首行,验证集误差是 16%,而真实数据情况错误率几乎为0%(就是人为标注数据没有错误)。可以看出训练数据的拟合度不高,就是数据欠拟合,就是说这种算法的偏差比较高。相反,它对于验证集产生的结果却是合理的,验证集中的错误率只比训练集多了1%,所以这种算法偏差高。
再假定训练集误差是 15%,偏差相当高了,但是,验证集的评估结果更糟糕,错误率达到 30%,在这种情况下,我会认为这种算法偏差高,因为它在训练集上结果不理想, 而且方差也很高,这是方差偏差都很糟糕的情况
再看最后一个例子,训练集误差率是0.5%,验证集误差是1%,用户看到这样的结果会很开心,因为只有1%错误率,偏差和方差都很低。
但是这里需要明确一点,这些假设预测都是基于真实数据的人为标注错误率接近0%,也就是所说的最优误差,也称为贝叶斯误差。如果最优误差15%,而再看我们分类器的训练误差15%,验证误差16%,那么15%的错误率对训练集来说也是非常合理的,偏差不高,方差也非常低。
先不考虑最优误差会高的情况(也就是真实数据的标注都不准,错误率高),我们假设最优误差接近0%,查看训练集误差,我们可以判断数据拟合情况,至少对于训练数据是这样,可以判断是否有偏差问题,然后查看错误率有多高。当完成训练集训练,开始使用验证集验证时,我们可以判断方差是否过高,从训练集到验证集的这个过程中,我们可以判断方差是否过高。
以上分析的前提都是假设基本误差很小,训练集和验证集数据来自相同分布,如果没有 这些假设作为前提,分析过程更加复杂。
机器学习基础
在初始模型训练完成后,首先要知道算法的偏差高不高,如果偏差较高,试着评估训练集或者训练数据的性能(说明一下训练集误差在一定程度上反应偏差,但偏差有自己的计算公式,可以百度搜索下如何计算)。如果偏差的确很高,甚至无法拟合训练集,那么要做的就是选择一个新的网络,比如含有更多隐藏层或者隐藏单元的网络,或者花费更多的时间来训练网络,或者尝试更先进的优化算法。训练学 习算法时,会不断尝试这些方法,直到解决掉偏差问题,这是最低标准,反复尝试,直到 可以拟合数据为止,至少能够拟合训练集。
如果网络足够大,通常可以很好的拟合训练集,只要你能扩大网络规模。如果最优误差不是很高,那么训练一个更大的网络,你至少可以能很好的拟合训练集,至少可以拟合或者过拟合训练集。一旦偏差降低到可以接受的数值,检查一下方差有没有问题,为了评估方差,我们要看验证集性能。如果方差高,最好的解决方法就是采用更多的数据,如果我们无法获得更多的数据,我们也可以尝试正则化来减少过拟合。有时候我们不得不反复尝试,但是,如果能找到更合适的神经网络框架,有时它可能会一箭双雕,同时减少方差和偏差。
大家注意两点:
第一点,高偏差和高方差是两种不同的情况,我们后续要尝试的方法也可能完全不同, 通常会用训练验证集来诊断算法是否存在偏差或方差问题,然后根据结果选择尝试部分方法。举个例子,如果算法存在高偏差问题,准备更多训练数据其实也没什么用处,至少这不是更有效的方法,所以大家要清楚存在的问题是偏差还是方差,还是两者都有问题,明确这 一点有助于我们选择出最有效的方法。
第二点,在机器学习的初期阶段,关于所谓的偏差方差权衡的讨论屡见不鲜,原因是我们能尝试的方法有很多。可以增加偏差,减少方差,也可以减少偏差,增加方差,但是在深度学习的早期阶段,我们没有太多工具可以做到只减少偏差或方差却不影响到另一方。但在当前的深度学习和大数据时代,只要持续训练一个更大的网络,只要准备了更多数据,那么也并非只有这两种情况,我们假定是这样,那么,只要正则适度,通常构建一个更大的网络便可以,在不影响方差的同时减少偏差,而采用更多数据通常可以在不过多影响偏差的同时减少方差。这两步实际要做的工作是:训练网络,选择网络或者准备更多数据,现在我们有工具可以做到在减少偏差或方差的同时,不对另一方产生过多不良影响。我觉得这就是深度学习对监督式学习大有裨益的一个重要原因,也是我们不用太过关注如何平衡偏差和方差的一个重要原因,但有时我们有很多选择,减少偏差或方差而不增加另一方。最终,我们会得到一个非常规范化的网络。从下节课开始,我们将讲解正则化,训练一个更大的网络几乎没有任何负面影响,而训练一个大型神经网络的主要代价也只是计算时间,前提是网络是比较 规范化的。