深度学习笔记(16) 误差分析(一)
1. 进行误差分析
假设正在调试猫分类器
然后在开发集取得了90%准确率,相当于10%错误
这离希望的目标还有很远
也许需要看了一下算法分类出错的例子
注意到算法将一些狗分类为猫
试想一下,可以针对狗,收集更多的狗图
或者设计一些只处理狗的算法功能之类的
为了让的猫分类器在狗图上做的更好,让算法不再将狗分类成猫
建议做的是,先收集一下,比如说100个错误标记的开发集样本
然后手动检查,一次只看一个,看看开发集里有多少错误标记的样本是狗
假设事实上,100个错误标记样本中只有5%是狗
就是说在100个错误标记的开发集样本中,有5个是狗
意味着100个样本,在典型的100个出错样本中
即使完全解决了狗的问题,也只能修正这100个错误中的5个
在机器学习中,有时称之为性能上限
就意味着,最好能到哪里,完全解决狗的问题可以有多少帮助
但现在,假设发生了另一件事,假设观察一下这100个错误标记的开发集样本
你发现实际有50张图都是狗,所以有50%都是狗的照片
现在花时间去解决狗的问题可能效果就很好
这种情况下,如果真的解决了狗的问题
那么错误率可能就从10%下降到5%了
在机器学习中,有时候很鄙视手工操作,或者使用了太多人为数值
但如果要搭建应用系统,那这个简单的人工统计步骤,错误分析
可以节省大量时间,迅速决定什么是最重要的
有时在做错误分析时,也可以同时并行评估几个想法
比如,有几个改善猫检测器的想法,也许可以改善针对狗的性能,或者有时候要注意,那些猫科动物,如狮子,豹,猎豹等
所以,也许可以想办法解决这个错误
或者也许发现有些图像是模糊的
如果能设计出一些系统,能够更好地处理模糊图像,也能快速地降低错误率
其实,可以建立一个表格
在最左边,人工过一遍想分析的图像集,图像可能是从1到100
表格的一列就对应要评估的想法,比如狗的问题,猫科动物的问题,模糊图像的问题
在错误分析过程中,看算法识别错误的开发集样本
如果发现第一张识别错误的图片是狗图,那么就在那里打个勾
为了帮助自己记住这些图片,有时会在评论里注释,也许这是一张比特犬的图
如果第二张照片很模糊,也记一下
如果第三张是在下雨天动物园里的狮子,被识别成猫了,这是大型猫科动物,还有图片模糊,在评论部分写动物园下雨天,是雨天让图像模糊的之类的
最后,这组图像过了一遍之后,可以统计这些算法(错误)的百分比
或者这里每个错误类型的百分比,有多少是狗,大猫或模糊这些错误类型
在做到一半时,有时可能会发现其他错误类型
比如可能发现有Instagram滤镜,花哨的图像滤镜,干扰了分类器
在这种情况下,实际上可以在错误分析途中,增加这样一列
比如多色滤镜 Instagram滤镜和Snapchat滤镜
然后再过一遍,也统计一下那些问题
并确定这个新的错误类型占了多少百分比
例如,在样本中,有很多错误来自模糊图片,也有很多错误类型是大猫图片
所以,这个分析的结果不是说一定要处理模糊图片
这个分析没有给一个严格的数学公式,告诉应该做什么
但它能让你对应该选择那些手段有个概念
比如说不管对狗图片或者Instagram图片处理得有多好
在这些例子中,最多只能取得8%或者12%的性能提升
所以总结一下,进行错误分析,应该找一组错误样本
可能在开发集里或者测试集里,观察错误标记的样本
看看假阳性(false positives)和假阴性(false negatives)
统计不同错误标记类型占总数的百分比
可以帮助发现哪些问题需要优先解决,或者给构思新优化方向的灵感
建议快速搭建一个系统,并进行迭代,有一个训练过的系统,确定偏差方差的范围,能够进行错误分析
2. 清除标注错误的数据
在猫分类问题中,图片是猫,y=1;不是猫,y=0
假设在查看了一些数据样本
发现标记为猫的图片有些其实不是猫
所以这是标记错误的样本
“标记错误的样本”来表示学习算法输出了错误的 y 值
对于标记错误的样本,参考数据集,在训练集或者测试集 y 的标签
人类给这部分数据加的标签,实际上是错的
这实际上是一只狗,所以 y 其实应该是0
首先考虑训练集
事实证明,深度学习算法对于训练集中的随机错误是相当健壮的(robust)
只要标记出错的样本并且离随机错误不太远
有时可能做标记的人没有注意或者不小心,按错键了
如果错误足够随机,那么放着这些错误不管可能也没问题
而不要花太多时间修复它们
当然浏览一下训练集,检查一下这些标签,并修正它们也没什么害处
有时候修正这些错误是有价值的,有时候放着不管也可以
只要总数据集总足够大,实际错误率可能不会太高
如果是开发集和测试集中有这些标记出错的样本
在错误分析时,添加一个额外的列,这样也可以统计标签 y=1错误的样本数
统计一下对100个标记出错的样本的影响
所以会找到100个样本,其中分类器的输出和开发集的标签不一致
有时对于其中的少数样本,分类器输出和标签不同
是因为标签错了,而不是分类器出错
所以也许在这个样本中,发现标记的人漏了背景里的一只猫
所以那里打个勾,来表示样本98标签出错了
所以现在问题是,是否值得修正这6%标记出错的样本
建议是,如果这些标记错误严重影响了在开发集上评估算法的能力
那么就应该去花时间修正错误的标签
但是,如果它们没有严重影响到用开发集评估成本偏差的能力
那么可能就不应该花宝贵的时间去处理
如果决定要去修正开发集数据,手动重新检查标签并尝试修正一些标签
还有一些额外的方针和原则需要考虑
首先,不管用什么修正手段都应该要同时作用到开发集和测试集上
因为开发和测试集必须来自相同的分布
其次,强烈建议要考虑同时检验算法判断正确和判断错误的样本
要检查算法出错的样本很容易
只需要看看那些样本是否需要修正
但还有可能有些样本算法判断正确,那些也需要修正
如果只修正算法出错的样本,对算法的偏差估计可能会变大
这会让算法有一点不公平的优势,就需要再次检查出错的样本
但也需要再次检查判断对的样本
因为算法有可能因为运气好把某个东西判断对了
在那个特例里,修正那些标签可能会让算法从判断结果对变成错
这一点不是很容易做,所以通常不会这么做
原因是如果分类器很准确,那么判断错的次数比判断正确的次数要少得多
那么就有2%出错,98%都是对的
所以更容易检查2%数据上的标签
然而检查98%数据上的标签要花的时间长得多
所以通常不这么做,但也是要考虑到的
最后,如果进入到一个开发集和测试集去修正这里的部分标签
可能会对训练集做同样的事情,而修正训练集中的标签其实相对没那么重要
可能决定只修正开发集和测试集中的标签
因为它们通常比训练集小得多
可能不想把所有额外的精力投入到修正大得多的训练集中的标签
所以这样其实是可以的
在构造实际系统时,通常需要更多的人工错误分析,更多的人类见解来架构这些系统
想知道它所犯的错误,应亲自去看看这些数据,尝试和一部分错误作斗争
因为花了这几分钟,或者几个小时去亲自统计数据
真的可以找到需要优先处理的任务
参考:
相关推荐:
深度学习笔记(15) 人的表现
深度学习笔记(14) 评估指标
深度学习笔记(13) Softmax分类
深度学习笔记(12) Batch归一化网络
深度学习笔记(11) 超参数调试
谢谢!