
1. error analysis
举个例子,猫类识别问题,已经建立的模型的错误率为10%。为了提高正确率,我们发现该模型会将一些狗类图片错误分类成猫。一种常规解决办法是扩大狗类样本,增强模型对够类(负样本)的训练。但是,这一过程可能会花费几个月的时间,耗费这么大的时间成本到底是否值得呢?也就是说扩大狗类样本,重新训练模型,对提高模型准确率到底有多大作用?这时候我们就需要进行error analysis,帮助我们做出判断。
我们可以从分类错误的样本中统计出狗类的样本数量。根据狗类样本所占的比重,判断这一问题的重要性。
假如狗类样本所占比重仅为5%,即时我们花费几个月的时间扩大狗类样本,提升模型对其识别率,改进后的模型错误率最多只会降低到9.5%。相比之前的10%,并没有显著改善。我们把这种性能限制称为ceiling on performance。
相反,假如错误样本中狗类所占比重为50%,那么改进后的模型错误率有望降低到5%,性能改善很大。因此,值得去花费更多的时间扩大狗类样本。
2. Cleaning up incorrectly labeled data
如果这些label标错的情况是随机性的(random errors),DL算法对其包容性是比较强的,即健壮性好,一般可以直接忽略
然而,如果是系统错误(systematic errors),这将对DL算法造成影响,降低模型性能。
如果是dev/test sets中出现incorrectly labeled data:
利用上节内容介绍的error analysis,统计dev sets中所有分类错误的样本中incorrectly labeled data所占的比例。
根据该比例的大小,决定是否需要修正所有incorrectly labeled data,还是可以忽略。举例说明,若:
Overall dev set error: 10%
Errors due incorrect labels: 0.6%
Errors due to other causes: 9.4%
上面数据表明Errors due incorrect labels所占的比例仅为0.6%,占dev set error的6%,而其它类型错误占dev set error的94%。因此,此时,可以忽略incorrectly labeled data。
优化DL算法后,出现如下情况:
Overall dev set error: 2%
Errors due incorrect labels: 0.6%
Errors due to other causes: 1.4%
上面数据表明Errors due incorrect labels所占的比例依然为0.6%,但是却占dev set error的30%,而其它类型错误占dev set error的70%。因此,这种情况下,incorrectly labeled data不可忽略,需要手动修正。
dev set的主要作用是在不同算法之间进行比较,选择错误率最小的算法模型。如果有incorrectly labeled data的存在,当不同算法错误率比较接近的时候,我们无法仅仅根据Overall dev set error准确指出哪个算法模型更好,必须修正incorrectly labeled data。
一般只修复 dev/test data上的标签
关于修正incorrect dev/test set data,有几条建议:
Apply same process to your dev and test sets to make sure they continue to come from the same distribution
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 distributions
3. Build your first system quickly then iterate
Set up dev/test set and metric
Build initial system quickly
Use Bias/Variance analysis & Error analysis to prioritize next steps
4. Training and testing on different distribution
当train set与dev/test set不来自同一个分布的时候,我们应该如何解决这一问题,构建准确的机器学习模型呢?
以猫类识别为例,train set来自于网络下载(webpages),图片比较清晰;
dev/test set来自用户手机拍摄(mobile app),图片比较模糊。假如train set的大小为200000,而dev/test set的大小为10000,显然train set要远远大于dev/test set。
将原来的train set和一部分dev/test set组合当成train set,剩下的dev/test set分别作为dev set和test set。
例如,200000例webpages图片和5000例mobile app图片组合成train set,剩下的2500例mobile app图片作为dev set,2500例mobile app图片作为test set。其关键在于dev/test set全部来自于mobile app。这样保证了验证集最接近实际应用场合。这种方法较为常用,而且性能表现比较好。
5. Bias and Variance with mismatched data distributions
如果train set和dev/test set来源于不同分布,则无法直接根据相对值大小来判断。例如某个模型human-level error为0%,training error为1%,dev error为10%。
根据我们之前的理解,显然该模型出现了variance。但是,training error与dev error之间的差值9%可能来自算法本身(variance),也可能来自于样本分布不同。比如dev set都是很模糊的图片样本,本身就难以识别,跟算法模型关系不大。因此不能简单认为出现了variance。
方法:
从原来的train set中分割出一部分作为train-dev set,train-dev set不作为训练模型使用,而是与dev set一样用于 验证。
此时,有training error、training-dev error和dev error。其中,training error与training-dev error的差值反映了variance(方差);
training-dev error与dev error的差值反映了data mismatch problem,即样本分布不一致。
举例:
如果training error为1%,training-dev error为9%,dev error为10%,则variance问题比较突出。
如果training error为1%,training-dev error为1.5%,dev error为10%,则data mismatch problem比较突出。
通过引入train-dev set,能够比较准确地定位出现了variance还是data mismatch。
总结:(参考)
通常,human-level error、training error、training-dev error、dev error以及test error的数值是递增的
但是也会出现dev error和test error下降的情况。这主要可能是因为 训练样本 比 验证/测试样本 更加复杂,难以训练。
6. Addressing data mismatch
如何解决train set与dev/test set样本分布不一致:
手动进行误差分析,尝试了解training dev/test sets的具体差异
-
尝试把training data变得更像dev sets一点,或收集更多类似 dev/test sets 的数据
- 人工合成数据
7. 迁移学习
将已经训练好的模型的一部分知识(网络结构)直接应用到另一个类似模型中去。比如我们已经训练好一个猫类识别的神经网络模型,那么我们可以直接把该模型中的一部分网络结构应用到使用X光片预测疾病的模型中去。这种学习方法被称为迁移学习(Transfer Learning)。
如果已有一个训练好的神经网络,用来做图像识别。现在,我们想要构建另外一个通过X光片进行诊断的模型。
迁移学习的做法是无需重新构建新的模型,而是利用之前的神经网络模型,只改变样本输入、输出以及输出层的权重系数\(W^{[L]}, b^{[L]}, W^{[L]}, b^{[L]}\)。
也就是说对新的样本(X,Y),重新训练输出层权重系数\(W^{[L]}, b^{[L]}, W^{[L]}, b^{[L]}\),而其它层所有的权重系数 \(W^{[l]}, b^{[l]}, W^{[l]}, b^{[l]}\)保持不变。
迁移学习可以保留原神经网络的一部分,再添加新的网络层。可以去掉输出层后再增加额外一些神经层。
迁移学习的应用场合主要包括三点:
Task A 和 B 有同样的 input x.
Task A 的数据比 Task B 的数据多很多.(希望提高B的性能,B的数据很少)
A的低层次特征(Low level features) 可以帮助任务B的学习,那么迁移学习更有意义.
8. 多任务学习
多任务学习(multi-task learning)就是构建神经网络同时执行多个任务。
这跟二元分类或者多元分类都不同,多任务学习:类似将多个神经网络融合在一起,用一个网络模型来实现多种分类效果。
如果有C个,那么输出y的维度是 \((C,1)\).
例如汽车自动驾驶中,需要实现的多任务为行人、车辆、交通标志和信号灯。如果检测出汽车和交通标志,则y为:
\left[
\begin{matrix}
0\\
1\\
1\\
0
\end{matrix}
\right]
\]
多任务学习模型的cost function为:
\]
其中,j表示任务下标,总有c个任务。对应的loss function为:
\]
Multi-task learning与Softmax regression的区别
Softmax regression是single label的,即输出向量y只有一个元素为1;
而Multi-task learning是multiple labels的,即输出向量y可以有多个元素为1。
多任务学习是使用单个神经网络模型来实现多个任务。实际上,也可以分别构建多个神经网络来实现。
如果各个任务之间是相似问题(例如都是图片类别检测),则可以使用多任务学习模型。另外,多任务学习中,可能存在训练样本Y某些label空白的情况,这并不影响多任务模型的训练。
多任务学习的应用场合主要包括三点:
Training on a set of tasks that could benefit from having shared lower-level features.
Usually: 每个任务的数据量很接近
Can train a big enough neural network to do well on all the tasks.
迁移学习和多任务学习在实际应用中,迁移学习使用得更多一些。
9. 什么是端到端的深度学习
端到端(end-to-end)深度学习:
- 将所有不同阶段的数据处理系统 或 学习系统模块 组合在一起,用一个** 单一的神经网络模型** 来实现所有的功能。它将所有模块混合在一起,只关心输入和输出。
以语音识别为例,传统的算法流程和end-to-end模型的区别如下:
如果训练样本足够大,神经网络模型足够复杂,那么end-to-end模型性能比传统机器学习分块模型更好。
- end-to-end让神经网络模型内部去 自我训练 模型特征,自我调节,增加了模型整体契合度。
10. 是否要使用端到端的深度学习
end-to-end深度学习:
优点:
Let the data speak
Less hand-designing of components needed
缺点:
May need large amount of data
Excludes potentially useful hand-designed