吴恩达《ML Yearning》| 关于开发集、测试集的搭建

2020-05-14 15:11:11 浏览数 (2)

简介

MachineLearning Yearning Sharing 是北京科技大学“机器学习研讨小组”旗下的文献翻译项目,其原文由Deep Learning.ai 公司的吴恩达博士进行撰写。本部分文献翻译工作旨在研讨小组内部交流,内容原创为吴恩达博士,学习小组成员只对文献内容进行翻译,对于翻译有误的部分,欢迎大家提出。欢迎大家一起努力学习、提高,共同进步!

致谢

Deep Learning.ai公司

吴恩达(原文撰稿人)

陆顺(1-5章)

梁爽(6-10章)

郑烨(11-15章)

吴晨瑶(16-20章)

玉岩(21-25章)

陈波昊(25-30章)

翟昊(31-35章) 高宏宇(36-40章)

丁韩旭(41-45章)

李汤睿(46-50章)

马聪 (整体汇总)

北京科技大学“机器学习研讨小组”

人工智能前沿学生论坛(FrontierForum of Artificial Intelligence)

1、为什么使用机器学习的方法


分享人:陆顺

机器学习是无数重要应用的基础,包括网络搜索、反垃圾邮件的电子邮件、语音识别、产品推荐等等。假设你或你的团队正在研究一个机器学习的应用,同时你也想取得巨大的进步。那么这本书将帮助你完成这些。

示例:建立一个有关猫图片的初创公司

假设你正在建立一个能给猫爱好者提供无尽的猫图片的初创公司。

你们使用神经网络构建一个用于检测图片中的猫的计算机视觉系统。但不幸的是,你的学习算法的精度还不够好。改善这个猫的检测器,你面临着巨大的压力。你会怎么做呢?

你的团队有很多的想法,比如:

•获取更多的数据:收集更多猫的照片。

•收集一个更加多样化的训练集:例如,猫在异常位置的照片;猫具有不寻常颜色的照片;用各种相机设置拍摄的照片等等。

•通过运行更多梯度下降迭代来加长算法训练的时间。

•尝试具有更多层、隐藏单元或参数的更大的神经单元。

•尝试更小的神经网络。

•尝试添加正则化(如L2正则化)。

•改变神经网络架构(如激活功能,隐藏单元数等)。

•等等。

如果你在这些可能的方向中做出选择,那么你将构建领先的猫图片平台,并且引领你的公司走向成功。如果你没选择好,那么你可能会浪费几个月。你,会怎样去做呢?

这本书将告诉你如何去做。大多数机器学习问题留下的线索会告诉你什么尝试是有用的,什么尝试是徒劳的。学会阅读这些线索会节省你几个月甚至几年的开发时间。

2. 如何使用这本书去帮助你的团队


分享人:陆顺

当你阅读完本书后,对于机器学习项目如何选择研究的技术方向,你将会有一个深入的理解。

但是你的队友可能不明白为什么你推荐一个特定的方向。也许你希望你的团队定义一个单一的数字评估指标,但他们可能不信。你怎么去说服他们呢?

这就是为什么我让每个章节变得简短:这样你就可以将它们打印出来并让你的队友阅读你想让他们阅读的1~2页。

优先级的细微变化可能会对团队的工作效率产生巨大影响。通过帮助你的团队不断进步,我希望你能成为你团队的超级英雄!

3.预备知识和说明


分享人:陆顺

如果你在CourSera上学习了机器学习的课程,比如我的机器学习MOOC,或者你有使用监督学习的经验,你就能够理解这篇文章。

假设你对监督学习很熟悉:使用有标记的训练数据(x,y) ,学习一个从X映射到Y的函数。监督学习算法包括线性回归、逻辑回归和神经网络。机器学习有多种形式,但目前大多数机器学习的实际价值来自监督学习。

我将经常提到神经网络(也称为“深度学习”)。你只需要跟随本书理解他们是什么就足够了。

如果你不熟悉这里所提到的概念,请在Coursera(网址:http://ml-class.org)上学习机器学习课程的前三周的视频。

4.模型驱动机器学习进步


分享人:陆顺

许多深度学习(神经网络)的思想已经存在几十年了。为什么这些想法现在会兴起呢?

最近进展的两大最大驱动因素是:

•数据可用性:人们现在在数字设备(笔记本电脑、移动设备)上花费了更多的时间。他们的数字活动产生了大量的数据,我们可以把这些数据反馈给学习算法。

•计算规模:几年前,我们开始训练神经网络,这些神经网络足够大,能够利用我们现在拥有的巨大数据集。

具体来说,即使你积累了更多的数据,通常运用更早的学习算法如逻辑回归会变得平整。这表示着它的学习曲线“平了”,意即就算你给它更多的数据,算法也停止改进。

就好像旧的算法不知道如何处理我们现在所有的数据。

如果你在同一个监督学习任务上训练一个小的神经网络,你可能会得到更好的性能:

这里,通过“Small NN”来表示一个只有少量隐藏单元/层/参数的神经网络。最后,如果你训练越来越大的神经网络,你可以获得更好的性能:

因此,以下情形你会获得最好的性能:(i)当训练一个非常大的神经网络时,这样你就在上面的绿色曲线上;(ii)拥有大量的数据。

许多其他细节,如神经网络架构也很重要,并且在这里有很多创新。但是,目前更可靠的提高算法性能的方法仍然是:(i)训练更大的网络;(ii)获得更多的数据。

如何实现(i)和(ii)的过程非常复杂。这本书将详细地讨论细节。我们将从那些对于传统学习算法和神经网络有用的策略入手,并最终建立一个基于现代策略的深度学习系统。

5. 你的开发和测试集


分享人:陆顺

让我们回到我们之前的猫图片示例:运行一个手机应用,用户将许多不同内容的图片上传到这个应用中。你想自动找到有关猫的图片。

你的团队通过从不同网站下载猫(正样本)和非猫(负样本)的图片获得大量训练集。将70%的数据集作为训练集,30%数据集作为测试集。使用这些数据,可以构建一个可在训练集和测试集上运行良好的猫探测器。

但是当你将此分类器部署到移动应用程序中时,你会发现性能非常差!

这是为什么呢?

你发现用户上传的图片与构成训练集的网站图片的有些不同:用户正在上传使用手机拍摄的照片,这些照片往往分辨率较低,模糊不清,光线不足。由于你的训练/测试集是由网站图片组成的,因此你的算法并不能很好地泛化到你关心的实际分布:手机图片。

在大数据时代之前,在机器学习中随机选取70%来形成训练集和30%来形成测试集是一个普遍的规则。在实践中确实有效,但是在越来越多的应用程序中这并非是一个好的选择,因为其中的训练分布(上面示例中的网站图像)与你最终关注的分布(手机图像)不同。

我们通常定义:

•训练集——运行你的学习算法。

•Dev(开发)集——用于调整参数,选择功能和做出有关学习算法的其他决策。有时也叫“保持交叉验证集”。

•测试集——用于评估算法的性能,但不用于决定使用哪种学习算法或参数。

一旦定义了开发集和测试集,你的团队就会尝试很多想法,例如不同的学习算法参数,以查看哪些性能最优。开发和测试集可让你的团队快速了解算法的工作性能。

换句话说,开发集和测试集的目的是引导你的团队完成对机器学习系统所做的最重要的更改。

所以,你应该做以下事情:选择开发集和测试集以反映你将来预计会获得的并能在其上完成很好性能的数据。

换句话说,你的测试集不应该只是可用数据的30%,特别是如果你预料到未来的数据(手机图像)与训练集(网站图像)本质上并不相同。

如果你尚未开启移动应用,则可能还没有任何用户,因此可能无法获得能准确反映你将来需要完成优良性能的数据。但你仍然可以试图接近这个目标。例如,请你的朋友拍摄猫的手机照片并发送给你。开启应用程序后,你可以使用实际用户的数据来更新你的开发/测试集。

如果你真的没办法获得未来预计会获得的数据,或许你可以从使用网站图像开始。但是你应该意识到这个问题会导致系统不能很好地泛化。

你需要判断投入多少来组成开发集和测试集,但是不要假设你的训练集分布和你最终的测试集分布相同。尝试挑选那些能反映你最终想在其上表现优良性能的测试示例,而不是你在训练中碰巧遇到的数据。

6.你的开发和测试集应该来自相同的分布


分享人:梁爽

根据您最大的市场,将猫应用图片数据分为四个区域:(i)美国,(ii)中国,(iii)印度和(iv)其他。为了找到一个开发集和一个测试集,比如我们可以把美国和印度放在开发集; 中国和其他放在测试集。换句话说,我们可以随机分配这其中的两个区域到开发集,另外两个到测试集,对吧?

一旦定义了开发集和测试集,您的团队将专注于提高模型在开发集上的性能。 因此,开发集应该反映你最想提高的任务:在所有四个地区都要做得很好,而不只是两个。开发集和测试集的不同分布带来的第二个问题:有这样一种可能性,你的团队将构建一个在开发集上工作得很好的模型,然而发现它在测试集上表现得不好。我曾经在很多失望和白费的努力中看到这个结果。避免让这些发生在你身上。

例如,假设您的团队开发的系统在开发集上工作的很好,但在测试集上并不如意。如果你的开发集和测试集合来自相同的分布,那么你可以很明确地诊断到模型哪里出错了:你在开发集上过拟合(overfit)了。显而易见的方法是去获得更多的开发集数据。

但是如果开发集和测试集来自不同的分布,那么你的选择是不清晰的。在这几方面可能会出错:

1、在开发集上过拟合。

2、测试集比开发集更难。所以你的算法可能做的和预期一样好,因此没有进一步的重大改进的可能了。

3、测试集不一定更难,但只是和开发集不同。所以在开发集上表现很好但并不能在测试集上表现一样。这种情况下,之前很多提高开发集性能的努力可能都白费了。

在机器学习应用程序上工作是很艰难的。当你改进了开发集分布的表现时,当开发集和测试集具有不同分布时,会引入是否能改进测试集性能额外的不确定性。具有分布不匹配的开发和测试集,使得更难找出什么是有效和无效的努力,因此使得更难以确定工作的优先级。

如果你面临的是第三方基准测试问题,他们的创建者可能会指定开发集和测试集来自不同的分布。相比开发和测试集来自同一分布,此时运气将比技术对这样的基准的性能有更大的影响。开发一个在一个分布上训练的很好同时能够很好的推广到另一个分布中的学习算法是一个重要的研究问题。但是如果你的目标是在一个特定的机器学习应用中取得进展,而不是研究进展,我建议尝试选择服从相同分布的开发集和测试集。这将使您的团队更有效率。

7. 开发测试集需要多大


分享人:梁爽

开发集应该足够大,以检测您尝试的算法之间的差异。例如,如果分类器A具有90.0%的准确度,分类器B具有90.1%的准确度,那么100个样本的开发集将不能检测出这0.1%的差异。与我看到的其他机器学习问题相比,100个样本的开发集太小了。常见的开发集的大小在1,000到10,000个样本之间。有10,000个样本,你将有很好的机会检测到这0.1%的提升。[2]

对于成熟和重要的应用,例如广告,网络搜索和产品推荐 - 我也看到了很多团队,甚至为提升0.01%积极努力,因为它对公司的利润有直接影响。在这种情况下,开发集可以远大于10,000,以便检测出更小的提升。

测试集的大小应该多大?它应该足够大,使得对系统的整体性能有一个高的可信度。一个流行的启发式方法是将30%的数据用于测试集。当你有适量的样本,比如100到10,000的样本,它会工作的很好。但在大数据的时代,我们现在有机器学习问题,有时会超过十亿个样本,分配给开发集/测试集的比例一直在缩小,即使开发集 /测试集中的样本绝对数量一直在增长。除了需要评估算法的性能之外,没有必要提供过大的开发集/测试集。

[2]. 在理论上,我们可以测试算法的变化是否对开发集产生统计上显著的差异。 在实践中,大多数团队不会为此困扰(除非他们出版学术研究论文),我通常没法发现统计意义的测试对测量临时进展是有用的。

8. 为你的团队进行算法优化建立一个单一数字的评估指标


分享人:梁爽

分类准确率是单一数字评估指标(single-number evaluation metric)的一个示例:你在开发集(或测试集)上运行分类器,然后得到关于样本正确分类的比例的一个数字。根据这个指标,如果分类器A获得97%的准确率,而分类器B获得90%的准确率,那么我们认为分类器A更好。

相比之下,查准率(Precision)和查全率(Recall)[3] 就不是一个单一数字的评估指标:它给出了两个数字来评估分类器。拥有多个数字的评估指标使得比较算法更加困难。假设你的算法表现如下:

如上所示,两个分类器都没有显而易见地比另一个更好,所以它不能立即引导你选择其中一个。

在开发期间,你的团队会尝试大量关于算法架构、模型参数、特征选择等方面的想法。使用单一数字的评估指标(single-number evaluation metric)(如精度)使得你可以根据其在该指标上的表现快速对所有模型进行排序,从而快速决定哪一个是能工作得最好的。

如果你真的既关心查准率(Precision)又关心查全率(Recall),我推荐使用一种标准方法将它们组合成一个单一的数字。例如,可以取Precision和Recall的平均值,最终得到单个数字。或者,你可以计算“F1度量(F1 score)”,这是一种基于其平均值改善的方法,比简单地取平均值效果要好。[4]

当你在大量的分类器中进行选择时,使用单一数字的评估指标可以加快你做出决策的能力。所有这些都给出了明确的表现排名,从而给出一个清晰的前进方向。

作为最后一个例子,假如你分别得在四个主要市场((i)美国,(ii)中国,(iii)印度和(iv)其他地区)跟踪猫分类器的准确率。这里提供了四个指标。通过对这四个数据进行平均或加权平均,最终得到一个单一数字度量。取平均值或加权平均值是将多个指标合并为一个的最常见的方法之一。

[3] 猫的分类器的查准率(Precision)是指在开发集(或测试集)中检测出的所有有猫的图片中有多少比例是真正的有猫。它的查全率(Recall)指在开发集(或测试集)中所有真正有猫的图片有多少比例被检测出来了。在高查准率和高查全率之间通常存在权衡。

[4] 如果你想要了解更多关于F1度量(F1 score)的信息,请参阅https://en.wikipedia.org/wiki/F1_score 。它是基于Precision和Recall的”几何平均(geometric mean)”定义的,其计算公式为2(1/Precision) (1/Recall)。

9. 优化指标和满足目标


分享人:梁爽

这里有组合多个评估指标的另一种方法。

假设你同时关心算法的准确率和运行时间。你需要在如下三个分类器中进行选择:

如果将准确率和运行时间通过如下一个公式得到单个评估指标会看起来不太自然,例如:

Accuracy − 0.5∗RunningTime

你可以这样做:首先,定义一个“可接受”的运行时间。例如任何运行时间在100ms以内的算法都是可接受的。然后,根据满足运行时间标准的分类器,最大化准确率。这里,运行时间就是一个“满足指标”,你的分类器必须要在这个指标上表现地“足够好”就行,这就意味着它最多为100ms。准确率是一个“优化指标”。

如果你正在权衡N个不同的标准,例如模型的二进制文件大小(这对于移动app很重要,因为用户不想要下载很大的app)、运行时间和准确率,你可以考虑将其中N-1个标准设置为“满足”指标。也就是说你只需要他们满足特定的值即可。然后将最后一个定义为“优化”指标。例如,将二进制文件大小和运行时间设定一个可接受的阈值,并尝试在这些约束条件下不断优化准确率。

作为最后一个例子,假定你正在构建一个硬件设备,该设备使用麦克风监听用户说出的某个特定的“唤醒语(wakeword)”,从而唤醒系统。例如:Amazon Echo监听“Alexa”;苹果Siri监听“Hey Siri”;Android监听“Okay Google”;百度app监听“Hello Baidu”。你同时关心假正例的比率(the false positive rate——当没有人说唤醒语时系统唤醒的频率)和假反例的比率(the false negative rate——当有人说出唤醒语时系统没有唤醒的频率)。该系统性能的一个合理目标是最大限度的减少误报率(optimizing metric),同时满足每24小时操作出现不超过一个假正例(satisficing metric)。一旦你的团队按照评估指标进行优化,他们将能够取得更快的进展。

10. 有一个开发集和评估指标来加速迭代


分享人:梁爽

对于一个新问题,很难事先知道什么方法是最合适的。即使经验丰富的机器学习研究人员通常会尝试许多想法,才能发现令人满意的东西。在构建机器学习系统时,我经常会:

1. 首先有一些如何构建系统的想法(idea)

2. 用代码(code)来实现这些idea

3. 进行实验(experiment),来告诉我的这个idea工作的如何。(通常我的前几个想法并不能work)基于这些学习,回去从而产生更多的idea,并不断迭代。

这是一个不断迭代的过程。你循环得越快,你的进展也就越快。这就是开发/测试集和评估指标非常重要的原因:每次尝试一个idea时,在开发集上衡量idea的表现,将使你快速判断你是否在朝着正确的方向前进。

相反,如果你没有特定的开发集和评估指标。那么每次团队开发出一个新的猫分类器时,你必须把它移植到你的app中,并体验几个小时来感受一下这个新的分类器性能是否有提升。这将非常慢!此外,如果你的团队将分类器的准确率从95.0%提升到95.1%,你可能无法通过体验app来感受到0.1%的提升。而通过不断积累这些许多个0.1%的改进,你的系统将取得很大的进步。有一个开发集和评估指标,可以使你很快地检测出哪些想法给你的系统带来了小(或大)的提升,因此你可以快速决定哪些想法可以继续改善,哪些可以舍弃。

11. 何时调整验证集,测试集以及评价指标


分享人:郑烨

当开始一个新的项目时,我会尝试快速的设定验证集和测试集,这样可以给团队一个明确的努力方向。

通常情况下,我要求我的团队尽量一周之内搞定初始的验证集和测试集以及性能评价方法,而不要想太复杂。但这种方式不适用于一个已经成熟的项目。例如垃圾邮件的识别是一个非常成熟的深度学习项目。在一个成熟的项目上可能会画更多的时间比如多达数月去获得更好的验证集及测试集划分从而进一步提升性能。

如果你发现你在开始设定的验证集和测试集或者评价方法和你的目标不符,无论如何请尽快修正它们。例如,如果你设定的验证集和评价标准认为分类器A优于分类器B,但是你的团队认为分类器B实际上对于产品来说是更优越的,那么这可能意味着你需要调整验证、测试集或评价指标。

错误的判断分类器性能的可能原因主要有以下三点:

1. 真实应用场景中的数据分布与你的验证集和测试集存在差异

假设你的验证集和测试集主要是成年猫的图片,你发现你的app上线后收到的用户上传的图片中有很多非常可爱的小奶猫的。因此,你的验证集和测试集的分布没有覆盖到真实业务中数据的部分分布。所以你需要升级你的训练数据。

2. 在验证集上过拟合了

在验证集上反复进行模型调优的过程很可能导致模型在验证集上发生了过拟合。同时你也会在测试集上验证你的系统性能。如果你发现模型在验证集上的性能明显优于在测试集的性能,这意味着在验证集上过拟合了,你需要更新你的验证集数据。

如果你想要把握团队的进展,你可以定期的在测试集上验证模型,一周一次或者一月一次。但是请牢记,测试集只能用于模型的评估,千万不要让测试集的结果影响你任何关于算法或模型的进一步修改,包括是否要回滚到上一个版本的模型。如果你这么做了,你将开始逐步掉入在测试集上过拟合的大坑,并且不能指望测试集再给出你关于系统的完全无偏估计。但这种科学客观的评价恰好是你发表论文或者做出商业决策的重要部分。

3. 性能评价指标与项目实际需要优化的目标不匹配

例如你正在做一个关于猫咪的项目,你的评价指标是分类准确率。这种度量方式认为分类器A性能优于分类器B。但是你在实际测试两个算法的过程中发现,A会把一些成人色情图片分为正确的一类,从而把它推荐给用户。在这种情况下,即使A的准确率要更高,但对色情图片的处理使得它是不可接受的(你懂的),所以你该怎么做呢?

目前的情况是评价方法不能良好的区别哪种模型性能更好。因此你不能再相信目前的评价指标能选出最好的算法,所以是时候改变你的评价指标了。例如,你可以增大你的评价指标中对于色情图片的惩罚。我强烈推荐你选择一个新的评估方法来修正你的团队的优化目标,而不是转向人工的漫无目的对不同模型进行选择。

更改验证集、测试集和评估方法在时间中是很常见的情况。快速的设定初始验证集、测试集和评估方法能让你开始快速的算法迭代。如果你发现你的验证集和测试集或者评估方法存在问题,不能很好的指引你前进,不要慌,抓紧更换,继续朝正确的方向努力就好。

12. 建立验证集和测试集的技巧


分享人:郑烨

验证集和测试集的数据分布要和你将来要实际应用的目标数据分布保持一致

尽可能的使验证集和测试集服从同一分布

选择单一的优化目标,如果存在多个目标,想办法将它们合成为一个,例如取加权平均的方式

机器学习是一个高度依赖于不断迭代的工程性问题,你很可能需要几十次甚至是上百次的尝试才能找到一个比较满意的想法

设定验证集、测试集和评估方法可以帮助你快速评估不同的算法,当然也可以帮助你快速迭代你的想法

当开始一个新的机器学习项目,请尽量在一周内设置好验证集、训练集以及评估方法以便开始快速的迭代,当然如果是在一个成熟的问题上,你需要画更多的时间来选择更好的设定

当数据量足够时传统的将数据按照7:3的比例分为训练集和验证、测试集的方式不再适用,你只需要占比很少的验证和训练集

当然你的验证集和测试集也不能太小,需要足够的能力能够给予你对算法的评估

如果发现验证集、测试集或者评估方法不能很好的评价你的模型,即使更换他们,详细说明见上一章节。

0 人点赞