深度学习笔记(三)(2)机器学习策略(2)(ML Strategy (2))
2.1 进行误差分析(Carrying out error analysis)
假设你正在调试猫分类器,然后你取得了 90%准确率,相当于 10%错误,而错误识别中有许多把狗当成了猫,这时可以收集一下,比如说 100 个错误标记的开发集样本,然后手动检查,一次只看一个,看看你的开发集里有多少错误标记的样本是狗,这样如果错误标记的样本中有10个狗,可能这么做效果不太好,但是如果有50个狗,那就赚大发了。
不要鄙视人工操作
在做错误分析时,假如对猫的识别错误,会有很多猫科动物被错误当为猫。
这个时候可以如图来进行标记,有哪个错误就标记,并且最后一行可以写批注,比如是因为雨天图片模糊造成的、小狮子等,在这个步骤做到一半时,有时你可能会发现其他错误类型,比如说你可能发现有Instagram 滤镜,那些花哨的图像滤镜,干扰了你的分类器。这时可以再做一列去统计滤镜。 并确定这个新的错误类型占了多少百分比,这个分析步骤的结果可以给出一个估计,是否值得去处理每个不同的错误类型。
2.2 清除标注错误的数据(Cleaning up Incorrectly labeled data)
你的监督学习问题的数据由输入𝑥和输出标签 𝑦 构成,如果你观察一下你的数据,并发现有些输出标签 𝑦 是错的,对于这些随机误差,可以不管,因为train集对随机标注错误很稳健,可以不管,只要data足够大,但对系统性错误就不太好。系统性错误就是你把很多狗都标记成了猫,那就玩完了。
这时若担心开发集或测试集上标记出错的样本带来的影响,他们一
般建议你在错误分析时,添加一个额外的列,去统计标记出错的问题。
对于是否值得修改标注出错的问题,应该看是否他严重的影响了我在开发集上评估算法的能力,若有,就修正,若无,就不用修正。
例如,当我们错误率为10%时,6%的错误来自标记出错,所以 10%
的 6%就是 0.6%。这时的主要任务是去修改那9.4%的错误,而不是这个标记错误;而如果你已经把错误率降到了2%,但总体错误中还有0.6%是错的,那这就需要修改了。
开发集的主要目的是,你希望用它来从两个分类器𝐴和𝐵中选择一个。
所以这个时候当A有1.9%的错误率,B有2.1%的错误率在开发集,这个时候这个结果可能不太可信,需要去消除标注错误的数据。
现在如果你决定要去修正开发集数据,手动重新检查标签,并尝试修正一些标签,这里还有一些额外的方针和原则需要考虑。首先,我鼓励你不管用什么修正手段,都要同时作用到开发集和测试集上,我们之前讨论过为什么,开发和测试集必须来自相同的分布。确定了你的目标,当你击中目标后,你希望算法能够推广到测试集上,这样你的团队能够更高效的在来自同一分布的开发集和测试集上迭代。如果你打算修正开发集上的部分数据,那么最好也对测试集做同样的修正以确保它们继续来自相同的分布。
其次,我强烈建议你要考虑同时检验算法判断正确和判断错误的样本,要检查算法出错的样本很容易,只需要看看那些样本是否需要修正,但还有可能有些样本算法判断正确,那些也需要修正。
最后,如果你进入到一个开发集和测试集去修正这里的部分标签,你可能会,也可能不会去对训练集做同样的事情,,修正训练集中的标签其实相对没那么重要。
请重视手工检测
请重视手工检测
请重视手工检测
2.3 快速搭建你的第一个系统,并进行迭代(Build your first system quickly, then iterate)
如果你正在开发全新的机器学习应用,我通常会给你这样的建议,你应该尽快建立你的第一个系统原型,然后快速迭代。
2.4 使用来自不同分布的数据进行训练和测试(Training and testing on different distributions)
假设你在开发一个手机应用,用户会上传他们用手机拍摄的照片,你想识别用户从应用
中上传的图片是不是猫。你在网上下载了20万的猫图,只收集到1万的手机图片,
本节中,见到几组样本,让你的训练集数据来自和开发集、测试集不同的分布,这样你就可以有更多的训练数据。在这些样本中,这将改善你的学习算法。
2.5 数据分布不匹配时的偏差与方差的分析(Bias and Variance with mismatched data distributions)
我们要做的是随机打散训练集,然后分出一部分训练集作为训练-开发集(training-dev),就像开发集和测试集来自同一分布,训练集、训练-开发集也来自同一分布。为了进行误差分析,你应该做的是看看分类器在训练集上的误差,训练-开发集上的误差,还有开发集上的误差。
假如样本中,训练误差是 1%,我们说训练-开发集上的误差是 9%,然后开发集误差是 10%,和以前一样。你就可以从这里得到结论,当你从训练数据变到训练-开发集数据时,错误率真的上升了很多。而训练数据和训练-开发数据的差异在于,你的神经网络能看到第一部分数据并直接在上面做了训练,但没有在训练-开发集上直接训练,这就告诉你,算法存在方差问题,因为训练-开发集的错误率是在和训练集来自同一分布的数据中测得的。所以你知道,尽管你的神经网络在训练集中表现良好,但无法泛化到来自相同分布的训练-开发集里,它无法很好地泛化推广到来自同一分布,但以前没见过的数据中,所以在这个样本中我们确实有一个方差问题。
假设一个样本训练误差为 1%,训练-开发误差为 1.5%,但当你开始处
理开发集时,错误率上升到 10%。现在方差问题变小了,因为在训练-开发集上表现良好,神经网络还没有看到的数据,错误率只上升了一点点。但当你转到开发集时,错误率就大大上升了,所以这是数据不匹配的问题。
不管算法在学习什么,它在训练-开发集上做的很好,但开发集上做的不好,所以总之你的算法擅长处理和你关心的数据不同的分布,我们称之为数据不匹配的问题。(我的理解就是你的算法瞄准的靶心错误)
如果算法在开发集上做的很好,比测试集好得多,那么你就可能对开发集过拟合了。
还有一种可能,候如果你的开发测试集分布比你应用实际处理的数据要容易得多,比如训练集难识别,但是开发集容易识别,那么也会影响这些错误率可能真的会下降所以如果你看到这样的有趣的事情,可能需要比前面分析更普适的分析。
在水平轴上,我要放入不同的数据集。在另一条轴上,我要标记处理数据不同的方式或算法。详情看书吧P314,有点冗杂。
2.6 处理数据不匹配问题(Addressing data mismatch)
这个问题没有完全系统的解决方案,但我们可以看看一些可以尝试的事
情。如果我发现有严重的数据不匹配问题,我通常会亲自做错误分析,尝试了解训练集和开发测试集的具体差异。技术上,为了避免对测试集过拟合,要做错误分析,你应该人工去看开发集而不是测试集。
假如你是做语音识别,你可以实际去听听开发集与训练集的不同在哪里,或许是有更多的汽车噪音?或其他错误。发现后可以有意的做许多相同的数据加入到训练集中,即目标是让训练集接近开发集,对语音处理方面可以使用一种技术是人工合成数据(artificial data synthesis)。人工数据合成有一个潜在问题
对图象也是;假如一个汽车,去通过图像处理软件来改变他的颜色,这样也有可能从所有可能性的空间只选了很小一部分去模拟数据。
2.7 迁移学习(Transfer learning)
迁移学习起作用的场合是,在迁移来源问题中你有很多数据,但迁移目标问题你没有那么多数据。就是从数据量很多的问题迁移到数据量相对小且输入x相同(如都是语音或都是图象)的问题。
据迁移学习不会有太大坏处,但是你也别指望会得到有意义的增益。
2.8 多任务学习(Multi-task learning)
在迁移学习中,你的步骤是串行的,你从任务𝐴里学习只是然后迁移到任务𝐵。在多任务学习中,你是同时开始学习的,试图让单个神经网络同时做几件事情,然后希望这里每个任务都能帮到其他所有任务。
假设你在研发无人驾驶车辆,那么你的无人驾驶车可能需要同时检
测不同的物体,比如检测行人、车辆、停车标志,还有交通灯各种其他东西。
Softmax回归是给出概率去判断是否是这一类,而这里是去看是否一个图有几个类别的目标存在
训练一个神经网络做四件事情会比训练四个完全独立的神经网络分别做四件事性能要更好,这就是多任务学习的力量。
细节:多任务学习可以应用于全部被标记的图片,也可以应用于部分被标记的图片。
多任务学习有意义的条件:
第一,如果你训练的一组任务,可以共用低层次特征。
第二,这个准则没有那么绝对,所以不一定是对的。
最后多任务学习往往在以下场合更有意义,当你可以训练一个足够大的神经网络,同时做好所有的工作,所以多任务学习的替代方法是为每个任务训练一个单独的神经网络。
在实践中,多任务学习的使用频率要低于迁移学习。而计算机视觉和物体检测中可能多用到。
2.9 什么是端到端的深度学习?(What is end-to-end deep learning?)
简而言之,以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。那么端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它。
端到端深度学习就只需要把训练集拿过来,直接学到了𝑥和𝑦之间的函数映射,直接绕过了其中很多步骤。端到端深度学习的挑战之一是,你可能需要大量数据才能让系统表现良好,对于无足够多数据解决端到端的问题,可以给他分成俩个子问题。
2.10 是否要使用端到端的深度学习?(Whether to use endto-end learning?)
端到端的好处:1.让数据speak。如果你有足够多的(𝑥, 𝑦)数据,那么不管从𝑥到𝑦最适合的函数映射是什么,如果你训练一个足够大的神经网络,希望这个神经网络能自己搞清楚,而使用纯机器学习方法,直接从𝑥到𝑦输入去训练的神经网络,可能更能够捕获数据中的任何统计信息,而不是被迫引入人类的成见。
2.所需手工设计的组件更少,所以这也许能够简化你的设计工作流程,你不需要花太多时间去手工设计功能,手工设计这些中间表示方式。
缺点:
1.它可能需要大量的数据。要直接学到这个𝑥到𝑦的映射,你可能需要大量(𝑥, 𝑦)数据。
2.它排除了可能有用的手工设计组件。
决定是否使用端到端深度学习,我认为关键的问题是,你有足够的数据能够直接学到从𝑥映射到𝑦足够复杂的函数吗?我还没有正式定义过这个词“必要复杂度(complexity needed)”。端到端的深度学习,有时候效果拔群
这个好难端对端。。。。
这一大章主要是培养一些战略性思维和宝贵的经验吧,非常有用,避免成为6个月换方向的研究成员哈哈哈哈。