2.1 进行误差分析
如果你偶然发现你的分类器在某一个方向犯错误,是否应该花费时间去专注于修正这个错误?
吴老师举了这样一个例子:如果你发现你的猫分类器总是会把狗认成猫,是否应该花几个月时间去做一个项目区分是否是狗,然后应用到这个项目中?
在做这个决定之前,首先收集一下错误的开发集例子,然后手动检查你的开发集里有多少错误标记是狗。假设你的错误例子中只有百分之五是狗,那么即便你花了几个月时间,也只是让你的错误率下调百分之五。或许在这种情况下也应该花费时间,但至少这个分析给出了一个你的误差调整上限。如果你的开发集里错误标记里有百分之五十是狗,这种情况下就很有必要去探索一下这个误差减半的方向了。
如果遇到有多重错误或改进的方向的话,可以去列一个表格。
当你遍历完你的开发集错误例子之后,对于其中的错误类型想必一定有了比较充分的认识。通过表格的最后一行,你可以明显地看出当前影响分类器的判断的最重要因素是什么,并得到你之后一段时间的任务。如图,影响最高的显然是模糊图像而不是狗的干扰,那么接下来你的研究也许可以专门针对模糊图片进行优化。
这个快速统计的表格你可以经常做,在几个小时内就可以真正帮你选出高优先级的任务并了解每个手段有多大的提升空间。
2.2 清楚标注错误的数据
如果你偶然发现数据的人工标注有错误,那是否应该花费时间去校正这一类错误呢?
如果你发现你的数据中有标注错误的数据,它对于不同集的影响是不同的。
对于训练集来说,如果你的标注错误的数据足够随机的话,其实对于最后训练的效果是没有什么影响的。只要总数据量足够大,实际误差可能不会太高。
PS:虽然深度学习算法对随机误差具有鲁棒性,但对系统性错误就没有这种性质了。比如,你的标注一直把白色的狗标注成猫,你的分类器就有问题了,它把白色的狗认成猫的可能性就大大增加了。
如果你仍旧十分担心错误标注对你的分类器造成的影响,不妨仿照上一节来列一个表格,不过于上一个表格不同,我们可以在表格中加一列#标注错误#的选项,然后通过最后的统计来看一下这类错误对你的影响。
老师的建议是:如果这百分之六的错误标注严重影响到了你在开发集评价算法的能力,那就有必要修正错误的标签。(比较重要度)
如果你要修正你的开发集,注意如下:
- 不管有什么手段,要同时作用于开发集和测试集上。(前几节中的要求:开发集和测试集要来自同一分布)
- 同时检验算法出错和算法正确的例子,如果只对算法错误的例子进行验证的话,那么你对算法的偏差估计可能会变大,这会导致你的效果没有那么明显且在下一次检查中可能会发现新的错误导致不得不再来一次校正。但鉴于数据量问题,通常不这么做。
- 你可以选择不去校正训练集中的错误例子,因为这件事影响没有那么大(
2.3 快速搭建你的第一个系统并进行迭代
当你面临一个全新的任务,需要构建一个全新的模型的时候,大多是情况下不能及时开始构建你的新系统,因为你考虑到了很多的问题……
对此,老师的建议是,快速下手:
- 设立目标(即使不对,后期改也可以)
- 马上搭好一个机器学习系统原型,然后找到训练集,快速迭代之后看一下你的算法表现如何
- 然后运用偏差分析和方差分析来确定下一步优先做什么
这么做的目的是能有一个系统的误差来准确指导你下一步该做什么,而不是自己盲目地猜测。有时候,明明一个非常简单的系统能解决的问题,却用了一个非常复杂的系统。这不仅在搭建系统上花费了更多时间,还会在调参训练上花费更多的时间。但是这一条建议不适用于十分有经验的研究人员,或者是人脸识别方面。对于人脸识别方向的话,很多时候都可以基于多篇论文开始来构造一个机器学习系统原型,而不是从最简单的开始。
2.4 在不同的划分上进行训练并测试
如果由于一定的条件限制,你并不能得到同一分布的开发集和训练集,那么将要如何解决误差过大的问题呢?
我们来看这样一个例子:
假设你要做一个猫的分类器,但不巧的是,你只能找到很小一部分来自用户上传的模糊图片,虽然这是你的分类器最后将要应用的环境。但能得到的大数据量的图片都是些清晰度很高的图片。你的模型显然需要大数据量来训练,而用户上传的图片量远远不够。所以用到不符合同一分布的图片是很必要的。
那么很合理地一个思路就是,将两个数据集合并到一起,随机分布,然后按照比例分配训练集、开发集和测试集。但你会发现,百分之八九十的训练集,开发集,测试集数据都来自你不想要的部分,而你依旧需要将你的分类器应用在模糊图片上。这就好比你花费几个月时间去逼近靶心,但是最后的测试却移动了靶心。这样的效果可想而知。
第二种方法就是将所有的网上图片都放到训练集中去,训练集可以再加5000条用户app图片,然后你的开发集和测试集全部由用户APP组成。(需要去逼近的目标是准确的,会让在你中间的努力和最后的结果都比较尽如人意)
这个例子完全是将大数据量全部分给大数据量,然后将少数数据量平分给开发集和测试集。
2.5 不匹配数据划分的偏差和方差
如果你的训练集和开发集来自不同的分布,那么怎么样处理方差和偏差的问题呢?
定义一个新的数据集,叫做训练-开发集。
随机打散训练集和开发集,然后生成训练-开发集。就像开发集和测试集来自同一分布一样,训练-开发集和训练集、开发集也来自同一分布。所以观察误差的时候,就要同时观察训练集的误差,训练-开发集的误差,开发集的误差,来判断是方差的问题还是数据不匹配的问题。
所以我们一般要关注的误差有:人的平均水平误差,训练集误差,训练-开发集误差,开发集误差。他们之间分别对应着可避免误差,方差,数据不匹配问题的严重程度。同时你也可以查看测试集的误差来看是否模型对开发集过拟合了。如果测试集误差和开发集误差相差过大,就说明是这个问题了,也许你需要一个更大的开发集了。
但有些时候,误差并不是一直都在变大,而有些时候在测试集上的结果还会变小。下面的表比较总体地展示了各个误差之间的关系。