Error Analysis
Carrying out error analysis
关于error analysis,在机器学习的笔记中,我们有所提及。
当我们想利用深度学习来完成一项人类可以完成的很好的任务时,比如图像识别,在我们处理了bias,variance问题,但是模型的performance还是无法达到human-level的时候,我们就可以考虑进行error analysis,它会帮助我们去寻找突破口。
一般呢,error analysis就是挑选出错误分类的dev set,比如100个,1000个等,然后人工地进行数数,分类。
如下图(图像识别判断猫),我们发现可能有3个问题影响了我们模型地performance。
- 把狗认成了猫
- 把一些大型猫科动物(狮子,豹子)认成猫
- 由于分辨率太低,错误判断
当然在我们进行数数分类的过程中,我们还有可能发现潜在的导致分类错误的问题,我们可以及时加入到下面的表格中(再开一列)。
最后我们得到了对应idea所占的百分比,error analysis仅仅是给我们一个思路,来帮助我们判断哪些方向可能有助于我们提高accuracy,但是它并不会给我们提供相应的数学公式。比如下图,由于great cat 和 blurry所占比重很大,我们有理由相信针对这两点进行一些算法设计或者模型改善能够提高我们的accuracy。
Cleaning up incorrectly labeled data
在实际中,我们可能会发现,我们的data set里面有一些被错误标注的数据,比如判断猫,明明图像是狗,也被label为1。那这个时候应该怎么办呢。
1. DL algorithms are quite robust to random errors in the training set.
那如果我们训练集里的错误标注的数据占比很小,而且都是一些随机的错误,比如由于工作人员误敲等,那么几乎没有什么影响
2. Systematic error
如果被误标注的数据具有系统性,比如几乎或者很多白色的狗都被标注为了猫,那么这就可能是一个需要关注的问题了。
3. 如果dev/test set有误标注数据怎么办呢
那么我们就在进行error analysis的时候,加一栏来数有多少是因为错误标注导致的error。如果占比很高,那么我们就要考虑进行修正,如果如图6%,那么这个带来的收益就非常小了,可以忽略。
在进行标注纠正的时候需要注意
a. dev/test set 都需要进行纠正来保证它们来自相同的分布
b. 纠正分类错误的标注错误的样本,同时也要纠正分类正确的标注错误的样本(希望大家不要被绕昏)
c. train set 略微与dev/test set分布不相同可以接受,我们可以不用纠正train set里面的错误标注样本
Build your first system quickly, then iterate
如果我们正在从事的项目,有着大量前人的经验,有着很多效果好的框架结构,比如需要搭建一个人脸识别的应用,那么我们不需要遵从这个标题,我们可以从一开始就搭建一个较为复杂的网络。
如果我们的项目,是一个相对较新的领域,那么我们的宗旨应该是迅速建立一个模型,然后不断进行循环来改进。
- Set up dev/test set and metrc
- Build inital system quickly
- Use Bias/Variance analysis & Error analysis to prioritize next steps
Mismatched training and dev/test est
Training and testing on different distributions
我们知道对于深度学习来说,数据量需求是非常大的,尤其是训练集,往往train set的大小决定了accuracy。于是在实际操作中,很多团队把只要能用的数据都输入到网络里,那么往往呢,这导致了train 和 dev/test来自不同的分布。那么我们应该怎么进行数据划分呢。
如下图,同样还是以cat app为例,来自手机app的图片是我们真正关心的数据,明显和网页上的数据就很不同。但是网页上的数据量,我们应该如何利用呢,有两种方法。
- 直接全部混合在一起,然后进行划分。
- dev/test全部来自于手机app,各2500,剩下的5000 shuffle进那200000的web data里。
显然第一种不合理,这样它将改变我们dev/test的分布,让我们的训练出的model不能很好的运用到实际中。但是同样的,运用第二种方法是不是也会引入问题呢?
Bias and Variance with mismatched data distributions
承接上面的疑问,我们的回答是当然可能会引入问题。首先我们讲如何发现这个问题。
为了发现data mismatch的问题,我们需要引入一个叫做training-dev set的新概念,这个数据集呢,来自于training set,大小和dev/test set差不多,那么用于模型训练的数据集就变成了原来的training set除去training-dev set(新的训练集),然后依次用training-dev set 和 dev set测试发现问题。
现在我们就有4个数据集了,training/training-dev 来自同一分布,dev/test 来自同一分布。如下图,我们通过training/training-dev来判断variance的问题,通过training-dev/dev来判断data mismatch的问题。
Addressing data mismatch
当我们发现,我们的模型确实存在data mismatch问题的时候我们应该如何应对呢,首先要说明的一点是,对于data mismatch没有类似于解决bias或variance问题有很多很系统的方法。如下图,我们只能人工进行分析,来理解training和dev/test的差别,然后尽量去让training data去靠近dev/test data或者去收集更多的跟dev/test data相似的数据。比如进行人工数据合成。
假设我们现在在进行车载语音识别,然后我们的training data很干净,而dev/test 有很多噪音,那么这个时候我们就可以将我们的training data加上car noise。但是这里有需要注意的一点,如果我们有10000小时的training data,而car noise只有1小时,那如果10000小时的training data反复利用这1小时的car noise,模型可能会对这1小时的car noise过拟合,所以我们可能需要多收集一些car noise。
Learning from multiple tasks
Transfer learning
神经网络一个很强大的应用和功能,就是我们能将神经网络从一个任务中所学习到的知识,特征等运用到一个相似的但是不同的任务上,比如一个神经网络已经完成了对于猫的学习,那么我们可以运用这个神经网络或者部分这个神经网络来帮助我们更好地进行X-射线扫描图片的学习,这叫做迁移学习。
如下图,绿色箭头表示神经网络完成了图像识别的训练,紫色代表训练放射图像。如何进行迁移学习呢,就是我们删除网络的最后一层包括输出和权重,然后连接一个新的输出层来训练(当然也可以连接一个多层的小网络)。根据我们radiology data的多少来决定我们重新训练几层,如果数据量少,就训练输出层,如果数据量多,可能往前多训练几层,如果数据量大,可能全部训练。如果全部训练的话,image recognition 叫做pre-training,radiology diagnose 叫做fine-tuning。
那么为什么这样做可行呢,因为对于图像来说底层提取出来的一些特征无非就是edges,curves,positive object等,大量的数据训练将有助于模型于理解图像的结构和本质,就会为radiology 提供帮助,使得训练更快,需要少量的数据。
最后我们讲解一下什么样的情况下,我们会选择迁移学习,或者说怎么样迁移学习才会取得好的效果。如下图,这里需要强调一下第二点,a lot more 也就是远远多于。如果我数据量只比你多一点点,那从我这儿迁移不了什么东西过去。
迁移学习的应用非常多,因为对于某些领域来说,我们有很多的数据,但是对于某些领域数据量很少,而且采集也很不方便,很昂贵。比如上面的例子,X-射线扫描图片数据量就很少,可是图像识别,那么就有数以亿计的数据。
Multi-task learning
对于迁移学习来说,我们先训练task A,然后迁移到task B。而所谓多任务学习呢,指的是用一个神经网络同时进行多个任务的学习,然后对于每个task的学习都会同时帮助到其他task的学习。
举例,如下图,对于简易的自动驾驶呢,我们需要判断图片里是否有行人,车辆,标识和交通灯。如果是以前呢,我们需要建立4个神经网络来分别对4种东西进行分类,现在呢我们就用一个神经网络来进行。
由于我们的y向量不再是一个one hot的向量,那么自然我们的损失函数就需要发生变化,如下,这里需要强调,如果我们的y向量有问号,即没有标注的地方,那么同样也是可以训练的,不过我们在计算损失函数的时候,不把它们算在里面。
最后我们讲解一下什么样的情况下,我们会选择多任务学习,或者说怎么样多任务学习才会取得好的效果。第一点不说了跟迁移学习一个道理,第二点,其实也可以类比迁移学习,当我们单独看一个task的时候,其他task就相当于迁移学习里的taskA,那么大家data数量相当,就保证对于每个task来着,都能够从别的task上学到东西。第三点需要强调,我们的总数据量必须足够让我们训练一个足够大的网络,如果总的数据量不够的话,那么多任务学习还不如分开各自学习的效果好。
在实际中,迁移学习的应用要远远多于多任务学习,因为多任务学习的条件相对苛刻,现在一般就运用在机器视觉当中,同时进行多物体识别。而迁移学习的应用更为广泛。
End-to-end deep learning
What is end-to-end deep learning?
所谓end-to-end DL,就是省去所有的数据预处理阶段,直接将raw data输入到神经网络中完成学习输出结果。如下图。
不可能平白无故有这么好的事情,为了实现end-to-end DL,我们需要相较于以前多很多的数据,继续讨论上图的系统,如果采用有预处理的模型,那么可能3000小时的数据量就可以取得很好的结果了,如果是用end-to-end可能需要10000,甚至100000小时的数据才行,当然如果我们拥有中等大小的数据量,我们可以减少一些预处理阶段,并不全部取消,比如取消MFCC。
接下来再举一个例子,比如我们现在想要设计一个人脸识别的门禁系统,现在已有的系统呢,分为两个步骤,第一步是确定人脸位置,然后zoom-in再进行第二步人脸对比,这分别由两个网络组成,为何不使用end-to-end呢,因为如果分成两个系统我们的数据有很多,可是如果使用end-to-end的话,我们的数据就不够了,所以如果数据量是够的,那么end-to-end可能会优于现在的系统。
Whether to use end-to-end deep learning
首先先讲解一下end-to-end的好处和坏处
好处:
- 让数据说话,让数据自己训练出特征,然后完成分类,不仅简单,不用复杂的数据预处理,而且效果还好。
- 更少的人工干预,更少的人工设计环节,我们要知道,人类的一些对事物的认知,不一定就能够最有效的完成工作。
坏处: - 需要大量的数据
- 排除了有用的人工设计环节
这里对于人工干预呢,需要说明一下,如果你拥有的数据量很大很大,没有人工干预往往会比较好,让数据说话。但是如果没有足量的数据,那么有效的人工干预就显得很有必要。
所以对于end-to-end来说,其本质就是需要大量的数据,只要有了大量的数据,end-to-end才变得有可能。