Deep Learning (8) - Error Analysis
这里我觉得应当翻作错误分析,而非误差分析。重点阐述两个问题:
- 数据集本身有错误怎么办
- 有些情况因为样本数据本身的局限,导致training set和dev/test set分布不同怎么办?是否出现data mismatch?如果出现了,怎么办?
错误分析方法
这里Andrew抛出一个方法论。就是在需要错误分析的时候,例如现在的模型结果不满意,或者你发现样本数据可能有问题,再或者后面提到的可能会有data mismatch的情况的时候,都可以采用下面提到的方法,来发掘问题或者错误可能存在的地方:
- 取大约100个样本
- 在这100个样本中,数出错误的样本数,并标记到表格里
- 推断正确的样本也要查看,有可能存在样本标记错误,而模型缺陷导致其负负得正,从而恰好得出正确的结果。这样的样本也要挑出来。
样本错误怎么办?
In training set
通常如果只是随机错误,因为机器学习本身很善于消除随机错误带来的影响,所以不必特别的去处理这些随机的样本错误。如果是系统错误(systematic),例如将所有的白色小狗认作猫咪,那就需要去纠正了。通常这不太可能,如果发生了,而且数据量很大,只能说明我们使用了不可信的数据。
In dev/test set
dev/test set中如果发现了错误标记的数据,还是需要纠正出来的,因为dev/test set中的数据并不会用来迭代,而是用来判断模型之间的优劣。如果数据中有错误的存在,会影响评判,进而影响模型修改的方向。所以dev/test set中的数据错误是有害的,必要时还是需要纠正。判断是否有必要修正的方法仍然是采用前一节提到的错误分析方法,再加上一列Incorrectly labeled。如果此列数据显示因为错标数据导致的判断错误达到足够的百分比,我们就要花点时间来修正这些dev/test集中的样本数据了。
Some guide lines:
- Apply same process to your dev and test sets to make sure they continue to come from the same distribution. 保证dev和test集样本分布相同,否则会出现矛盾的模型评估。
- Consider examining examples your algorithm got right as well as ones it got wrong. 考虑负负得正的情况。
- Train and dev/test data may now come from slightly different distribtuion. 因为训练集样本太多,而且对随机错误不敏感,所以通常不去调整训练集。如果调整了开发和测试集就可能引入data mismatch的情况。如果怀疑data mismatch发生了,就要用前面的方法来get some insight。
Build your first system quickly, then iterate.
训练集与开发/测试集分布不同
为什么会有这种情况
Andrew举了两个例子:cat detector和rear view mirror。很生动。摘取cat detector来作为笔记:
如何判断data mismatch
方法是从训练集中再分割出一个数据集叫:training-dev set (训练-开发集)
Human Level | 4% | |
avoidable bias | ||
Training set error | 7% | |
variance | ||
Training-dev set error | 10% | |
data mismatch | ||
Dev error | 12% | |
degree of overfitting to dev set | ||
Test error | 12% |
当dev error与training-dev error相差过大的时候,就可以认为发生了data mismatch问题。
Test error与dev error通常应该一致,如果相差过远,说明模型在开发集上也出现了overfitting。考虑要扩大开发集
出现data mismatch怎么办?
当发生data mismatch的时候:
- Carry out manual error analysis to try to understand difference between training and dev/test sets
- Make training data more similar; or collect more data similar to dev/test sets.
针对第二点,可以采用数据合成(data synthesis),也就是以前提到过的data augment。数据合成是有效的。但是要小心的是,数据合成通常只能模拟真实世界的很小一部分,你的模型是有可能对这很小一部分over tune。所以要注意运用variance tactics来定位和解决此时的overfitting。