学习笔记:Ng的深度书籍学习记录

该篇笔记,是我学习时的记录笔记,大多数是由翻译软件翻译的很多不准,只做自己查阅,欢迎大家去下载Andrew Ng(原版书籍进行查看)

##1.什么是ML 策略 

ML学习是无数重要应用的基础,包括web搜索,电子邮件反垃圾邮件、语音识别、产品检验等等,还有很多,我想你的团队正在学习和要构建一个工作时所需要的ML学习应用,并且您希望开始发展,我想这就是这本书能帮你做的一点。
例如 : 构建一个cat 图片探测器
假如你正在构建一个cat图片探测器,你将为爱猫人士,提供无尽的流浪猫的图片,以供这些流浪猫爱好者,增添兴趣。
你使用了一个神经网络来构建一个计算机视觉检测系统来检测图片中的猫,
但不幸的是,你的学习算法的准确率是非常的不好,你不得不在巨大的压力下去改善你的cat探测器,这不能不完成这些工作,你该怎么办呢?
你的团队有很多的想法,例如:
&&1.获取跟多的数据;收集更多有关猫的图片。
&&2.收集更多的多元化训练数据,例如,猫在不同位置的图片,猫在各种不同寻常的环境下面的图片,还有就是旋转照片机利用不同的拍摄技巧来拍摄很多张有关猫的图片
&&3.通过多次训练来是梯度下降迭代到最低,以时间来训练你的算法
&&4.尝试使用更大的神经网络,使用更多的层,很多的隐藏单元,或者更多的参数。
&&5.尝试使用比较小的神经网络。
&&6.尝试增加正则化,如L2正则
&&7.更改神经网络体系机构(如激活函数,隐藏单元数等)
..................................................
如果你在这些可能的方向中选择好了,你就会建立起领先的图片探测器,并带领你的公司走向成功,如果你选择不好的话,你可能浪费几个月的时间,你该怎么做吗?
这本书将告诉你如果做,大多数ML学习问题都会留下线索,告诉你什么是可以尝试的,什么是不应该去尝试的,学会阅读这些线索你将节省几个月的宝贵时间,以便让该时间进行更好的发展。

##2.我如何使用这本书帮助我的团队

完成这本书后,你将有一个深刻的理解如何在ML项目上进行合理的技术应用和技术探讨。
但是你的队友可能不是很清楚,你为什么要推荐一个特定的方向。也许你要求你的团队每人定义了一个单号的评估指标工作,但是他们是不相信的,你该怎么去说法他们呢?
这就是为什么我做了这章简短的介绍的原因,你可以将他打印出来,并让你的队友只阅读1到2页,你需要让他们知道。
优先级的一些更改会让你的团队的工作效率产生巨大的影响,通过帮组你的团队有了一些很突出的变化,我希望你能成为你们团队的超级英雄。

##3.预备知识和基础的符号

你如果参加了Ml学习课程,如我的ML学习 Mooc课程,或者你已经有监督学习应用的经验,你将能够理解这段文字。
我想你将对SL监督学习很熟悉:学习一个映射在x上的函数到y,使用标记的训练实例(x,y),监督学习算法包括线性回归,逻辑回归,和神经网络,机器有很多种学习,但是今天ML学习的价值大多来自监督学习。
我将经常提到神经网络(也称DL学习),你只需要一个基本的理解,他们是什么,遵循这段文字。
你如果不熟悉这里提到的概念,请观看前三个星期的Coursera上的Ml学习视频。
​http://ml-class.org

##4.规模驱动机器学习的进步

许多DL学习和想法(神经网络)已经有60多年的历史了,这些想法都是现在才兴起吗?肯定不是的。
最近取得进展的最重要的两大驱动因素是:
&&1.大数据的诞生,数据的可用性(人们现在花在数字设备上的时间越来越多(笔记本电脑,移动设备)等等,他们的数字活动就此产生了大量的数据,以便于为我们提供了学习的基础的可能,以此才有了各种学习的算法。
&&2.计算规范打发展(运行速度越来越快),我们开始与几年前,以便能够选了神经网络形成足够大的网络,这些都利用了巨大的数据集。
具体而言,即使你累积了更多的数据,通常也是老学习的表示算法,如高原深层逻辑回归,这意味着他的学习曲线变平了,算法以及停止改进,即使你给他更多的数据:
就像旧的算法不知道如何处理我们现在拥有的所有的数据一样。
如果你在相同的监督学习任务上训练了一个小型的中性网络,你可能会获得更好的性能:
在这里,通过Small NN 小神经网络,只有少量的隐藏层,隐藏参数。最后,如果你需要训练越来越大的神经网络,你可以获得更多的性能。
因此当您训练一个非常大的神经网络时,您可以获得最佳的性能,
&&1.你可以看到上面的绿色曲线,是最佳的。
&&2.他也拥有更多的数据。
许多其他的细节,如神经网络体系结构也很重要,而且这些已经有很多的创新,但改进算法的更可靠的方法,提升性能的途径,仍然是,培训一个更大的网络,或者获取更多的数据。
————————————————————————
如果你的数据很少,你可能更希望用NNs人工神经网络来处理,如果是数据很多的话,还是推荐你使用神经网络。
————————————————————————
如果完成训练更大的网络和获取更多的数据,这个两个过程是惊人的复杂,这本书将讨论详细的过程,我们将从最传统的学习算法和神经网络开始,并建设一个当前最好的深度学习系统。

##5. 你的开发和你的测试集

让我们回到我们早期的cat探测器的例子上面:你如果运行了一个移动的app,用户将许多不同内容的图片通过app,上传到了你的服务,你想自动找到有关于猫的照片。
你的团队通过下载很的猫的图片,从不同的网站上去下载好的或者不好的图片,如猫和老虎,我们将他们拆分为测试集,和训练数据集,利用这些数据,他们构建了一个cat探测器,他能很多的工作在你的训练和测试集上。
但是,当您将此分离器部署到移动应用的时候,您会发现真的很冏。
发生了什么?
你发现用户上传的图片与从网站上下载的图片,不同与,你构成系统所培训集的图片,用户正在上传的图片,是使用不同移动设备拍摄的图片,这些往往是分辨率不好,及其模糊,光线不足的图片,而你的训练测试集是从网站上下载的高清图片,所以您的算法没有很好的概况到实际你关心的目标核心上面:手机图片。

在大数据现代的当前下,使用ML学习是一个很常见的规则,随机划分70%和30%的数据拆分,以形成你的训练和测试集,这种做法是可行的,但他是一个坏主意,在越来越多的应用程序的训练过程中,就没有关心到您的移动手机图片,所以我们不这样拆分我们的数据集。
我们通常这样定义:
&&1.训练数据集Training set
&&2.开发训练集 Dev set 保留交叉数据集
&&3.测试数据集 Test set,他可以用来评估算法的性能。
一旦您定义了这三层数据集,你的团队将尝试很多想法。如不同的学习算法参数,以参看什么样的算法是效果最好的,我这样拆分的效果,可以让你的开发和测试看出很显著的算法效果。
换句话说,Dev 数据集和测试数据的目的是引导你的团队对ML学习系统进行最重要的更改。
所以,你应该执行一的操作是:
选择Dev 和Test 数据,让这些数据集能反映您所期望最好的数据集,进行图片精度提升达到最好。
换句话说,你的测试集不应该简单的是可用数据的30%,尤其是在无法遇到的移动手机图片上,因为移动手机上面的图片和你训练的图片有本质的不同。
如果你还没有启动你的移动应用,你可能还没有任何的用户,因此可能无法获得准确反映你可能发生的情况,但应该还是要尝试接近这一点。例如,让你的盆友通过手机给你上传一些手机拍摄的照片,或者让他们发生给你,启动应用后,你可以使用实际用户数据来更新你的Dev和Test数据集。
如果你真的没有任何办法,可以获取你所期望得到的数据集,而使用了网站上面的数据集,但是你一定要意识到你的应用会有一个很严重的系统风险。
他需要判断来确定在开发大型Dev和Test上所投入的时间和金钱,但不要假设您的Dev和Test分布相同,尝试选择测试数据,而是最好的训练数据,提升你的训练能力。

## 6.你的开发和测试集应该来自相同的发行版

你有一个cat 应用程序,他的图片数据来自4个国家,有最大的市场,如美国,中国,印度,和其他国家,现在为了得到一个Dev 数据集和 Test数据,我们把美国和印度放在Dev 数据集,将中国和其他国家的数据作为测试数据集,换句话说,我们可以将其中两个部分随机分配给Dev集,另外两个部分随机分配给Test数据集,对吧?
一旦您定义了开发和测试数据集,你的团队将专注与提高Dev 数据集的性能,因此,开发集应该反映您最希望改进的任务:在所以四个地理区域上都做得很好,而不仅仅是两个地理区域。
还有第二个问题,不同的开发和测试数据集分布,您的团队将在dev集建立行之有效的东西,却发现他在测试上很糟糕,我看过这导致的问题或浪费的时间和精力,你一定不要让这种事情发生在你的身上。
有一个实际的例子:假如你的团队开发了一个系统,适用但不设置的开发测试设置,如果你的开发和测试集来自相同的分布,那么你将有一个非常明确的诊断,到底哪里搞错了,你有overfit(过拟合)的dev数据集,你将能显而易见的去治疗你的开发测试集。
但是如果Dev数据集和测试数据集来自不同的发行版本,那么您的选择就不太清楚了,有几种肯定会出现错误。
1.你已经有了过拟合的开发数据集
2.测试数据集比开发数据更难,因此你的算法可能做的和预期的一样好,不可能有一些进一步的显著改进。
3.测试数据集不一定比开发数据更难,但与开发数据有很多的不同,因此你会出现在开发数据集上运行的良好,在测试数据上运行的非常不好,在这种情况下,你可以提高dve数据性能所做的许多工作都是可能徒劳的。
在机器学习应用程序上的工作已经够难了,dev数据集和test数据的不匹配会带来很多额外的不确定性,即改进开发集分布是否也会提高测试集的性能,如果dev数据集和测试数据集不匹配,我们将很难确认是那么在工作,哪里没有在工作,因此也就很难确认工作的优先级。
如果你正在处理第三方基准测试问题,那么他们的创建者可能已经制定了来自不同发行版的dev和test数据集,与来自相同发行版的开发和测试集相比,运气将对此类基准测试的性能产生更大的影响,研究一种训练与一个分布的学习算法,并将起推广到另一个分布的学习算法是一个重要的研究课题,但是,如果你的目标是在特定的机器学习应用程序上去的进展,而不是在研究上取得进展,我建议您城市选择来自相同发行版的开发和测试集,这回让你的团队更加的高效,进行效率的工作。

##7.开发/测试集需要多大?

开发数据应该足够大,以检测出正在测试的算法之间的差异,例如,如果分类器A 的准确率为90%,而分类器B的准确率为90.1%,那么一个包含100个实例的、开发数据集将无法检测到这0.1%的差异,与我见过的其他机器学习问题相比,100个实例dev 数据集是非常小的,大小从1000到10000个实例的开发集很常见,有了这10000个实例,你将有很好的机会检测到0.1%的改进。
对于成熟和重要的应用程序,列如:广告,web搜索,产品推荐,我也看到一些团队非常积极的想要勉强实现0.01%的改进,因此这对公司的利润有直接的影响,在这种情况下,dev数据集可能比10000大得多,以便检测更小的改进。
测试数据的大小应该怎样才好吗?他也应该足够大,以便对系统的整体性能给予高度信任,一种流行的启发式方法是将30%的数据集用于测试,当你有少量的实例(比如100到1000个实例)时,这种方法将非常有效,但在大数据时代,我们现在有机器学习的问题,有时有超过10亿个例子,分配给dev/test数据的比例一直在缩小,即使dev/test数据集中的例子的绝对数量一直在增长,除了评估算法性能所需要的一外,没有必要拥有过大的dev/test数据集。(从理论上讲,我们还可以测试对算法的更改是否会在开发集上产生统计上的显著差异。在实践中,大多数团队都不会为此费心(除非他们发表学术研究论文),而且我通常不认为统计显著性测试对度量中期进度有用。)

##8.为你的团队建立一个单一的评估指标来进行优化

分类准确性是单数评估度量的一个实例,你在运行你的开发或者测试数据集是,会返回一个单数的百分比数字,根据这个度量,如果分类器A获得97%的准确率,而分类器B 获得90%的准确率,那么我们判断分类器A是优越的。
以此相反的是,Precision(精确度)和Recall(召回率)不是一个单一的数字评估指标,他给出了2个数字来评估你的分类器,多个评估指标会使比较算法变得非常的困难,假如你的算法执行如下:
A 95% 90% (准确度,召回率) B 98% 85%
在这里,这两个分类器显然都不是最好的,所以它不能立即指导您选择一个。
在开发过程中,您的团队将尝试很多关于算法架构、模型参数、特性选择等方面的想法。拥有一个单数字的评估度量,例如精确度,允许您根据该度量上的性能对所有模型进行排序,并快速决定什么最有效。
如果您真的关心精确度和召回率,我建议使用一种标准方法将它们组合成单个数字。例如,可以取精确度和召回率的平均值,得到一个数字。或者,您可以计算f1Score ,是一种改进的计算平均值的方法,比简单地求平均值更有效。
当您在大量分类器中进行选择时,使用单数字评估度量可以加快您做出决策的能力。它给出了一个明确的优先级,因此,一个明确的发展方向。
最后一个例子,假设您在四个关键市场分别跟踪cat分类器的准确性:(i)美国、(ii)中国、(iii)印度和(iv)其他。这提供了四个指标。通过取这四个数字的平均值或加权平均值,就得到了一个单一的数字度量。取平均值或加权平均值是将多个指标组合成一个指标的最常见方法之一。

##9.优化和满足条件的指标

下面是合并多个评估指标的另一种方法。
假如你即关心学习算法的准确率也关心学习算法的学习运行时间,你需要从三个分类器中进行选择:
将精度和运行时间放入一个公式中,从而得到一个度量,这似乎是不自然的。
精确度-0.5 *运行时间
下面是您可以执行的操作,首先,定义什么是可接受的运行时间,让他们说,假设在100ms内运行的任何东西都是可以接受的,然后,根据您符合的运行时间,让你选择的分类器满足运行时间标准,最大化准确性,在这里,运行时间是一个令人满意的度量标准,---你的分类器只需要在这个度量标准上能够达到足够好,就行,即使他最多需要100毫秒,准确性是优化度量标准。
如果你要权衡N个不同的标准,比如模型的二进制文件大小(这对移动应用程序很重要,因为用户不想下载大型的应用程序)、运行时间和准确性,你可以考虑将其中的N-1设置为令人满意的指标,即:您只需要他们满足某个值即可,然后将最后一个定义为优化度量,列如:为二进制文件大小和运行时间设置一个课接受的分割值,并尝试在给定这些约束的情况下优化精度。
最后一个例子是,假如您正在构建一个硬件设备,该设备使用麦克风来监听用户说某个特定的wakeword的声音,然后该用户说这个wakeword会导致系统唤醒,列如Amazon,循环监听Alexa,苹果siri在监听嗨Siri,android在监听ok谷歌,百度应用程序在监听,你好百度,你即关心假阳性比率,即使没有人说梦话,系统也会以这种频率醒来--也关心假阴性比率,---即当有人说梦话时,系统多次不醒一次,该系统性能的一个合理目标时最小化假阴性率(优化度量),前提时每24小时不超过要给假阳性(满意度量)。一旦你的团队对评估指标进行了优化,他们将能够取得更快的进展。

##10 .拥有一个开发集和度量标准可以加速迭代

事先知道什么方法对新问题最有效是很困难的。即使是有经验的机器学习研究人员通常也会尝试许多想法,然后才会发现一些令人满意的东西。在构建机器学习系统时,我经常会:
1.从如何构建系统的一些想法开始
2.在代码总实现这个想法。
3.进行一个实验,告诉我这个想法效果如何,(通常我们最初的几个想法时行不通的)基于这些学习,返回产生跟多的想法,并继续迭代。
想法===》 代码====》实例

这是一个迭代过程,你越快完成这个循环,你的进度就越快,这就是为什么拥有开发/测试集和度量是重要的,每次您尝试一个想法时,度量您的想法在开发集上的性能可以让你快速决定是否朝着正确的方向前进。
相反,假如您没有特定的开发集和度量指标,所以每次你的团队开发一个新的cat分类器时,你必须将他整合到你的应用程序中,并在这个应用程序上玩几个小时,以了解这个新的分类器是否时一个改进,这回非常的慢,而且,如果你的团队对分类器的准确率从95.0%提高到95.1%,你可能无法检测到使用该应用程序有0.1的改进,但是,你的系统将通过逐步累积这0.1%的改进而取得很大的进步。拥有一个开发集和度量标准可以让您非常快速地发行那些想法能够成功的给你带来小(或大)的改进,因此可以让你快速的决定要继续细化那些想法,以及要抛弃那些想法。

##11.何时更改开发/测试集和进行度量评估

在进行一个新项目开发时,我试图快速选择开发/test数据集,因为这给了一个团队很明确的目标。
我通常要求我的团队拿出不到一周的时间内提出一个初始开发/测试集和一个初始度量标准——很少比这个时间长,最好时想出一些不完美的东西,然后迅速开始,而不是想太多,但这一周的时间表并不使用于成熟的应用程序,例如,反垃圾邮件时一个成熟的ML学习应用程序,我看到在已经成熟的系统上工作的团队花费数月时间来获得更好的开发/测试数据集。
如果你后来意识到你最初的开发/测试集或者度量没有达到目标,那么一定要尽快的更改他们,例如,如果你的开发集+度量将分类器A排在分类器B之上,但是您的团队认为分类器B实际上更适合您的产品,那么这可能意味着您需要更改开发/测试集或评估度量。
开发集/度量标准错误地将分类器评级为更高的三个主要因素:
1.你需要做好的实际发行版不同于开发/测试集。
假如你最初的开发/测试集主要是成年猫的照片,你发布了你的cat应用,发行用户上传的cat图片比预想的要多得多,因此,开发/测试集发行版并不能代表你需要做好的实际发行版,在这种情况下,更新你的开发/测试集更有代表性。

2.你有过拟合的开发集
在开发集中反复评估想法的过程会导致你的算法逐渐过渡拟合你的开发集,当你完成开发、你必须评估你的系统上的测试集,如果你发现开发集的性能比测试集的性能要好很多,这就是一个迹象,说你你的开发集,已经过拟合,在这种情况下,你需要从新获取一些新的开发集。
如果你需要跟踪你的团队的进度,你也可以在测试集上定期的评估你的系统——比如每周一次或每月一次,但时不要使用测试集对算法做出任何决定,包括是否回滚到前一周的系统,如果你这样做了,你夸奖开始过度适应测试集,并且不能在指望他对你的系统性能给出一个完全公正的评估(如果你正在发表研究论文,或者可能正在使用这个度量标准来做出重要的业务决策,那么你将需要他)。
3.度量标准度量的不是项目需要优化的东西。
假设对于你的cat应用程序,度量标准时分类精度,这个度量目前对分类器A列为优于分类器B的级别,但是假设你尝试了中两种算法,并且发行分类器A允许偶尔的色情图片通过,虽然分类器A更准确,但偶尔出现的色情图片给人的不良影响会意味着不可能接受的,你时做什么的?
这里度量没有识别出算法B实际上比算法A更适合你的产品这一事实,所以,你不能在相信度量来选择最好的算法,时时候改变评估指标了,例如,你可以更改度量标准以严重惩罚允许通过色情图像,我强烈建议选择一个新的度量标准,并使用这个新的度量标准来显示地为团队定义一个新的目标,而不是在没以偶可信的度量标准的情况下进行太长时间的工作,并恢复到手动选择分类器的状态。
在项目中更改开发/测试集或者评估指标时非常常见的,拥有一个初始的开发/测试集和度量可以帮组你快速迭代,如果你发行开发/测试集或者度量不在为你的团队指明正确的方向,这并不是什么大问题,你只要改变他们,确保你的团队知道新的方向。

##12.一个外卖项目:建立开发和测试集

&&1.从一个分布中选择开发和测试数据集,该分布反映了你希望在将来获得什么数据,以及希望在那些方面做得更好,这可能与你得培训数据分布不同。
&&2.如果可能,选择来自相同发行版得开发/测试集
&&3.为你得团队选择一个单数字评估指标来进行优化,如果你关心多个目标,可以考虑将他们组合成一个公式(例如平均多个错误度量)或定义满足和优化度量。
&&4.ML学习时一个高度迭代得过程,在找到满意得想法之前,你可能会尝试很多得想法。
&&5.拥有开发/测试集和单数字评估度量可以帮组你快速评估算法,从而更快得迭代。
&&6.当开始一个全新得应用程序时,试着在不到一周得时间内快速建立开发/测试集和度量标准,在成熟得应用程序上花费更长得时间可能没有问题。
&&7. 百分之70 或百分之30得开发/测试数据得分割不适合有大量数据得问题,开发或者测试集可能远远少于数据得30%
&&8.你i得开发集应该足够大,可以检测出算法准确性得显著变化,但不一定要大得多,你得测试集应该足够大,能够对系统得最终性能给出一个自信得评估。
&&9.如果你得开发集和度量标准不再为你得团队指明正确得方向,那就要迅速得改变他们
&&&1.如果你以及超出了开发集得范围,那就获取跟多得开发集数据
&&&2.如果你关心得实际分布与开发/测试集分布不同,则获取新得开发/测试集数据。
&&&3.如果你得度量标准不在衡量对你来说最重要得东西,那就改变它。

##13.快速构建您的第一个系统,然后进行迭代

你想建立一个新的电子邮件反垃圾系统,你的团队有一个新的想法.
&&1.收集并训练大量的垃圾邮件数据,例如,设置一个 honeyport,故意发送假的邮件地址到以知的垃圾制作者哪里,以便你可以获取更多的垃圾邮件。
&&2.开发用于了解电子邮件文本内容的功能。
&&3.开发用于了解电子邮件信封/标题功能,以显示什么设置
这条消息通过的互联网服务器。
&&4.或者做其他更多的事。
尽管我在反垃圾邮件方面做了大量的工作,但我仍然很难做出一个选择的方向,如果你不是应用领域的专家,那就更难了。
所以不要一开始就试图设计和建立一个完美的系统,相反,建造和训练一个
基本的系统很快就能完成——也许只需几天。即使基本系统远离最好的系统,
相差很多,但是这已经可以让你检测一下基本系统是如何运作是有价值的,你会很快找到线索,告诉你最有前途的投资方向?然后在决定投资你的时间,接下来的几章将教你如何发现这样的线索。(5天是构建一个系统的完整周期时间,但是这5天不适合论文发表者)

##14.错误分析:查看开发集示例来评估想法

当你玩你的cat嗅探器程序,你注意到了几个例子,他错误的将狗识别成猫。
一名团队成员建议我们使用第三方软件,来以便更好的处理和保证对狗的识别,他说这将需要更改一个月的时间,并且需要团队成员一个月的热情,你应该让他们去做吗?
在花一个月的时间去完成这项任务之前,我建议你先估计一下这样改变实际到底会给系统提升多少的系统精度accuracy,然后你将可以更加理性的决定这是否需要你投入这一个月的开发时间,或者如果你最好可以将这一个月的时间,利用到其他任务上。
相信介绍,以下是你想怎么做的一些标准:
&&1.收集100个导致你系统出现错误的,错误实例。这些实际是在哪里为啥出现错误。
&&2.手动查看这些示例,并计算它们中狗图像所占的比例
这个查看错误实例的过程被称为erro analysis 错误分析,在这个例子中,如果你发现只有5%的错误分类的图像是狗,那么无论你提高你的算法在狗图片上的识别性能,你都不会摆脱这5%的错误,换句话说,5%是一个上限(意思是最大的可能错误),拟议中的项目可能会有很大帮助。因此,如果您的整个系统当前的准确率是90%
(10%的误差),这种改进可能会导致最多90.5%的准确性(或9.5%的误差,
比原来的10%误差小5%)
相反,如果你发现50%的错误是狗,那么你可以更加自信
这个拟议的项目将产生重大影响。它可以将准确率从90%提高到95% (a
相对误差减少50%,从10%降至5%)。
这个简单的错误分析计算项目,为你提供了快速估计错误的方法,和可行的价值,纳入第三方软件的狗图像,它提供了一个决定是否进行该项投资的数量依据。
错误分析能帮组我们了解不同方向的发展前景,我看过很多的工程师不愿意进行错误分析,他们会直接动手去实现这些想法,与其质疑这个想法还不如投入时间,把他它付诸实践。这是一个常见的错误,他可能会导致你的团队花了一个月才意识到,原来这样做,这样去实施,这种疗法收效甚微。
动手检测100个错误实例并不会花你很长的时间,即使你会发一些时间,但是这个工作也一定是在两个小时内你就可以完成,而这两个小时的时间,却节省了你一个月的努力时间。
错误分析是检测你开发的算法,是否正确的唯一标准,而错误分类,以便你能够理解错误的根本的原因,这可以帮组你优先考虑项目-----就像在这个例子中一样,并激发了我们将要讨论的新方向,在下面几章中我将介绍并进行错误分析的实战。

##15.在错误分析过程中进行评估多个想法

您的团队有几个改进cat检测器的想法:
&&1.修复你的算法识别猫狗的问题。
&&2.修正您地算法识别大猫如狮子和黑豹
&&3.提高系统在模糊图像上的性能。
..... 等等
你可以同时有效地评估这些所有地想法,我通常创建一个电子表格和在预览大约100张错误分类地开发图片时来填写它。我也会写下评论这可能有助于我记住具体地例子,为了说明这个过程,让我们看看下面包含4个实例地小型关于dev数据集地电子表格。
上面第3列检测了大猫和模糊的图像,此外由于一个实例可能与多个类别关联,因此底部的百分比加起来可能不等于100%。
虽然你可能首先指定类别(狗,大猫,模糊)然后分类用手举例子,在实践中,一旦你开始看列子,你可能会启发提出新的错误类别,列如,你浏览了一打图片并意识到许多错误发生与instagram过滤图片,你可能回去添加电子表格中新增了一个instagram专栏。手动查看的列子错误分类的算法,以及询问你作为一个人如何/是否能够正确地给图片贴上标签,往往会激励你想出新地错误类别和解决方案。
最有用的错误分类是那些你有改进想法的错误。为举个例子,如果你有“撤销”的想法,Instagram类别将是最有帮助的。Instagram过滤并恢复原始图片。但你不必只局限于自己要错误分类,你知道如何改进;此过程的目标是构建您的关于最有前途的领域的直觉
误差分析是一个迭代过程。如果一开始没有考虑类别,也不要担心。在看了几张图片之后,您可能会想到一些错误分类的想法。在手动对一些图像进行分类之后,您可能会想到新的类别并重新检查图像根据新的类别进行分类等等。
假设您完成了对100个错误分类的开发集示例的错误分析,并得到以下几点:
你现在知道在一个项目中解决狗的错误可以减少8%错误最多。处理较大的Cat或模糊图像错误可以帮助消除更多错误错误。因此,您可以选择后两种类别中的一种作为重点。如果你的团队有没有足够多的人同时追求多个方向,你也可以问一些工程师
研究伟大的猫和其他人研究模糊的图像。误差分析不会产生一个严格的数学公式,告诉你什么是最高的优先任务应该是。你还必须考虑到你希望取得多大的进步制定不同的类别和解决每个问题所需的工作量。

##16.清理标记错误的开发和测试集数据

在错误分析期间,您可能会注意到开发集中的一些示例标记错误。当我在这里说“贴错标签”时,我的意思是照片已经被人贴错标签了甚至在算法遇到它之前。即。,则示例(x,y)中的类标签具有y的值不正确。例如,可能有一些不是猫的图片贴错了标签
就像包含一只猫一样,反之亦然。如果你怀疑贴错标签的图像的比例是多少重要的是,添加一个类别来跟踪标记错误的示例的比例:
您应该更正开发集中的标签吗?请记住,开发集的目标是帮助您快速评估算法,以便您可以判断算法A或B更好。如果因此,标记错误的开发集会阻碍您做出这些判断花时间修复标记错误的开发集标签是值得的。
例如,假设分类器的性能为:
&&1. 开发集的整体准确性 90% (10 %错误)
&&2.由于标错的例子而引起的错误 0.6% (6%来自错误地数据)
&&3.其他原因造成的错误 9.4% (94%来自错误地数据)这里,由于标记错误而导致的0.6%的不准确性相对于9.4%的错误是可以改进的。手工修复贴错的标签没有害处在开发集中的映像,但是这样做并不重要:不知道是否您的系统总误差为10%或9.4%。
假设您一直在改进cat分类器
&&1. 开发集的整体准确性 98% (2.0 %错误)
&&2.由于标错的例子而引起的错误 0.6% (30%来自错误地数据)
&&3.其他原因造成的错误 1.4% (70%来自错误地数据)30%的错误是由于标记错误的开发集映像造成的,这会给您的开发集添加严重的错误的估计精度。现在值得改进开发集中的标签的质量。
处理标记错误的示例将帮助您判断分类器的错误是否更接近1.4%或2%——显著的相对差异。
开始时容忍一些标记错误的开发/测试集示例并不少见,只是在稍后改变你的想法,因为你的系统改善,使部分错误标签的例子
相对于总错误集增长。
上一章解释了如何改进错误分类,如Dog、Great Cat和通过算法改进变得模糊。在这一章你已经学会了你可以通过改进数据的标签,对标签错误的类别进行改进。无论您应用于修复开发集标签的过程是什么,请记住将其应用于测试集标签,这样您的开发和测试集就可以继续从相同的发行版中获得。将开发集和测试集一起修复可以防止我们在第6章中讨论的问题,您的团队优化了开发集的性能,但是后来才意识到它们的存在根据不同的测试集判断不同的标准。如果您决定提高标签的质量,请考虑对您的系统分类错误的示例以及它正确分类的示例的标签。它是否可能原来的标签和你的学习算法都是错误的的例子。如果只修复系统错误分类的示例的标签,则可能会修复在你的评估中引入偏见。如果你有1000个开发集的例子,如果你的分类器有98.0%的准确率,它错误分类的20个例子比检查更容易检查吗980个样本分类正确。因为在实践中只检查错误分类的例子,偏见确实渗透到一些开发集。如果你是,这种偏见是可以接受的只对开发产品或应用程序感兴趣,但如果计划的话,这将是一个问题在学术研究论文中使用结果或需要一个完全公正的衡量测试集的准确性。

##17.如果您有一个大的开发集,将它分成两个部分子集,只有一个子集

假设您有一个包含5000个示例的大型开发集,其中错误率为20%。
因此,您的算法对大约1,000个dev图像进行了错误分类。手工操作需要很长时间检查1,000幅图像,因此我们可能决定不在错误分析中使用所有图像。
在这种情况下,我将显式地将开发集拆分为两个子集,其中一个子集是您要查看的其中一个你不知道。您将更迅速地超出您手工操作的部分看着。您可以使用您没有手动查看的部分来优化参数。让我们继续上面的例子,在这个例子中,算法错误地对1000个样本进行了分类开发人员设置了5000个示例。假设我们要手动检查大约100个错误分析(误差的10%)。您应该随机选择开发集的10%并放置它进入我们所说的眼球开发集,提醒我们自己,我们正在用我们的的眼睛。(有关语音识别的项目,你会在其中聆听音频片段,
也许您可以将此集合称为Ear开发集)。因此,Eyeball开发集有500个
例如,我们期望我们的算法对大约100个错误分类。开发集的第二个子集,称为黑盒开发集,将拥有剩余的4500年的例子。您可以使用Blackbox dev集自动计算分类器测量他们的错误率。您还可以使用它在算法中进行选择或优化hyperparameters。然而,你应该避免用你的眼睛看它。我们用这个词“黑盒”,因为我们将只使用这个子集的数据来获得“黑盒”的评估分类器。
为什么我们要显式地将开发集分为Eyball和BlackBox开发集?因为你会对于Eyball开发集中地实例要有一个直观地认识,你将开始过度适应Eyballdev更快。如果你看到眼球开发集上地性能有了更大地改进与黑盒开发集上地性能相比,您已经操过了眼球开发集。在这种情况下,你可以需要抛弃它,通过移动更多来找到一个新地眼球开发集,例子从黑盒开发集进入眼球开发集或获得新地标签数据。
显示的将开发集划分为Eyeball和Blackbox开发集,可以让您知道何时进行开发,您地手动错误分析过程会导致你过多匹配数据地眼球部分。

##18.Eyeball和黑盒地开发数据集比例占用应该有多大。

您的眼球开发集应该足够大,可以让您了解算法的主要功能错误的类别。如果你正在从事一项人类擅长的任务(比如识别猫),以下是一些粗略的指引:
&&1.一个眼球开发集,其中你的分类器犯10个错误将被认为是非常小。只有10个误差,很难准确估计不同误差的影响类别。但如果你没有足够的数据,也负担不起更多的关注开发集,这总比什么都没有好,它将有助于项目的优先级
&&2.如果你地分类器在眼球开发地列子中犯了大约20个错误,你将开始得到一个主要误差来源地粗略感觉。
&&3.有了~50个错误,您就可以很好地了解主要的错误源。
&&4.有了大约100个错误,您就会非常清楚错误的主要来源。我看到人们手工分析更多的错误——有时多达500个。没有只要你有足够的数据,这是有害的。假设你的分类器有5%的错误率。确保你有~100个错误分类的例子在Eyeball开发集中,Eyeball开发集必须有大约2000个例子(从那时起)0.05 * 2000 = 100)。分类器的错误率越低,您的眼球开发集就越大需要得到足够大的错误集来分析。
如果你正在从事一项连人类都做不好的工作,那么就进行检查眼球开发集没有那么有用,因为很难理解为什么会出现这种算法
没有正确分类一个例子。在这种情况下,您可能会忽略眼球开发集。我们将在后面的章节中讨论这些问题的指导方针。黑盒开发集怎么样?我们之前说过开发集大约在1000 - 10000例子很常见。为了改进这个声明,需要一个包含1,000-10,000个黑箱开发集
示例通常会提供足够的数据来优化超参数并在模型之间进行选择,尽管拥有更多的数据没有什么害处。黑盒开发集为100虽然很小,但仍然很有用。
如果您有一个小的开发集,那么您可能没有足够的数据来分割成Eyeball和都足够大以满足其目的的黑盒开发集。相反,是您的整个开发set可能必须用作眼球开发集,即。,您将手动检查所有dev设置数据。
在Eyeball和Blackbox开发集之间,我认为Eyeball开发集更重要(假设你正在处理一个人类可以很好地解决的问题,并进行了检验
这些例子可以帮助你获得洞察力)。如果您只有一个眼球开发集,那么您可以执行错误分析、模型选择和超参数调优都在这一集
如果只有一个引人注目的开发集,则过度拟合开发集的风险更大。如果您有足够的数据访问权限,那么眼球开发集的大小就可以确定主要是看你有多少例子可以手工分析。例如,我很少看到有人手动分析超过1000个错误。

Eyball 数据集最好100到1000万,BlackBOx,有100个有一点就行了

##19.基本误差的分析

&&1.当你开始一个新项目,尤其是在你不是专家的领域,很难正确猜测最有前途的方向。
&&2.所以不要一开始就试图设计和构建完美的系统。取而代之的是建造和训练一个尽可能快地建立基本的系统——也许在几天之内。然后用误差分析来帮助您识别最有前途的方向,并迭代改进您的算法。
&&3.通过手工检查~100个开发集实例对算法进行误差分析错误分类和计数的主要类别的错误。使用这些信息优先处理要修复的错误类型。
&&4.考虑将开发集拆分为一个眼球开发集,您将手动检查它,和一个黑盒开发集,您不会手动检查。如果眼球开发集比黑盒开发集要好得多,你已经超过了眼球开发并应考虑为其获取更多的数据。
&&5.眼球开发集应该足够大,以便你地算法分类错误能够有效地为你地分析提供服务,一个包含1000到10000个实例地BlackBox开发集就足够了,这针对所有地应用程序。
&&6. 如果您的开发集不够大,不能以这种方式分割,那么就将整个开发集作为一个眼球开发集用于手动错误分析、模型选择和超参数优化。

##20.偏差和误差(方差):是错误的两大来源

假设您地培训、开发、测试数据集都来自相同地分布,然后你应该经常尝试获得更多地训练数据,因为这只能提高效率,对吗?
尽管拥有更多地数据不会有什么坏处,但不幸地是,他的帮组并不总是那么大,你可能会希望,获取更多地数据可能是浪费时间地,那么,你好决定什么时候添加数据,什么时候不添加?ML学习有两个主要地误差来源,偏差和方差,理解他们将帮助您解决是否添加数据,已经改进其他地策略,最好地是你能很好地利用时间。
假设你希望构建一个有5%错误地cat识别器,现在你的训练组错误率为15%,开发集的错误率为16%,在本例中,添加训练数据可能不会有太大帮组,你应该关注其他的变化,事实上,添加更多的例子到你的训练集只会让你的算法更难做好训练集(我们将在后面的章节中解释为什么)如果你在训练集中的错误率是15%(85%的准确率),但是你的目标是5%的错误率(准确率95%)那么首先要解决的问题就是提高算法的性能,你的开发/测试集的性能通常比你的训练集差很多,如果你的算法算出的例子有85%的准确率,你的算法根本无法得到95%的准确率你的算法根本无法得到95%的准确率,假设如上所述,你的算法在开发集上有16%的错误(84%的准确率)16%的误差分为两个部分:
&&1.首先,算法在训练集上的错误率为15%。我们认为这就是算法的偏差
&&2.其次,算法在开发(或测试)集上的表现比训练集差多少。在这个例子中,它在开发集上的表现比培训集差1%,通俗地说就是算法的方差。
对学习算法的一些修改可以解决错误偏差的第一个组成部分,提高他在训练集的表现,一些改变解决了第二个问题,组件差异,并帮助他更好从培训集推广到开发/测试集。要选择最有希望的更改,理解7个更改中的哪一个非常有用这两个错误的组成部分更迫切需要解决。发展对偏差和方差的良好直觉将帮组你选择有效的变化你的算法。

##21.偏差和误差的例子

考虑我们的cat分类任务。一个“理想的”分类器(如人类)可能实现
几乎完美地完成了这项任务。
假设您的算法执行如下:
&&1.训练错误==1%
&&2.开发错误 == 11%
它有什么问题?应用上一章的定义,我们进行了估计偏差为1%,方差为10%(11%-1%=10%),因此,它具有高得方差,分类器得训练误差非常小,但不能推广到开发集,这导致了过度拟合。
现在想想看:
• Training error = 15%
• Dev error = 16%
我们估计偏差为15%,方差为1%,该分类器是对训练集得拟合很昭告,有15%得错误,但是他在开发集上得错误仅仅比训练错误高一点点。因此,该分类器具有较高得偏奇,但方差较低,我们说这个算法是underfitting。
现在想想看:
Training error = 15%
Dev error = 30%
我们估计偏差为15%,方差为15%,该分类器具有较高得偏向性和较高得鲁棒性,方差:她在训练集中表现不佳,因此具有较高得偏倚开发集上得性能更差,因此它也有很大得差异,过拟合/欠拟合术语在这里很难应用,因为分类器是同时过拟合和underfiting。
最后,考虑一下:
• Training error = 0.5%
• Dev error = 1%
该分类器具有低偏差、低方差的优点。祝贺你实现这个伟大的性能!

## 22.与最佳错误率的比较

在我们的cat识别示例中,“理想”的错误率——也就是说,通过一个“最优”的分类器是近0%。一个人看着一幅画就能认出它
几乎一直都有一只猫;因此,我们希望有一台机器也能做到这一点。其他问题则更加困难。例如,假设您正在构建语音识别
系统中,发现14%的音频剪辑有如此多的背景噪音或确实如此甚至一个人也听不懂说了什么。在这种情况下,甚至是最严重的
“最优”语音识别系统的误差可能在14%左右。假设在这个语音识别问题上,你的算法达到:
Training error = 15%
Dev error = 30%

训练集的性能已经接近14%的最佳错误率。因此,有在偏见或训练集表现方面没有多少改进的空间。
然而,该算法并没有很好地推广到开发集;因此有足够的空间改进由于误差引起的误差。
这个例子与前一章的第三个例子相似,也是a培训误差15%,开发误差30%。如果最优错误率为~0%,则进行训练
15%的误差还有很大的改进空间。这表明减少偏误的改变可能是富有成果的。但是,如果最佳错误率是14%,那么相同的训练集性能就能说明问题我们认为分类器的偏误几乎没有改进的空间。
对于最优错误率远远不是零的问题,这里有一个更详细的算法错误的分解。继续我们上面的语音识别例子,总的开发集错误为30%,可以分解如下(可以进行类似的分析)应用于测试集错误):
&&1.最佳错误率(“不可避免的偏差”):14%。假设我们决定世界上最好的语音系统,我们仍然会有14%的错误。我们可以想到
这是学习算法的“不可避免”的偏差。
&&2.可避免偏差:1%。这是作为训练误差和最佳错误率。
&&3.方差:15%。开发错误和训练错误之间的区别为了将这一点与我们以前的定义联系起来,偏差和可避免偏差的关系如下:
偏差=最佳错误率(“不可避免的偏差”)+可避免的偏差
“可避免偏差”反映了你的算法在训练集上的表现有多差而不是“最优分类器”。
方差的概念和以前一样。在理论上,我们总是可以减少通过对大量训练集的训练,方差接近于零。因此,所有的方差都是“可避免的”。
有了足够大的数据集,就不存在“不可避免的差异”了。再看一个例子,最佳错误率是14%,我们有:
Training error = 15%
Dev error = 16%

而在前一章我们称之为高偏差分类器,现在我们会这么说来自可避免偏差的误差为1%,来自方差的误差约为1%。因此,该算法
已经做得很好了,几乎没有改进的空间。它只比最优值差2%出错率。
从这些例子中我们可以看出,知道最佳错误率有助于指导我们的下一个步骤。在统计学中,最优错误率也称为贝叶斯错误率,或贝叶斯率。
我们如何知道最佳错误率是多少?对于人类相当擅长的任务at,例如识别图片或转录音频片段,您可以要求一个人提供
然后标签测量人体标签相对于你的训练集的准确性将给出最佳错误率的估计值。如果你正在处理一个即使是人类也很难解决的问题(例如,预测要推荐什么电影,或要投放什么广告)显示给用户)这可能是很难估计的最佳错误率。
在“与人类水平的性能比较(第33到35章)”一节中,我将进行讨论在更详细的过程中比较学习算法的性能与人的水平
的性能。
在前几章中,您学习了如何估计可避免/不可避免的偏差和通过观察培训和开发设置的错误率的差异。下一章将讨论你如何做
可以从这样的分析中获得见解,从而对减少偏见的技术进行优先排序。减少差异的技术。您应该应用非常不同的技术取决于您的项目当前的问题是高偏差(可避免)还是高偏差方差。继续读下去!

##23.处理偏差和误差

这是解决偏差和方差问题最简单的公式:
&&1.如果您具有高的可避免偏差,请增加模型的大小(例如,增加通过添加层/神经元来确定神经网络的大小)。
&&2.如果方差很大,则向训练集添加数据.

如果你能无限制地增加神经网络的大小和训练数据,它有可能在许多学习问题上做得很好。
在实践中,增加模型的大小最终会导致您遇到计算问题,因为训练非常大的模型是缓慢的。你也可能耗尽
你获得更多培训数据的能力。(即使在互联网上,也只有一个有限猫的照片数量!)
不同的模型体系结构—例如,不同的神经网络体系结构—将会对你的问题有不同程度的偏差/方差。最近有很多深度学习
研究开发了许多创新的模型架构。如果你使用神经系统网络,学术文献可以是一个伟大的灵感来源。还有很多github上很棒的开源实现。但是尝试新架构的结果是比增加模型大小和添加数据的简单公式更难预测。
增加模型大小通常可以减少偏差,但它也可能增加方差和过度拟合的风险。然而,这种过拟合问题通常只会在你不拟合的时候出现
使用正则化。如果你包括一个设计良好的正则化方法,那么你可以通常安全地增加模型的大小而不增加过拟合。
假设你正在应用深度学习,L2正规化或中途退学正则化参数,在开发集上表现最好。
通常你的表现会保持不变或有所提高;情况不太可能显著恶化。
避免使用更大模型的唯一原因是增加了计算成本。

##24.偏差和方差的权衡

你可能听说过“偏差与方差权衡”。“你能做的改变。
在大多数学习算法中,有一些算法可以减少偏差,但代价是增加方差,反之亦然。这就在偏差和方差之间创造了一个“平衡”。
例如,在神经网络中增加模型中添加的神经元/层的大小,或者添加输入特性——通常可以减少偏差,但可能增加方差。另外,
增加正则化一般会增加偏差,但会减少方差。
在现代,我们经常可以获得大量的数据,并且可以使用非常大的神经系统网络(深度学习)。因此,权衡少了,权衡多了
减少偏差而不损害方差的选项,反之亦然。
例如,通常可以增加神经网络的大小并优化正则化方法在不显著增加方差的情况下减少偏差。通过添加培训数据,您可以
通常也可以在不影响偏差的情况下减少方差。如果您选择了一个非常适合您的任务的模型架构,那么您也可以减少偏差
同时和方差。选择这样的体系结构可能很困难。
在接下来的几章中,我们将讨论解决偏见和方差。

##25 ?

##26 .训练集上的错误分析

你的算法必须在训练集上执行良好,然后你才能期望它在开发/测试集上发挥好的作用。
除了前面描述的解决高偏见的技术,我有时也会携带对训练数据进行错误分析,遵循与错误分析相似的协议在眼球开发,如果你的算法有很高的偏差,这可能是有用额,如果不合适的话训练进行得很顺利。
例如,假设您正在为一个应用程序构建一个语音识别系统,你收集了一组来自志愿者得训练音频剪辑。如果您得系统没有做好训练集,你可以考虑听一组100个例子得实例,该算法是在理解训练集错误得主要类别方面做的很差,类似于开发错误误差分析,可以对误差进行不同类别得统计。
在这个例子中,你可能会意识到你得算法在处理很多背景杂音得训练例子,因此,你可能会专注于技术,使其能够更好地适应背景噪音的训练实例。
你也可以在检查一下,一个人是否可能转录这些音频与您的学习算法具有相同的输入音频,如果有这么多背景噪音,这是任何人根本都听不懂说了什么,那么它可能是期望任何算法都能正确去识别这些话语,这根本是不合理的,我们将讨论在下一节中将您的算法与人类级性能进行比较的好处。

##27.减少方差的技术

如果你的学习算法存在高方差,你可以尝试一下方法:
&&1. 添加更多的训练数据:这是解决方差的最简单,最可靠额方法,只要你有机会获得显著更多的数据和足够的计算能力处理数据。
&&2.增加正则化:(L2正则化,L1正则化,dropout),该技术能减少方差但是会增加 Regularization technique.
&&3.即使停止训练,不让其进行训练了(即根据开发即集错误进行提前停止渐变下降):该技术减少了方差,但增加了偏差,提前停止的行为很想正则化方法,一些作者称之为正则化技术。
&&4.减少输入特征数量/类型的特征选择:该项技术可能有助于解决方差问题,但也可能增加偏差,减少数量稍微增加一些功能(比如从1000个功能增加到900个)不太可能产生巨大影响上的偏见。显著减少它(比如从1000个功能减少到100个,减少10倍)是不是更有可能产生微著得 效果,只要你不排除太多有用的特性。在现代深度学生中,当数据丰富得时候,就会出现一种背离共功能选择,我们现在更有可能给所有得功能,我们有算法,并让算法根据数据进行排序,但是当你的训练集很小,特性选择可能非常有用。
&&5.减少模型大小(如神经元/层数)该项方法要慎用:这方法可以减少方差,同时也可能增加偏差,然而我不希望推荐这种方法来处理差异,添加正则化通常会得到更好的分类性能,减小模型尺寸的优点是减小你的计算成本,从而加快你训练模型的速度。如果加快模型训练是有用的,然后通过各种方法考虑减少模型的大小但如果你的目标是减少方差,而你不关心计成本,考虑增加正则化来进行替代比较好。
这里有两个额外的战术,重复了上一章关于解决偏见:
根据错误分析的洞见修改输入特性:说出你的错误
分析激励您创建额外的特性,以帮助算法消除一个
错误的特定类别。这些新特性可以帮助消除偏差和方差。理论上,增加更多的特征可以增加方差;但如果你发现这是事实,
然后使用正则化,这通常会消除方差的增加。
修改模型结构(如神经网络结构),使之更加完善
适合您的问题:这种技术可以影响偏差和方差。

##28.诊断偏差和方差:学习曲线

我们已经看到了一些方法来估计多少错误可以归因于可避免的偏见,方差,我们通过估计最佳错误率和计算算法来实现训练集和开发集错误,让我们来讨论一种更有用的数据:绘制学习曲线。
学习曲线根据训练实例的数量绘制开发集错误,情节你可以使用不同的训练集大小来运行你的算法。例如,如果你有1000个例子,你可以在100,200,300,.... 1000上训练算法的不同副本的例子,然后,你可以绘制开发集错误如何随训练集大小而变化,这是一个例子:
随着训练集大小的增加,开发集的错误应该会减少。
我们通常会有一些“期望的错误率”,我们希望我们的学习算法会有
最终实现。例如:
&&1.如果我们希望获得人类水平的性能,那么人类错误率可能是“理想的”
错误率。”
&&2.如果我们的学习算法服务于某些产品(例如传送猫的图片),我们可能会
对于需要什么样的性能水平才能给用户带来良好的体验有一种直觉
体验。
&&3.如果您已经在一个重要的应用程序上工作了很长一段时间,那么您可能已经完成了直觉告诉你下一个阶段你可以合理地取得多大的进步季度/年。

——————在你的学习曲线中加入你想要的表现水平:
您可以直观地推断红色的“dev error”曲线,以猜测您可以离它有多近
通过添加更多数据达到期望的性能水平。在上面的例子中,它看起来
似乎双倍的训练集大小可以让你达到想要的效果的性能。
但是如果开发错误曲线已经“趋于平稳”(即变平),那么您可以立即判断
增加更多的数据不会让你达到你的目标:
因此,观察学习曲线可以帮助你避免花几个月的时间来收集两倍的培训数据,才意识到它没有帮助:
这个过程的一个缺点是,如果只查看开发错误曲线,可能很难做到这一点
如果你有更多的数据,准确地推断和预测红色曲线的走向。有一个可以帮助您估计添加更多数据的影响的附加图:训练错误。

##29.绘图训练错误

随着训练集大小的增加,开发集(测试集)错误应该会减少,但是你的训练集错误通常随着训练集大小的增加而增加。
让我们用一个例子来说明这种效果,假如你的训练集只有两个例子:
一个猫图像和一个非猫图像,这样便于算法的学习,记住,训练集中的两个例子,得到0%的训练集错误。即使这两个训练样本都标注错误,算法仍然容易记忆这两个标签。
现在假设你的训练集有100个例子,也许甚至有一些例子是这样的贴错标签,或者含糊不清——有些图像非常模糊,所以即使是人类也无法分辨是一只猫。也许学习算法仍然可以记忆大部分或全部的训练集,但是现在要达到100%的准确性是比较困难的,将训练集从2增加到100,例如,你会发现训练集的精度会略有下降。
最后,假设你的训练集有10000个实例,在这种情况下,它变得更加困难使算法能够完美地匹配所有10000个例子,特别是当一些例子是模糊地或贴错了标签,因此,你地学习算法在这个训练集上会做得更遭。让我们在前面地图中添加一个训练错误图:
可以看到,蓝色的“训练误差”曲线随着训练集的大小而增大。此外,您的算法通常在训练集上比在开发集上做得更好;因此红色的dev错误曲线通常严格位于蓝色的训练错误曲线之上。下面让我们讨论如何解释这些图。

##30.解读学习曲线:高偏差

假设您的开发错误曲线是这样的:
我们之前说过,如果您的开发错误曲线处于停滞状态,您就不太可能实现
仅通过添加数据即可获得所需的性能。但是很难确切地知道红色开发错误曲线的外推是什么样的。如果开发集很小,就更不确定了,因为曲线可能是有噪声的。
假设我们将训练误差曲线加到这个图中,得到:

学习笔记:Ng的深度书籍学习记录_第1张图片

-- 现在,您完全可以肯定,仅添加更多数据本身是不够的。为什么,是什么?记住我们的两个观察:
&&1.随着我们添加更多的训练数据,训练错误只会变得更糟。因此,蓝色训练
误差曲线只能保持不变或上升,因此它只能远离期望性能的(绿线)水平。
&&2.红色的dev错误曲线通常高于蓝色的训练错误。因此,几乎添加更多数据不会允许红色的dev错误曲线下降到当训练误差大于期望水平时,期望的性能水平
的性能。
-- 在同一块图上检查开发错误曲线和训练错误曲线都是可行的,更自信地推断开发错误曲线。
-- 为了便于讨论,假设期望的性能是我们对…的估计最佳的错误率。上面的图是一个标准的“教科书”例子,具有高可避免偏差的学习曲线看起来像:在最大的训练集大小——大概与我们所有的训练数据相对应——有一个很大的差距
在训练误差和期望表现之间,表明存在较大的可避免偏差。
此外,训练与开发曲线的差距较小,说明训练与开发曲线的差距较小
方差。
-- 以前,我们只在最右边测量训练和开发集错误,对应于使用所有可用的训练数据。绘制完整学习图曲线给我们一个更全面的图像,算法的性能在不同的
训练集的大小。

##31.解释学习曲线:其他案例

- 考虑这个学习曲线:

---------------------图 31-1

学习笔记:Ng的深度书籍学习记录_第2张图片

-- 这个图是高偏差,高方差,还是两者兼而有之?
-- 蓝色的训练误差曲线相对较低,红色的dev误差曲线要高得多
比蓝色的训练错误。因此,偏差很小,但是方差很大。添加更多的
训练数据可能有助于缩小开发错误和训练错误之间的差距。
-- 现在,考虑一下:
----------------------图 31-2

学习笔记:Ng的深度书籍学习记录_第3张图片
-- 这一次的训练误差很大,因为它远远高于期望的水平
的性能。开发错误也比培训错误大得多。因此,你有
显著偏差和显著方差。你必须找到一种方法来减少偏见和
算法中的方差。

##32.绘制学习曲线

-- 假设你有一个很小的包含100个例子的训练集。你用来训练你的算法随机选择子集10个例子,然后20个例子,然后30个,直到100个,增加以十为间隔的例数。然后使用这10个数据点来绘制学习曲线。您可能会发现曲线看起来有些嘈杂(这意味着这些值在较小的训练集大小下,比预期的高/低)。

-- 当你只对10个随机选择的例子进行训练时,你可能会很不幸地得到一个
特别是“糟糕”的训练集,例如有许多含糊不清/标记错误的例子。或者,
你可能会很幸运,得到一个特别“好的”训练集,意味着开发和训练误差可能会随机波动。
-- 如果您的机器学习应用程序严重偏向于一个类(例如cat)在分类任务中,消极例子的比例远远大于积极例子的比例,或者如果它有大量的类(例如识别100种不同的动物),那么选择一个特别“不具代表性”或糟糕的训练集的机会是
也更大。例如,如果80%的例子是负面的(y=0),并且只有20%为正样本(y=1),则有可能训练集为10个样本只包含了负面的例子,使得算法很难学习一些有意义的事情。
-- 如果训练曲线中的噪声使我们很难看到真实的趋势,那么有两种解决方案:
&&1.不要在10个例子中只培训一个模型,而是选择几个(比如3-10个),不同的随机选择的训练集10个例子,抽样与替换10,从你原来的100套。在每个模型上训练不同的模型,并计算训练和开发集错误的每个结果模型。计算并绘制平均值训练错误和平均开发集错误。
&&2.如果你的训练集偏向于一个类,或者它有很多类,那么选择一个“平衡”子集,而不是在100个训练样本中随机抽取10个,例如,你可以确定2/10的例子是积极的,8/10是消极的。更一般地,您可以确保来自每个类的示例的百分比为尽可能接近原始训练集中的整体分数。
-- 除非您已经尝试过绘图,否则我不会使用这两种技术,最后,绘制学习曲线可能在计算上很昂贵:例如,您可能会这样做要训练10个模型,1000个,然后2000个,一直到10000个。培训使用小数据集的模型要比使用大数据集的训练模型快得多。因此,不要像上面那样在线性范围内均匀地间隔训练集大小,您可以进行训练包含1,000、2,000、4,000、6,000和10,000个示例的模型。这仍然会得到一个对学习曲线的趋势有清晰的认识。当然,这种技术只有在以下情况下才有用训练所有附加模型的计算成本是巨大的。

##33.为什么我们要与人类水平的性能进行比较

-- 许多机器学习系统的目标是将人类擅长的事情自动化。例子
算法也有了很大的改进,我们现在已经超越了人类的水平
执行越来越多的这些任务。
-- 此外,如果您想做a,那么构建ML系统会更容易,这有几个原因人们能做好的任务:
&&1. 易于从人类标签获取数据。例如,自从人们认识到学习算法。
&&2.错误分析可以利用人的直觉。假设语音识别音频剪辑为“本食谱需要一个梨苹果,”误认为“配对”的“梨。“你可以利用人类的直觉,试着理解一个人用什么信息来获取正确的抄写,并利用这些知识修改学习算法。
&&3.利用人的性能来估计最优的错误率并进行设置达到2%的误差。然后我们知道最佳错误率是2%或更低可避免的偏差至少为8%。因此,您应该尝试减少偏差的技术。
-- 虽然第三项听起来不重要,但我发现有一个合理的和高可避免偏差是非常有价值的,它提供了一系列可以尝试的选项。
-- 有些任务甚至连人类都不擅长。例如,选择一本书向您推荐;或者选择一个广告在网站上展示给用户;或者预测股票市场。计算机在这些任务上的表现已经超过了大多数人。与这些应用,我们遇到了以下问题:
&&1. 获得标签比较困难。例如,人类标签很难标注一个
销售图书的应用程序,你可以通过向用户展示图书并查看它们来获取数据
购买。如果你不运营这样的网站,你需要找到更有创意的方法来获取数据。
&&2. 人类的直觉很难指望。例如,几乎没有人能做到,我猜,很难想出如何改进它。
&&3.要知道最佳错误率和合理期望错误率是很困难的,好。你怎么知道在没有人类基线的情况下它还能改进多少?

##34.如何定义人类水平的性能

-- 假设您正在开发一个自动生成的医学成像应用程序,一些基础训练在这个任务上达到了15%的错误。一个初级医生达到10%的错误。一个经验丰富的医生可以达到5%的误差。以及一个由医生组成的讨论和辩论小组每幅图像达到2%的误差。这些错误率中哪一个定义了“人类水平”性能”?
-- 在这种情况下,我将使用2%作为最优错误的人类级别性能代理率。您还可以将2%设置为所需的性能级别,因为所有这三个原因来自前一章用于比较人类水平的性能应用:
&&1.易于从人类标签获得标记数据。你可以找一组医生。
&&2.错误分析可以利用人的直觉。通过与一个团队讨论图片
&&3.利用人的性能来估计最优的错误率并进行设置最佳的错误率。最佳错误率甚至可能低于2%,但这是不可能的更高,因为一组医生有可能达到2%的误差。相反,它不是使用5%或10%作为最佳错误率的估计值是合理的,因为我们知道这些估计数字必然过高。
-- 当涉及到获取标记数据时,您可能不希望与an讨论每个图像医生给绝大多数病例打上标签,只把难治的病例交给有经验的人医生或医生团队。

-- 如果您的系统当前有40%的错误,那么是否使用一个并不重要
初级医生(10%的错误)或经验丰富的医生(5%的错误)标签您的数据和提供
直觉。但是如果您的系统已经有10%的错误,那么就定义人为级别
2%给了你更好的工具来持续改进你的系统

##35.超越人类的性能

-- 您正在研究语音识别,并拥有一个音频剪辑数据集。假设你的系统已达到8%的误差。你能使用文中描述的三种技术中的任何一种吗,第33章继续快速进步?

-- 如果您能够识别出一个数据子集,在其中人类显著地超过了您的系统,那么
您仍然可以使用这些技术来推动快速进展。例如,假设您的系统在嘈杂的声音中识别语音比人类好得多,但人类还是比人类好非常快速地翻译口语。

-- 对于快速语音数据子集:
1.您仍然可以从比您的算法质量更高的人那里获得转录本
2.你可以利用人类的直觉来理解为什么他们能很快地正确地听到声音
3.你可以使用人类水平的表现在快速口语作为一个理想的表现

-- 更一般地说,只要有开发人员设置的例子,其中人类是正确的,您的
即使在整个开发/测试集中平均,您的性能也已经超过了人类层面的表现。

-- 在许多重要的机器学习应用中,机器超越了人类水平的性能。例如,机器更善于预测电影的收视率、时长乘坐送货车去某地,或者是否批准贷款申请。只有一个一旦人们很难识别出那些算法显然是错的。因此,在问题上的进展通常较慢机器已经超越了人类水平的性能,而进步更快的时间是什么时候机器仍在努力追赶人类。

##36.当您应该在不同的发行版上进行培训和测试时

-- 你的猫咪图片应用程序的用户已经上传了10000张图片,这些都是你手动上传的从网上下载。如何定义培训/开发/测试集?

-- 因为这一万个用户图像紧密地反映了你的数据的实际概率分布如果想做得更好,可以将其用于开发和测试集。如果你在训练一个数据饥渴的深度学习算法,可能会给它额外的20万互联网图像进行训练。因此,您的培训和开发/测试集来自不同的概率分布。这对你的工作有什么影响?

-- 我们不需要将数据分区到train/dev/test集合中,而是可以将所有21万张图像都拍下来拥有,并将它们随机打乱到训练/开发/测试集中。在这种情况下,所有的数据都来了来自相同的分布。但我不推荐这种方法,因为205000/210000≈97.6%的dev /测试数据将来自互联网图像
不能反映您想要的实际分布。还记得我们关于选择开发/测试集的建议:

-------------选择dev和test集合来反映您希望在将来获得的数据

-- 大多数机器学习的学术文献假设训练集,开发集是稀缺的。我们通常只有一个数据集来自某个概率分布。所以我们会随机地将这些数据分成训练/开发/测试集,并假设所有的来自同一来源的数据通常是令人满意的。

-- 但是在大数据时代,我们现在可以使用庞大的训练集,比如cat internet
仍然想用它来学习,因为它可以提供很多信息。对于cat检测器示例,我们没有将所有10,000个用户上传的图像放入开发/测试集,我们可能会把5000个放进开发/测试集。我们可以把剩下的放上去5000个用户上传的例子到训练集中。这样,你的训练集就有205000个了,示例包含来自开发/测试发行版的一些数据
200000互联网图像。我们将在后面的章节中讨论为什么这种方法是有用的。

-- 让我们考虑第二个例子。假设您正在构建一个语音识别系统,为语音控制的移动地图/导航应用程序抄写街道地址,2万个用户使用街道地址的例子。但是你也有50万个例子,其他音频剪辑与用户谈论其他话题。你可能会举10000个例子开发/测试集的街道地址,并使用剩余的10,000,加上额外的50万个例子,用于培训。

-- 我们将继续假设您的开发数据和测试数据来自相同的地方分布。但是理解不同的培训和开发/测试是很重要的发行版提供了一些特殊的挑战。

##37.如何决定是否使用所有数据

-- 假设您的cat检测器的训练集包含10,000张用户上传的图像。这个数据
你关心的是做得好。您还可以下载另外20,000张图片互联网。你是否应该提供所有20,000+10,000=30,000张图片给你的学习算法作为它的训练集,或丢弃20,000个互联网图像,担心它会使您的学习算法?
-- 在使用早期的学习算法时(如手工设计的计算机)视觉特征,然后是一个简单的线性分类器)这是一个真正的风险,合并两者数据类型会导致性能下降。因此,一些工程师会警告你不要这样做包括2万张网络图片。

-- 但是在现代这个强大、灵活的学习算法的时代——比如大型神经系统网络——这种风险已经大大降低。如果你能负担得起建立一个神经网络足够多的隐藏单位/层,您可以安全地添加20,000张图像到您的训练集。添加图像更有可能提高你的表现。

-- 这个观察依赖于这样一个事实,即有一些x - > y映射是很好的这两种类型的数据。换句话说,有一些系统输入互联网图像或移动应用程序图像,并可靠地预测标签,甚至不知道图像的来源。

-- 新增的2万张图片效果如下:
&&1. 它给你的神经网络提供了更多关于猫的行为和不行为的例子。这是相似之处。你的神经网络可以应用一些从互联网上获得的知识图像到移动应用的图像。

&&2. 它迫使神经网络花费它的一些能力去学习那些性质,如果这些属性与移动应用程序的图像有很大的不同,那么它就会被设置为框架会“耗尽”一些神经网络的表征能力。因此有识别来自移动应用图像分发的数据的能力降低,这才是你真正关心的。理论上,这可能会损害算法的性能。

-- 为了用不同的术语来描述第二种效果,我们可以求助于虚构的人物空间。他说:“每增加一点知识,你就会忘记一些你知道的东西。之前,因此,最重要的是不要用毫无用处的事实来排挤有用的。

-- ”幸运的是,如果你有足够的计算能力来构建足够大的神经系统network-i.e。在美国,这是一个足够大的卫星,所以这不是一个严重的问题。你有足够的
能够同时从互联网和手机app图片中学习,不需要这两种类型数据争夺容量。你的算法的“大脑”足够大,你不需要担心阁楼空间不够用。

-- 但是如果你没有足够大的神经网络(或者其他高度灵活的学习方法),然后你应该更加注意你的训练数据是否与你的开发/测试匹配集分布。

-- 如果您认为您的数据没有任何好处,那么您应该忽略这些数据计算的原因。例如,假设您的开发/测试集主要是临时的人物、地点、地标、动物的照片。假设您还有一个很大的集合扫描历史文献:

--这些文件不包含任何类似于猫的东西。它们看起来也完全不同
因为从上面的第一个效应中得到的好处是可以忽略的——几乎没有你想要的
神经网络可以从这些数据中了解到它可以应用于开发/测试集分布。
的计算资源和表示能力的浪费神经网络。

##38.如何决定是否包含不一致的数据

-- 假设你想学习预测纽约市的房价。

-- 给定一个的大小纽约市的房价非常高。假设您有第二个数据集密歇根州底特律的房价要低得多。你应该把这些数据包括在你的训练集中?

-- 在相同面积x的情况下,房子y的价格会因房子所在位置的不同而有所不同
纽约或者底特律。如果你只关心预测纽约市房价,将这两个数据集放在一起会损害性能。在这种情况下,它会更好(省略前后矛盾的底特律数据),这个纽约vs底特律的例子和移动应用vs网络猫的例子有什么不同图像例子吗?

-- cat图像的例子不同,因为给定一个输入图像x,可以可靠地进行预测
标签y表示是否有猫,即使不知道图像是否是互联网图像或移动应用程序图像。即。,有一个函数f(x)从输入x可靠地映射对目标输出y,即使不知道x的原点,也要进行识别来自互联网的图像与来自手机app图像的识别任务“一致”。
这意味着包含所有的数据,以及一些可能的显著上行。相比之下,纽约和底特律,密歇根数据不一致。给定相同的x(房子的大小),价格是非常不同的这取决于房子在哪里。

##39.权重数据

-- 假设您有20万张来自互联网的图像和5000张来自移动设备的图像,建立一个巨大的神经网络,对所有205000张图片进行足够长的训练,没有试图使算法在网络图像和移动图像上都做得很好是有害的。

-- 但实际上,拥有40倍于移动应用程序图像的互联网图像可能意味着你与if相比,需要花费40倍(或更多)的计算资源来建模两者,你只训练了5000张图片。

-- 如果你没有巨大的计算资源,你可以给互联网图像很多降低体重是一种妥协。

-- 例如,假设优化目标是平方误差(这不是一个好的选择),对于一个分类任务,但它会简化我们的解释。因此,我们的学习算法
试图优化:
------------------------------- 39-1 图

学习笔记:Ng的深度书籍学习记录_第4张图片
上面的第一个和是超过5000个移动图像,第二个和是超过B:
--------------------------------39-1 图

学习笔记:Ng的深度书籍学习记录_第5张图片

-- 如果设 B=1/40,该算法将为5000幅移动图像赋予同等的权重和200000互联网图像。你也可以设置参数?其他值,也许通过调优dev集。

-- 通过减少额外的互联网图片的权重,你不需要建立一个庞大的神经系统确保算法在这两种类型的任务上都做得很好。这种类型的只有当您怀疑额外的数据(Internet图像)有a时,才需要重新加权与开发/测试集或其他数据远远大于来自与开发/测试集(移动图像)相同分布的数据。

##40.从训练集推广到开发集

-- 假设您在培训和开发/测试发行版的环境中应用ML是不同的。例如,训练集包含互联网图像+移动图像开发/测试集只包含移动映像。然而,这个算法并没有很好地工作:它工作了一个比您希望的更高的开发/测试集错误。这里有一些可能性可能是错的:
&&1. 它在训练集中表现不佳。这是一个高(可避免的)偏见的问题训练集的分布。
&&2.它在训练集中表现良好,但不能很好地推广到以前未见过的数据与训练集来自相同的分布,这是高方差。
&&3.它很好地推广了来自与训练集相同分布的新数据,但是,而不是从开发/测试集分布中获取的数据。我们称之为问题数据不匹配,因为训练集数据与开发/测试集不匹配数据。

-- 例如,假设人类在猫的识别方面取得了近乎完美的表现的任务。你的算法做到了这一点:
&&1. 训练集出错1%
&&2.与该算法的训练集来自相同分布的数据的误差为1.5%还没有看到
&&3.开发集上10%的错误

-- 在这种情况下,显然存在数据不匹配问题。要解决这个问题,您可以尝试
使培训数据更类似于开发/测试数据。我们讨论一些技术这之后。
--你现在有四组数据:
&&1.训练集。这是算法要学习的数据(例如,Internet images +)移动图像)。这个分布不一定和我们的分布相同真正关心的是(开发/测试集分布)。

&&2.训练开发集:该数据来源于与训练集相同的分布(例如,互联网图像+移动图像)。这通常小于训练集;它只需要足够大来评估和跟踪我们的学习算法的进度

&&3.开发集:这是从与测试集相同的发行版中提取的,它反映了我们最终关心的数据分布。(例如,移动图像。)

&&4.测试集:与开发集来自相同的发行版(例如,移动图像)。

-- 有了这四个独立的数据集,您现在就可以求值了:

&&1.训练误差,通过对训练集的评价

&&2.该算法能够推广到训练集分布中提取的新数据,通过对培训开发集的评估。

&&3.算法在您关心的任务上的性能,通过在开发和/或上进行评估测试集。

-- 选择开发集大小的第5-7章中的大多数指导原则也适用于培训开发集。

##41.识别偏差、方差和数据不匹配错误

-- 假设人类达到近乎完美的性能(≈0%错误)猫检测任务,因此,最佳错误率约为0%。假设你有:
&&1.训练集有1%的误差。
&&2.培训开发集出错5%
&&3.开发集错误5%。
-- 这告诉你什么?这里方差很大。方差减少前面描述的技术应该可以让您取得进展。
-- 现在,假设你的算法达到:
&&1. 训练集中10%的错误
&&2.培训开发集出错11%。
&&3.开发集上有12%的错误

-- 这说明你在训练集中有很高的可避免偏差,算法为在训练集中表现不佳。偏见减少技术应该会有所帮助。在上面的两个例子中,算法只遭受了高可避免偏差或高方差。一个算法有可能遭受任何高可避免偏差的子集,高方差和数据不匹配。例如:
&&1.训练集中10%的错误。
&&2.培训开发集错误11%
&&3.开发集上20%的错误
-- 该算法具有较高的可避免偏差和数据不匹配。它不但是,训练集分布的方差较大。可能更容易理解不同类型的错误是如何相互关联的将它们作为表中的条目绘制:
--------------------图 41-1

学习笔记:Ng的深度书籍学习记录_第6张图片
-- 继续以cat图像检测器为例,您可以看到有两个数据在x轴上的不同分布。在y轴上,我们有三种类型的误差:人为级错误,算法训练的实例错误,实例错误
该算法没有经过训练。我们可以用不同类型的错误填充框中内容。

-- 如果您愿意,您也可以填写表格中剩下的两个框,右上角的方框(在移动图像上的人类水平的性能)要求一些人类,标记您的移动cat图像数据并测量它们的错误。你可以顺便填下一个方框获取移动cat图像(分布B),并将一小部分用于训练
这样神经网络也能在上面学习。然后测量学习模型的误差在那个数据子集上。填写这两个额外的条目有时可能会得到额外的信息了解算法在两个不同的分布(分布A上的作用和分布B上的作用)数据。

-- 通过了解算法最容易出现哪种类型的错误,您将变得更好决定是否专注于减少偏差、减少差异或减少数据不匹配。

##42.解决数据不匹配

-- 假设您开发了一个语音识别系统,该系统在训练中表现得非常好,但是,它在您的开发集中表现得很差: 您有一个数据不匹配的问题,你会做什么?

-- 我建议您:(I)尽量了解数据的哪些属性,在培训和开发集发行版。(二)努力寻找更多更匹配的培训数据,让开发人员给出了算法有问题的示例。

-- 例如,假设您对语音识别开发集执行了一个错误分析:您手动浏览100个示例,并尝试理解算法的作用错误。您会发现您的系统性能很差,因为开发人员中的大多数音频剪辑集合是在一辆车里拍摄的,而大多数的训练例子是根据一个记录的安静的背景。发动机和道路噪音大大降低了您的性能语音系统。在这种情况下,您可以尝试获取包含音频的更多培训数据在车上拍摄的片段。误差分析的目的是为了理解培训和开发集之间的显著差异是导致数据的原因不匹配。

-- 如果您的培训和培训开发集包括录制在汽车内的音频,您也应该这样做,在此数据子集上仔细检查系统的性能。如果它在车上运行良好,在训练集中的数据,而不是在训练开发集中的car数据,然后这进一步验证,获得更多汽车数据,将会有所帮助的假设。这就是为什么我们讨论,在你的训练集中包括一些来自相同分布的数据的可能性,您在上一章中的开发/测试集

-- 这样做可以让你比较自己的表现,关于训练集中的car数据与开发/测试集中的car数据,不幸的是,在这个过程中没有保证。例如,如果你没有,要获得更多更好地匹配开发集数据的培训数据,您可能没有一个清晰的方法提高性能的途径。

##43.人工合成数据

-- 你的语音系统需要更多的数据,这些数据听起来好像是从车里取出来的。而与开车时收集大量数据相比,可能有一种更简单的方法来获取这些数据数据:人工合成。
-- 假设您获得了大量汽车/道路噪声音频剪辑。你可以下载来自几个网站的数据。假设你有一个很大的培训团队,他们都在说一门语言在安静的房间。如果你把一个人讲话的音频剪辑“添加”到音频剪辑中关于汽车/道路噪音,你会得到一段声音片段,听起来好像那个人在说话嘈杂的车。使用这个过程,您可以“合成”大量听起来像它的数据被收集在一辆车里。

-- 更一般地说,在一些情况下,人工数据合成允许您这样做,创建一个与开发集合理匹配的大型数据集,第二个例子。你注意到开发集的图像有更多的运动模糊,因为他们通常是手机用户在使用手机时轻微移动手机图片。您可以从网络图像的训练集中获取非模糊图像,并添加对它们模拟运动模糊,从而使它们更类似于开发集。

-- 请记住,人工数据合成也有它的挑战:它有时更容易创建合成数据在人看来是真实的,而创建数据在人看来是真实的一台电脑。例如,假设您有1000个小时的语音训练数据,但仅限于此1小时的汽车噪音。如果你重复使用相同的1小时的汽车噪音与不同的部分从最初的1000小时的训练数据,您将得到一个合成的数据集,同样的汽车噪音一遍又一遍地重复。而一个人听这个音频可能
不能说所有的汽车噪音对我们大多数人来说都是一样的吗,学习算法会“过度适应”1小时的汽车噪音。因此,它可能难以推广在一个新的音频剪辑中,汽车的噪音碰巧听起来不一样。

-- 或者,假设你有1000小时独特的汽车噪音,但是所有的噪音都来自只有10辆不同的车。在这种情况下,算法可能会对这10辆车进行“过拟合”,如果测试的音频来自不同的汽车,表现很差。不幸的是,这些问题很难发现。

-- 再举一个例子,假设您正在构建一个计算机视觉识别系统汽车,假设您与一家拥有计算机图形的视频游戏公司合作几种汽车的型号。为了训练你的算法,你使用模型来生成合成汽车的图片。即使合成的图像看起来非常逼真,这种方法(已经由许多人独立提出)可能不会很好地工作。视频游戏,在整个游戏中可能有20辆车的设计。制造一辆3D汽车是非常昂贵的汽车模型;如果你在玩游戏,你可能不会注意到你在看同样的车一辆又一辆,也许只是油漆不同。即,这个数据看起来非常现实的你。但是和路上所有的车相比——因此你是谁很可能在开发/测试集中看到——这20辆合成车只捕获了极小的一部分世界汽车销售的一小部分。因此,如果您的100,000个训练示例全部出现从这20辆车,你的系统将“超适合”这20个具体的汽车设计,它将失败推广到包括其他汽车设计在内的开发/测试集。

-- 在合成数据时,要考虑一下你是否真的在合成一个典型的例子。尽量避免给合成的数据属性使得学习算法能够区分合成和非合成例如,如果所有的合成数据来自20种汽车设计中的一种,或者所有的合成音频仅来自1小时的汽车噪音。这个建议可能很难遵循。在进行数据合成时,我的团队有时要花费数周的时间才能完成具有足够接近合成数据的实际分布的详细信息的数据有显著的效果。但是如果你能得到正确的细节,你可以突然访问一个比以前更大的训练集。

##44.优化验证试验

-- 假设你正字构建一个语音识别系统,你的系统通过输入一个剪切的音频数据A和计算一些积分(S)来应对每种有可能的输出句子,例如,你可以试着估计分数 S=P(S|A),正确的概率输出转录是句子S,假设输入的音频是A,给出了一种计算分数的方法,你仍然需要找到,that的英语句子的最大化:
------------------------ output= arg max Score(S)
-- 如何计算上面的arg max ?,如果英语有50000个单词,那么有(50000)右上角n个 可能的句子,长度为N-太多了,无法一一举例,所以,你需要应用一个近视搜索算法,试着找到S的值,优化ScoreA(最大化),搜索算法的一个列子是“约束搜索”,在搜索过程中保留k个最佳候选人,(为了这一章的目的,你不需要了解beam搜索的细节)这样的算法是没有保证的,求使分数最大化的S的值

--假设一段音频记录了某人说“我喜欢机器学习”,而是在输出正确的转录是,系统输出的却是我爱机器人,现在出现问题的可能性有两种:

&&1. 搜索算法问题。近似搜索算法(波束搜索)失败,求使分数最大化的S的值.
&&2. 我们对分数的估计不准确的,特别是我们对分数 S=P(S|A),,没有认识到“我爱机器”,正确的说法是“学习”。

-- 如果问题出现在第2点上,那么你应该使用估计分数的学习算法。

-- 但是,除非您知道这些错误的根本原因,否则您的努力可能是浪费了。如何更系统地决定要做什么?

--让 S输出 作为 ,我爱机器人,让S 称为正确的转录(我爱机器学习),为了理解上面的第一条还是第二条问题所在,你可以进行优化验证测试:
首先计算 分数A(S
)和分数A(S输出),然后检查是否有分数(S)》分数(S输出),有两种可能性:
-- 案例1: 分数(S
)》 分数 (S输出)

-- 在这种情况下,你的学习算法正确的给了S 比S输出更高的分数,然而,我们的近视搜索算法选择的是S输出不是S,这告诉你你的近视搜索算法没有选择最大化的S值,在这种情况下,优化验证测试告诉您进行了搜索算法问题应该重点关注,例如,你可以试着增加光束波束搜索宽度。

--案例2: 分数(S) <= 分数 (S输出)
-- 在这种情况下,你知道你计算分数的方法,错误在于,他没有给与严格来说,正确输出的分数要比错误输出得分数搞,优化验证测试告诉你你有一个目标(得分)功能问题,因此,你应该专注于提高你得学习方法还是近视分数,表示不同得句子。
-- 我们得讨论集中在一个列子上,应用优化验证实验实践上,你应该检查开发集中得错误,对于每个错误,你都要进行测试,是否 分数A(S
)》 分数A(S输出)这个不等式所包含得每个开发实例都将得到标记为优化算法引起得错误,每个这样做得列子不持有分数S*《=Score S输出,因为你得行为,别人会认为你是个错误。计算分数A。
-- 列如,假设你发现95%得错误是由得分函数造成得分数A,由于优化算法,只有5%,现在你知道无论如何只要改进优化过程,就可以实践地消除大约5%,我们的错误,因此,你应该专注于改进你评估分数的方法。

##45.优化验证试验的一般形式

-- 在给定输入x的情况下,您可以应用优化验证测试计算Scorex(y),它表示y对输入x的响应有多好是否使用近似算法来求arg maxy Scorex(y),但怀疑搜索算法有时不能找到最大值。在我们之前的演讲中 识别示例,x=A为音频片段,y=S为输出文本。

-- 假设y是“正确的”输出,但算法输出的是y 输出,那么关键的测试是测量Scorex(y) >是否为Scorex(y out)。如果这种不平等持续下去,我们就会责怪
错误的优化算法。请参阅前一章,以确定您是否正确理解这背后的逻辑。否则,我们归咎于Scorex(y)的计算。让我们再看一个例子。假设您正在构建一个汉语到英语的机器翻译系统。您的系统通过输入中文句子C和计算来工作
一些ScoreC(E)对于每一个可能的翻译E,例如,您可以使用Score c
(E)=P(E|C),在输入句子为C的条件下,平移得到E的概率,你的算法通过计算来翻译句子:
------------------------ output = arg max score (E)

-- 然而,所有可能的英语句子E的集合太大了,所以你依赖于启发式搜索算法。

-- 假设您的算法输出了错误的翻译E out 而不是一些正确的E,然后优化验证测试将要求您计算是否 分数c (E)》分数c(E输出) ,如果这个不等式成立,那么分数c(.) 正式列表E*,作为E out的优越输出,因此,你可以将此错误归因于近视搜索算法,否则,将此错误归因于ScoreC(.)的计算.

--在人工智能中,首先学习近似计分函数是一种非常常见的“设计模式”,然后使用近似最大化算法。如果你能发现这个模式,您将能够使用优化验证测试来理解源代码的错误。

##46.强化学习的例子

-- 假设您正在使用机器学习来教直升机进行复杂的飞行操作,这是一架电脑控制的直升机执行着陆的延时照片引擎关闭。

-- 这就是所谓的“自旋”机动。它允许直升机降落,即使他们的引擎意外失败。作为训练的一部分,人类飞行员练习这个动作。你的目标是用学习算法让直升机在安全的飞行轨迹T中飞行,然后安全着陆。

--为了应用强化学习,你必须开发一个奖励函数R,测量每个可能的轨迹T有多少,例如,如果T导致,直升机坠毁,那么奖励可能是R(t)=-100 ,一个巨大的负奖励,一个导致安全着陆的轨迹T可能会导致准备值为正的R(t),这取决于着陆有多平稳,奖励函数R,通常由手来量化不同的轨迹有多理想。它必须权衡道路的颠簸程度,降落是,直升机是否准确降落在想要降落的地点,飞行有多艰难下来等等,设计好的奖励是非常不容易的。

  • -给定奖励函数R(T),强化学习算法的工作是控制使直升机达到最大飞行高度
    R(T),然而,强化学习算法,做许多近似,可能无法达到这个最大化。

-- 假设您选择了一些奖励R(.)并运行了您的学习算法,然而,它的性能看起来比你的人类飞行员差得多——着陆更加颠簸,看起来不像人类飞行员那样安全,你怎么知道是什么毛病,强化学习算法,它试图实现一个轨迹,maxT R(T)——或者如果错误是由于奖励函数引起的——试着去测量,指定理想的平衡之间的骑颠簸和降落点的准确性?

-- 应用优化验证试验,让T human 的轨迹人工引航,和 T out 作为算法实现的轨迹,根据我们的上面描述,T human 是一个更好于T out 的,因此,关键测试如下:R(Thuman) > R(Tout)成立吗?

-- 情况1:如果这个不等式成立,那么奖励函数R(.)正确地将T human评级为优于 T out ,但是我们的强化学习算法是寻找较差的 T out,说明改进我们的强化学习算法是值得的。

-- 情况2 :不平等并不持有:R(T human)≤ R( T out),这个意味着R,赋值更差,得分给了土曼,尽管这是一个更好的轨迹。你应该努力把R(.),提高到更好地捕捉与良好着陆相对应地权衡。

-- 许多机器学习应用程序都有这种优化近似的“模式”,评分函数Scorex(.)采用近似搜索算法,有时候,没有指定的输入x,因此这可以简化为Score(.),在上面的示例中,是计分函数,是否奖励函数得分(T)=R(T),优化算法为强化学习算法试图执行一个好的轨迹T。这个例子与前面的例子的一个区别是,它没有与an进行比较,“最优”输出,你是在与人类水平的性能进行比较,我们假定
T human 是相当好的,即使不是最优的。一般来说,只要有y*(这个例子,T human)这是一个优越地输出,以表示您目前地学习,即使它不是最优地输出,优化验证测试也可以说明改进优化算法和评分那个更有前途地函数。

##47.端到端学习的兴起

-- 假设您希望构建一个系统来检查在线产品评论并自动告知,如果作者喜欢或不喜欢那个产品,你就告诉他,例如,你希望认识以下评价高度肯定:

-----------------------------------------这拖把真棒!
以下是非常消极的:
-----------------------------------------这拖把质量很差,我后悔买了它。
-- 识别积极意见和消极意见的问题被称为“情绪分类”,要构建这个系统,可以构建一个由两个组件组成的“管道”:
&&1.解析器:用标识最多的信息对文本进行注释的系统重要的单词,例如,您可以使用解析器来标记所有形容词和名词,因此,你将得到以下带注释的文本:
This is a great Adjective mop Noun!

&&2.情绪分类器:一种以带注释的文本和为输入的学习算法预测整体情绪,解析器的注释可以帮助这种学习算法大大:通过给形容词一个更高的权重,你的算法将能够快速记住重要的单词,比如“很棒”,忽略不那么重要的像“这个”这样的词。

我们可以将您的两个组件的“流水线”可视化如下:

------------------------------- 图47-1

学习笔记:Ng的深度书籍学习记录_第7张图片
最近有一种趋势是用单一的学习方法代替管道系统算法。该任务的端到端学习算法将简单地作为输入原始文本“这是一个伟大的拖把!”,并试着直接识别这种情绪:
------------------------------图 47-2

学习笔记:Ng的深度书籍学习记录_第8张图片
神经网络是端到端学习系统中常用的一种学习方法。“端到端”一词是指我们要求学习算法直接从输入到期望的输出。即,该学习算法直接连接的“输入端”的系统到“输出端”。在数据丰富的问题中,端到端系统非常成功。但它们并不总是一个好的选择。下面几章将给出更多的例子端到端系统,并就何时应该和不应该使用它们给出建议.

##48.更多端到端学习示例

-- 假设你想建立一个语音识别系统。你可以用三个来构建一个系统组件:
--------------------------------------图48-1


--组件的工作原理如下:
&&1.计算特征: 提取手工设计的特征,如MFCC (Mel-frequency)倒谱系数(倒谱系数)特征,它试图捕捉话语的内容,忽略不太相关的属性,比如演讲者的音调。
&&2.音素识别器:一些语言学家认为有基本的语音单位叫,“音素“,例如,“keep”中的第一个“k”音和“c”音是同一个音素,声音”蛋糕,这个系统试图识别音频片段中的音素。
&&3.最终识别器:取已识别的音素序列,试着将它们串起来一起形成输出文本。

--相反,端到端系统可能会输入音频剪辑,并尝试直接输出记录:
------------------------------------图48-2


-- 到目前为止,我们只描述了完全线性的机器学习“管道”:输出按顺序从一个阶段传递到下一个阶段,该管道可能更加复杂,例如,下面是一个简单的自动驾驶汽车的架构:
----------------------------------图 48-3

学习笔记:Ng的深度书籍学习记录_第9张图片
-- 它有三个组成部分:一是利用摄像头图像检测其他车辆,一个检测行人,然后,最后一个组件为我们自己的汽车规划一条路径,避免汽车和行人。

-- 并不是管道中的每个组件都需要学习,例如,关于“机器人”的文献,运动规划“有许多算法的最后路径规划步骤的汽车,许多其中的算法不涉及学习。
-- 与此相反,端到端方法可能尝试直接接收传感器输入输出转向方向:
——————————图 48-4


-- 尽管端到端学习已经取得了许多成功,但并不总是最好的的方法,
例如,端到端语音识别工作良好,但我对此表示怀疑端到端的自主驾驶学习,接下来的几章解释了原因。

##49.端到端学习的优缺点

考虑我们前面例子中的相同的语音管道:
------------------------------- 48-1 图


&& 1. 这条管道的许多部分是“手工设计的”:
MFCCs是一套手工设计的音频功能,虽然他们提供了一个合理的,对音频输入的总结,它们也通过抛出一些来简化输入信号信息。
&&2. 音素是语言学家的发明。它们并不能完美地表达语言的声音。从某种程度上说,音素是对现实的一种拙劣的近似,使用音素表示的算法将限制语音系统的性能。
-- 这些手工设计的组件限制了语音系统的潜在性能。然而,允许手工设计的组件也有一些优点:
&&1. MFCC特性对不影响内容的语音特性具有鲁棒性,比如音高。因此,它们有助于简化学习算法的问题。
&&2.音素在某种程度上是语音的合理表示,它们也能有所帮助,该学习算法能够理解基本的声音成分,从而对其进行改进的性能。
-- 拥有更多手工设计的组件通常可以让语音系统学习更少的数据。MFCCs和音素捕捉到的手工工程知识补充我们的算法从数据中获得的知识。当我们没有很多的时候数据,这个知识是有用的。
-- 现在,考虑端到端系统:
————————————48-2 图


-- 该系统缺乏手工设计的知识,因此,当训练集很小时,它可能比手工设计的管道做得更糟。

-- 但是,当训练集很大时,它就不会受到其任何的限制,MFCC或基于音素的表示。如果学习算法是足够大的神经网络,如果它被训练有足够的训练数据,它有潜力做得很好,和甚至可能接近最佳错误率。

-- 端到端学习系统往往在有很多标记为“两者”的数据时表现良好输入端和输出端,在这个例子中,我们需要一个大的数据集(音频、文字记录)对,当这种类型的数据不可用时,采用端到端方法学习要非常谨慎,如果你研究的是一个机器学习问题训练集非常小,你的算法的知识必须来自你的人类洞察力。即,从你的
“手工程”组件。

-- 如果您选择不使用端到端系统,则必须决定其中的步骤,你的管道,以及它们应该如何连接,在接下来的几章中,我们将给出一些设计此类管道的建议。

##50.选择管道组件:数据可用性

-- 当构建一个non-end-to-end管道系统,适合使用管道的组件?如何设计管道将大大影响整个系统的性能。一个重要的因素是你是否可以很容易地收集数据来训练的每个组件。
-- 例如,考虑这种自主驾驶架构:
-----------------------------图48-3

学习笔记:Ng的深度书籍学习记录_第10张图片
-- 您可以使用机器学习来检测汽车和行人。此外,不难获得数据对这些:有许多计算机视觉与大量的标记数据集汽车和行人。你也可以用众包(如亚马逊土耳其机器人)来获取更大的数据集。因此相对容易获得训练数据构建一个汽车检测器和一个行人检测器。
-- 相比之下,考虑纯粹的端到端方法:
-----------------------------图48-4


-- 培训这个系统,我们需要一个大的数据集(图像、转向方向)对。这是非常耗时和昂贵的人们开车和记录他们的指导方向收集这些数据。需要舰队specially-instrumented汽车,大量的开车去涵盖范围广泛的可能的场景。这使得一个端到端的系统困难的训练。这是更容易获得大量数据集的标签汽车或行人图像。

-- 更一般地,如果有大量的数据用于训练“中间模块”的管道(如汽车探测器或行人检测器),那么你可能会考虑使用多个阶段的管道。这种结构可以是优越的,因为你可以使用所有可用的数据训练中间模块。直到更多的端到端数据可用,我相信non-end-to-end方法明显更有前途的自主驾驶:其架构更好的匹配数据的可用性。

##51.选择管道组件:任务简单

-- 数据可用性以外,你还应该考虑的第二个因素在选择组件时管道:如何简单的单个组件的任务解决的?你应该尽量选择管道组件单独容易构建或学习。但为一个组件是什么意思“简单”的学习?
-- 考虑这些机器学习任务,越来越难的顺序列出:
&&1.分类图像是否曝光过度(就像上面的例子)
&&2.分类图像是否采取室内或室外
&&3.分类图片是否包含一只猫
&&4.分类图片是否包含猫与黑色和白色的皮毛
&&5.分类图片是否包含一个Siamese cat(特定品种的猫)
-- 这些是一个二进制图像分类任务:你必须输入一个图像,和输出0或1。但前面的任务列表中似乎更“方便”神经网络学习。你可以用更少的培训学习任务越容易的例子。
-- 机器学习还没有一个好的的正式定义任务容易或困难。与深度学习和多层神经网络的兴起,我们有时说一个任务是“简单”如果它可以用更少的计算步骤进行(对应于一个浅神经网络),和“硬”如果它需要更多的计算步骤(需要更深层次的神经网络)。但这些非正式的定义.
-- 如果你能把一项复杂的任务,并将其分解为更简单的子任务,然后通过编码的子任务明确的步骤,你给算法先验知识,可以帮助学习任务更有效率。
--假设您正在构建一个暹罗猫探测器。这是纯粹的端到端体系结构:
----------------------51-1图

学习笔记:Ng的深度书籍学习记录_第11张图片
--相比之下,或者可以使用管道有两个步骤:
----------------------51-2图


--第一步(猫探测器)检测所有的猫的形象。
---------------------51-3图


-- 第二步然后通过裁剪图像每个检测到的猫(一次),一只猫物种分类器,最后输出1如果任何猫发现是一只暹罗猫。
----------------------51-4图

学习笔记:Ng的深度书籍学习记录_第12张图片
-- 比训练一个纯粹的端到端分类器只使用标签0/1,每两个组件的管道——猫探测器和猫品种分类器——似乎更容易学习和需要更少的数据。
--作为最后一个例子,让我们回顾一下自主驾驶管道。
----------------------48-3图

学习笔记:Ng的深度书籍学习记录_第13张图片
-- 通过使用这个管道,你告诉驾驶算法有三个关键步骤:(1)检测其他车辆,(2)检测行人,和(3)计划为你的车。进一步,这些是一个相对简单的功能,因此可以学会用更少的数据——比纯粹的端到端方法。

-- 总之,在决定什么应该管道的组成部分,试图构建一个管道,其中每个组件是一个相对“简单”的函数,因此可以从只有少量的数据。

##52.直接学习丰富输出

-- 一个图像分类算法将输入图像x,和输出一个整数表示的对象类别。可以一种算法,而不是输出一个完整的句子描述图片?
-- 例如:
-----------------------52-1图

学习笔记:Ng的深度书籍学习记录_第14张图片
-- 传统的监督学习学到了应用程序函数h:X→Y,Y的输出通常是一个整数或实数。
--例如:
-----------------------52-2图

学习笔记:Ng的深度书籍学习记录_第15张图片
--端到端深度学习的一个最令人兴奋的发展是直接让我们学习y比许多复杂得多。在上面的image-captioning例子中,你可以有一个神经网络输入图像(x)和直接输出标题(y)。
-----------------------52-3图


-- 这是一个加速的趋势深度学习:当你有合适的(输入、输出)标记对,你有时可以学习的端到端即使输出是一个句子,一个图像,音频,或者其他更丰富的比一个数字输出。

##53.零件误差分析

--假设您的系统使用一个复杂的机器学习管道,和你想要提高系统的性能。管道的哪个部分你应该工作在提高吗?将错误归咎于特定部分的管道,你可以决定如何优化你的工作。让
-- 我们用我们的暹罗猫分类器的例子:
----------------------51-2图

学习笔记:Ng的深度书籍学习记录_第16张图片
-- 第一部分,猫检测器,检测猫和作物的形象。第二部分,猫品种分类,决定如果是暹罗猫。可以花几年致力于改善这两个管道组件。你如何决定哪些组件(s)关注吗?通过进行误差分析部分,你可以尝试属性每个错误算法使一个(有时)两部分的管道。

--例如,该算法分类这形象不包含一个暹罗猫(y = 0)即使正确的标签是y = 1。
----------------------53-1图


--让我们手动检查算法的两个步骤。假设暹罗猫探测器探测到一只猫如下:
----------------------53-1图


-- 这意味着猫品种分类器给出如下图:
----------------------53-1图 石头

-- 猫的品种分类器然后正确分类不包含一只暹罗猫的形象。因此,猫品种分类器是清白的:它是一堆岩石和输出一个非常合理的标签y = 0。事实上,人类分类出现上图也会预测y = 0。因此,您可以清楚地认为这个错误猫探测器。另一方面,如果猫探测器输出以下边界框:
----------------------53-1图 红框猫
--你就会得出这样的结论:猫探测器做了它的工作,这是猫的品种分类器这是错误的。
-- 说你去到100年更进一步的开发设置图片和发现90的错误是由于猫探测器,而只有10错误是由于猫品种分类器。您可以安全地得出结论,你应该更多的关注关注改善猫探测器。
--进一步,你现在还方便地找到了90例子猫探测器输出不正确的边界框。您可以使用这些90例进行更深层次的错误分析猫探测器看到如何改进。
-- 我们描述的属性错误的一部分管道已经非正式的:你看看每个部分的输出,看看你可以决定哪一个犯了一个错误。这种非正式的方法可能是你所需要的。但在下一章中,您还将看到一个更加正式的归因错误的方法

##54.把错误归咎于一部分

-- 让我们继续使用这个例子:
---------------------51-2 图

学习笔记:Ng的深度书籍学习记录_第17张图片
--猫的品种分类器因此鉴于这种裁剪图像,于是它错误输出y = 0,或者没有猫的图片。
----------------------54-1图 红框猫


猫的品种分类器因此鉴于这种裁剪图像,于是它错误输出y = 0,或者没有猫的图片。
----------------------54-1图 半边裁剪猫
-- 猫探测器做了它的工作差。然而,人类可以说高技能仍然裁剪图像识别的暹罗猫不佳。所以我们认为这个错误猫探测器,或猫品种分类器,或都有?这是模棱两可的。
--如果这些模棱两可的情况下的数量很小,你可以得到任何你想要的决定,得到类似的结果。但是这里是一个更加正式的测试,可以让你更加明确地把错误一个部分:
&&1.更换猫探测器输出边界框上手写。
-------------------------54-2图


&&2. 运行相应的裁剪图像通过猫品种分类器。如果仍然猫品种分类器分类、属性猫品种分类器的误差。否则,属性错误猫探测器。
--换句话说,运行一个实验,让你给猫品种分类器一个“完美”的输入。有两种情况:
&&1.案例1:即使一个“完美”的边界框,猫品种分类器仍然不正确输出y = 0。在这种情况下,显然猫品种分类器是过错。
&&2.案例2:给定一个“完美”的边界框,现在的品种分类器正确输出y = 1。这表明,如果只有猫探测器更完美的边界框,那么整个系统的输出将是正确的。因此,属性错误猫探测器。
-- 通过执行这个分析更进一步的开发设置图片,现在可以明确每个错误一个组件属性。这允许您估计错误的分数由于管道的每个组件,因此决定在哪里集中你的注意力。

##55.错误归因的一般情况

-- 这里有错误归因的一般步骤。假设管道三个步骤A,B和C,直接一个提要到B,B直接喂到C。
------------------55-1图

学习笔记:Ng的深度书籍学习记录_第18张图片
-- 为每个错误的系统使dev设置:
&&1.尝试手动修改的输出是一个“完美”的输出(例如,“完美”猫边界框),并运行其他管道B,C输出。如果现在的算法给出了一个正确的输出,那么这表明,如果只给了一个更好的输出,整个算法的输出是正确的;因此,可以认为这个错误组件a .否则,继续第2步。
&&2.尝试手动修改B的输出的“完美”输出B。如果现在的算法给出了一个正确的输出,然后属性错误组件B .否则,继续步骤3。
&&3.属性错误组件C。
-- 让我们来看一个更加复杂的例子:
--------------------48-3图 车辆驾驶

学习笔记:Ng的深度书籍学习记录_第19张图片

-- 你的无人驾驶汽车使用这个管道。你如何决定哪些组件使用误差分析部分(s)关注吗?
-- 您可以将这三个组件映射到A,B,C,如下所示:
A: Detect cars 检测汽车
B: Detect pedestrians 检测行人
C: Plan path for car 计算行车路径和行驶平面图

-- 上述过程后,假设你测试你的车在一个封闭的跟踪和发现情况汽车选择了一个比一个熟练的司机会更刺耳的指导方向。在无人驾驶的世界里,这种情况下通常被称为一个场景。你会:
&&1. 尝试手动修改(检测汽车)的输出是一个“完美”的输出(例如,手动去告诉其他车辆在哪里)。运行其他管道B,C,但允许C(计划路径)现在使用一个完美的输出。如果算法现在计划汽车更好的路径,这表明,如果只给了一个更好的输出,整个算法的输出会更好;因此,可以认为这个错误组件a .否则,继续第2步。
&&2. 尝试手动修改B(检测行人)的输出的“完美”输出B。如果现在的算法给出了一个正确的输出,那么属性错误组件B。否则,继续步骤3。
&&3.属性错误组件C。

-- 毫升的组件管道应该下令根据有向无环图(DAG),这意味着你应能计算出它们在某些固定的从左到右的顺序,以及后来的组件应该早些时候只取决于组件的输出。只要映射组件的A - C > B - >订单遵循DAG排序,误差分析就会没事的。你可能会得到不同的结果如果你交换A和B:
&&1.A:检测行人(以前检测汽车)
&&2.B:检测汽车(以前检测行人)
&&3. C:计划路径的车

-- 但这种分析的结果将仍然有效,给好的指导在哪里集中你的注意力。

##56.对零件进行误差分析,并与人的性能进行比较

-- 进行误差分析学习算法是利用数据科学分析毫升系统的错误为了获得的见解关于下一步该做什么。在最基本的,误差分析部分告诉我们什么是组件(s)性能(是)值得我们最大的努力改善。
-- 说你有一个数据集的客户的网站上买东西。数据科学家可能会有很多不同的方法分析数据。她可能会得出不同的结论是否该网站应该提高价格,客户生命周期价值的通过不同的营销活动,等等。没有一个“正确”的方法来分析数据集,有很多可能有用的见解可以画。同样,也没有一个“正确”的方法进行误差分析。通过这些章节你学到许多最常见的设计模式对ML系统图有用的见解,但你应该感到自由与其他的方法分析实验误差。
-- 让我们回到应用程序自动驾驶,汽车检测算法输出的位置(或速度)附近的汽车,行人检测算法输出的位置附近的行人,和这两个输出最终用于规划路径。
---------------------48-3图 自动驾驶

学习笔记:Ng的深度书籍学习记录_第20张图片
-- 调试这个管道,而不是严格的过程在前面的章节中,你看到后,你可以更多的非正式地问:
&&1.检测汽车组件有多远从人类性能检测汽车?
&&2.有多远从人类性能检测行人组件?
&&3.有多远从人类整体系统的性能表现?这里,人类绩效假设人类计划的道路汽车只有前两个管道的输出组件(而不是访问摄像机图像)。换句话说,如何计划路径组件的性能比较的人类,当人类只给出相同的输入?
--如果你发现其中一个组件是远离人类层面的表现,你现在有一个很好的集中精力提高组件的性能。
-- 许多误差分析过程工作最好当我们试图自动化人类可以做的事,可以对人类性能基准。之前我们的大多数例子有这种隐含的假设。如果您正在构建一个毫升系统最终的输出或一些中间组件所做的事情,即使是人类不能做的很好,那么这些程序将不适用。
-- 这是人类可以解决工作问题的另一个优点——你有更强大的误差分析工具,因此您可以优化您的团队的工作更有效率。

##57.发现一个有缺陷的ML管道

如果每个组件的ML管道在人类层面的性能或表演near-human-level性能,但人类的整体管道远不及呢?这通常意味着管道是有缺陷的,需要重新设计。误差分析也可以帮助你了解如果你需要重新设计管道。
----------------48-3 自动驾驶

学习笔记:Ng的深度书籍学习记录_第21张图片
-- 在前一章中,我们提出的问题是否每三个组件的性能是在人类的水平。假设这三个问题的答案是肯定的。那就是:
&&1.检测汽车组件(大约)人类从相机图像检测汽车的性能。
&&2.检测行人组件(大约)人类从相机图像检测汽车的性能。
&&3.相比,人类已经计划为汽车只有前两个管道的输出组件(而不是访问摄像头图像),计划路径组件的性能是在一个类似的水平。

-- 然而,无人驾驶汽车表现明显低于人类的整体性能。即。,人类得到相机图像可以为汽车计划更好的路径。你能得出什么结论呢?唯一可能的结论是,毫升管道是有缺陷的。
-- 在这种情况下,计划路径组件所做的以及它能给它的输入,但输入不包含足够的信息。你应该问问自己什么其他信息,除了前面两个管道的输出组件,需要计划路径很好驾驶一辆汽车。换句话说,一个熟练的驾驶员需要什么其他信息?
-- 例如,假设您意识到人类司机也需要知道车道标记的位置。这表明,你应该重新设计管道如下:
-------------------48-3图 自动驾驶

学习笔记:Ng的深度书籍学习记录_第22张图片
--最终,如果你不认为你的管道作为一个整体将实现人类的性能,即使每个组件都有人类的性能(请记住,你们是比较一个人相同的输入组件),然后管道是有缺陷的,应重新设计。

58.建立一个超级英雄团队——让你的队友阅读这篇文章

--祝贺你完成这本书!在第二章,我们讨论如何这本书可以帮助你成为你的团队的超级英雄。
---------------------图58-1


--唯一比作为一个超级英雄是超级英雄团队的一部分。我希望你能把这本书的副本给你朋友和队友,帮助创建其他超级英雄!

 

 

 

你可能感兴趣的:(ai笔记)