目录
1.错误分析(error analysis)
(1)定义
(2)错误分析流程
(3)一般建议在错误分析时,增加一列,统计标签错误的样本数(下面)
2.清除标注错误的数据
(1)解释
(2)注意事项
3.快速搭建系统,并进行迭代
4.使用来自不同分布的数据进行训练和测试
5.数据分布不同时的偏差与方差的分析
6.处理数据不匹配问题(数据分布不同问题)
1.错误分析(error analysis)
(1)定义
当模型算法还没有达到人类的表现,那么人工检查一下错误可以让我们了解接下来应该做什么,这个过程称为错误分析(error analysis)。
例子
猫分类器取得了90%准确率,相当于10%错误率。算法将一些狗分类成猫,可能有建议针对狗的图片进行优化,例如收集更多的狗图,问题是我们是不是应该专门花很多时间去处理狗的问题?花费这么多时间值得吗?
这时有个错误分析流程,能让我们很快知道某个方向是否值得尝试:人工收集一下开发集有多少错误标记的样本是狗,如果100个错误样本中只有5个是狗,那如果你在这个问题上花费很多时间,最多只能将错误率从10%下降到9.5%。在机器学习中,称这种能够改善算法性能的上限为性能上限(the ceiling on performance),意思就是完全解决狗的问题对你最多有多少帮助。但如果50%都是狗的照片,那么花时间解决狗的问题可能效果更好,错误率可能会更低一些。
(2)错误分析流程
- 在开发集或测试集中找一组错误样本(mislabeled examples),统计属于不同错误类型的错误数量,根据错误类型占比可以找到改进的方向。
- 例子:
- 对于一个猫分类器,有4个可能的错误类型:
(1)是狗图
(2)是狮子,豹,猎豹等大猫
(3)图像模糊被分类成猫 - 可以建立一个表格或者普通文本文件,人工地一张一张检查每张图片,每一列是可能的错误类型,最后一列可以备注,最后统计这些算法(错误)的百分比。在这个例子中8%是狗,43%是大猫,61%属于模糊,12%是Instagram滤镜。所以我们得出,改善大猫和模糊图片的识别对性能提高的上限空间会大得多。
(3)一般建议在错误分析时,增加一列,统计标签错误的样本数(下面)
2.清除标注错误的数据
(1)解释
在监督学习中,数据由输入x和输出标签y构成,如果发现一些y标注错误,是否值得花时间去修正这些标签呢?事实证明,深度学习算法对于训练集中的随机错误是相当健壮的,如果错误足够随机,总数据集总足够大,实际错误率可能不会太高。
例子:
一般建议在错误分析时,增加一列,统计标签错误的样本数。
一个例子(上图左下方),如果整体开发集有10%错误率,同时6%的错误来自错误标记,那么关注错误标记引起的错误的数量或者百分比,在这里6%×10%=0.6%,意味着开发集的错误中0.6%是标记出错,剩下9.4%是其他原因导致的,所以在这种情况下,应该集中精力修正9.4%的错误。
一个例子(上图右下方,上图表不是这个例子的),如果整体开发集有2%错误率,但总体错误中的0.6%还是标记出错导致的。则0.6%/2%=30%,占比较高。较大一部分的错误都是开发集标记出错导致的,那似乎修正开发集里的错误标签似乎更有价值(worthwhile)。因此,现在你就有很好的理由去修正开发集里的错误标签。
(2)注意事项
- 1 开发集和测试集必须来自相同的分布。如果要修正开发集上的部分数据,那么最好也对测试集做同样的修正以确保它们继续来自相同的分布。
- 2 同时检验算法判断正确和判断错误的样本,因为算法有可能因为运气好把某个东西判断对了。
- 3 修正训练集中的标签其实相对没那么重要,可以只修正开发集和测试集中的标签,因为它们比训练集小得多。
3.快速搭建系统,并进行迭代
- 如果要开发全新的机器学习应用,通常建议尽快建立你的第一个系统原型,然后快速迭代。快速设立开发集和测试集还有指标,然后找到训练集,训练一下,看看效果,在开发集测试集、评估指标上表现如何。然后用它做偏差/方差分析,用它做错误分析,然后用分析结果确定下一步优先要做的方向。
4.使用来自不同分布的数据进行训练和测试
深度学习在训练集数据足够多时,算法效果最好,这导致很多算法团队想尽一切办法去收集数据,导致大部分数据都来自与开发集、测试集不同的分布。下面介绍一些最佳做法(best practices)来处理训练集和测试集存在差异的情况。
开发一个识别猫的手机应用,有两个数据来源:一个是你真正关心的数据分布,来自应用上传的数据(右边),一般且业余,甚至很模糊,有1万张;另一个数据来源是爬取网页,取景专业、高分辨率、拍摄专业,有20万张。而你真正关心的算法表现是你的最终系统处理来自应用程序的这个图片分布时效果好不好,现在有20万张图片并不完全来自你想要的分布,那么你可以怎么做呢?有两种选择:
第一种划分方式是将两组数据合并在一起,这样就有21万张照片,把这21万张照片随机分配到训练、开发和测试集中。假设你已经确定开发集和测试集各包含2500个样本,所以训练集有205000个样本。这样会导致开发集中大部分都不是我们关心的数据,所以不推荐这种方式。
还有第二种划分方式,设置开发集和测试集都是手机图,而训练集包含了来自网页的20万张图片和5000张来自应用的图片,开发集和测试集都是2500张来自应用的图片。虽然训练集和开发集、测试集的分布不一样。但事实证明,这样划分长期能带来更好的性能。
总之,开发集和测试集的数据设置为我们真正要处理的数据是关键,而训练集的数据设置相对不那么重要。
5.数据分布不同时的偏差与方差的分析
之前我们通过观察贝叶斯错误率(人的表现)、训练集误差和开发集误差,来分析偏差与方差。但当训练集和开发集、测试集不同分布时,分析偏差和方差的方式可能不一样
解决方法就是:从训练集中分出一部分数据,作为训练-开发集,这个数据不用于训练。我们现在有了训练集误差、训练-开发集误差、开发集误差。
eg1:
贝叶斯错误率是0%,训练集误差是1%,训练-开发集误差是9%,开发集误差是10%
比较1%和9%得出存在高方差。(而不是比较1%和10%,因为这两个数据来自不同分布)
eg2:
训练集误差为1%,训练-开发集误差变为1.5%,开发集误差10%。现在算法的方差问题就很小了,因为从训练数据转到训练-开发集数据,错误率只上升了一点点。但开发集的错误率就大大上升了,这是数据分布不同导致的问题。
eg3:
训练误差、训练-开发误差、开发误差分别为10%,11%,12%,要记住,人类水平对贝叶斯错误率的估计大概是0%,这样的情况存在高偏差问题,存在可避免偏差问题。
6.处理数据不匹配问题(数据分布不同问题)
上面说了训练-开发集误差与开发集误差过大是因为数据不匹配的原因,那如何处理呢
亲自做错误分析,尝试了解训练集和开发集的具体差异,然后做一些处理,让训练集更接近开发集。(技术上,为了避免对测试集过拟合,要做错误分析,应该人工去看开发集而不是测试集)
eg:
假如开发一个语音激活的后视镜应用,如果你发现车辆背景噪音是主要的错误来源,那么你可以模拟车辆噪声数据,加入到你的训练集中。其中一种技术是人工合成数据(artificial data synthesis)。实际上没有那么多在汽车噪音下录制的音频,训练样本很可能没有背景噪声,可以人工添加背景噪声,通过人工数据合成,处理后的数据再喂给机器学习算法,这样会让模型训练的效果更准确。
但人工合成有一个潜在问题,如果你只录了一个小时车辆背景噪音,然后反复播放,给每段语音都增加同一段背景噪声,这样可能对这个汽车噪音过拟合。