1.进行误差分析
如果希望算法能胜任人类能做的任务,但算法还没达到人类的水平,那么可以人工检查下算法犯的错误,也许这样就可以知道下一步该做什么,这就是误差分析。
如图9.1,在猫识别中,假设有10%错误率,人工检查错误样本发现,算法将部分狗识别成了猫。
这时,我们是否需要花费精力去处理狗识别成猫的问题呢?可能耗时一个月、两个月、甚至更久。
首先,先看看错误样本,假设有100个错误样本。
如果只有5%的错误样本是狗,花精力处理狗误识别问题后,那么错误率最多只能从10%下降到9.5%,改变的性能上限为0.5%。
如果只有50%的错误样本是狗,花精力处理狗误识别问题后,那么错误率最多只能从10%下降到5%,改变的性能上限为5%。
针对不同情况,我们可以根据改变的性能上限去做出决定是否花费精力去处理狗识别成猫的问题。
在机器学习中,有时候很鄙视手工操作,但是简单的人工统计步骤及错误分析,可以节省大量时间,可以迅速决定什么是最重要的。
错误样本中不只是狗识别成猫,可能还会有大型猫科动物比如老虎识别成猫,或者图片模糊导致识别错误等。可以列一个如图9.2的表格,最终分析出各种错误情况占比,得到性能提高的上限空间,然后选上限空间最大的两个进行改善,或者分两个团队每个团队改善其一。
所以,这个快速统计的步骤,能够帮你选出高优先级任务,指明下一步方向。
2. 清楚标注错误的数据
在监督学习中,学习的数据由输入X和输出标签Y构成。但是有些数据输出标签可能是错的。
如图9.3,标注0代表狗,标注1代表猫,倒数第二张图白狗标注出错。这种错误是否会影响训练误差呢?
如果是随机错误,实验证明只要数据量足够大,机器学习系统对其的鲁棒性很强,不会影响训练误差。
如果是系统性误差,即所有白狗都标注错误,那么就会影响训练误差.
机器学习系统对随机标注错误在训练集上鲁棒性很强,下面分析标注误差在开发集和测试集情况。
如图9.4,按照上一节方法,列出在开发集或测试集中各种导致错误的情况,然后查看因为标注错误导致错误的比例。如果占比很高,那么就得去处理标注错误问题。
如图9.5,开发集或测试集标注错误纠正应有以下原则:
1、必须同时纠正开发集和测试集,确保他们属于同一分布,即瞄准同一靶心。
2、不仅要检查做得错的数据,也要检查做的对数据,因为做的对的数据也有可能标注错误。通过不会去践行这条,因为做的对的数据量往往很大,很难去分析。
3、训练集和开发集或和测试集可以处于稍微不同的分布,即纠正开发集和测试集的标注错误后可以不用去处理训练集的标注错误。
3.快速搭建第一个系统,并进行迭代
要开发新的机器学习应用,应该快速搭建第一个系统,并进行快速迭代。
如图9.6,假设要搭建一个语音识别系统,可以优先考虑很多事情,比如:
用一些特定的技术让语音识别系统对嘈杂的背景更加健壮;
用一些特定的技术让语音识别系统在处理带口音时更健壮;
用一些特定的技术解决远场语音识别;
用一些特定的技术解决儿童的语音识别等等。
一般来说,对于机器学习系统,可能会有50个不同的方向可以前进,并且每个方向都是相对合理的,可以改善你的系统,但挑战在于,你如何去选择一个方向集中精力处理,不可能每个方向都同时前进。
建议先快速搭好你的第一个系统 然后开始迭代。即快速设立开发集和测试集还有指标,这样就决定了你的目标所在。接下来再利用偏差方差分析和错误分析确定下一步优先做什么。
4.在不同划分上进行训练并测试
深度学习对训练数据胃口很大,搜集越多带标签的训练数据,算法效果会越好,所以技术团队会去大量收集训练数据,然而这可能导致训练集数据分布和开发集、测试集分布不同。
下面来处理训练集数据分布和开发集、测试集分布不同情况。
如图9.7,建立一个猫识别系统,识别手机拍摄的图片,即目标是识别手机拍摄的图片。现在有1万张手机拍摄的图片,20万张网上爬取的图片。手机拍摄的图片一般比较模糊,而网上图片都是高清大图,即两类图片来自不同分布。
直接拿1万张手机拍摄的图片去训练算法的话,明显数据量太小,而20万张网上爬取的图片又不失你想要的的分布,这该如何呢?
方法1:将1万张手机拍摄的图片和20万张网上爬取的图片均匀混合然后再划分训练集和开发集、测试集。
好处:训练集与开发集、测试集处于同一分布。
坏处:开发集、测试集中大部分是网上爬取的图片,不是想要的目标,即瞄准的靶心不是想要的。
方法2:将20万张网上爬取的图片和一半手机拍摄的图片作为训练集,剩余的一半手机拍摄的图片作为开发集、测试集。
好处:很好地瞄准靶心,是想要的目标。
坏处:训练集与开发集、测试集不处于同一分布。
综上所述,方法2更符合。
5.不匹配数据划分的偏差和方差
估算学习算法的偏差和方差,可以确定接下来优先做的方向。但是,训练集和开发集、测试集不处于同一分布时,分析偏差和方差的方式是不一样的。
当训练集和开发集、测试集不处于同一分布时,分析偏差、方差时需要增加一个训练-开发集(Train-dev)训练-开发集是在训练集中分离出来的一部分数据,与训练集分布一致,用来代替开发集去分析方差。
如图9.8,训练集与人类表现差距代表可避免偏差,
训练-开发集与开发集差距代表方差,
开发集和训练-开发集的差距代表数据是否匹配(即算法擅长处理与靶心是否一致),
测试集与开发集差距代表是否过拟合开发集。
6.定位数据不匹配
如果算法存在数据不匹配问题,首先要做误差分析,看看训练集和开发集、测试集分布哪里不同。然后去手机收集开发集、测试集分布的数据,让其跟训练集分布更相似。
其中,可以通过人工数据合成进行数据收集,比如:
合成安静状态的录音+汽车行驶状态背景音,
合成各种各样的小车等等。
但是有一点要注意,人工合成的数据毕竟属于小范围,要谨防算法对这小范围数据过拟合。