本文是我自己学习吴恩达老师在DeepLearning系列课程的第三部分:Structuring Machine Learning Project第二周课程的笔记
1. 误差分析(Erro Analysis)
为了减小误差,我们需要确定下一步优化方向,这时人工来做错误分析就十分重要了。通过检查Dev/Set中错误情况,我们具体分析误差的原因。比如猫的分类器,误差可能是把狗,其他猫科动物识别成猫,可能是图片模糊,可能是sample没有正确标记。所以我们通过分析一定数量,比如找100个错误识别的样例,得出每种误差可能占比,从而确定哪个因素值得我们下一步优化
DL对于训练集中的random erro是具有鲁棒性,所以可以不用费时间去修改。对于Dev和Test中出现的错误标记情况,我们根据误差分析里的类型占比来确定是否值得花时间去修正。如上如左列错误标记的占比并不大,而右列的情况就值得我们花一定时间进行修正了。
2. 训练数据与开发/测试数据不一致(Mismatched)
分配Training,Dev,Test Set数据
DL的基础就是数据,但是实际中我们经常遇到的情况是对于我们的目标没有足够数据,所以我们采用的训练数据有时不能正确反映我们的目标。还是拿猫的分类器做简单例子,如果我们的目标是对手机拍摄的猫照片进行分类,那我们需要的训练数据应该是手机拍摄的照片。但这个数量可能只有10k,而其他方式收集来的数据比如网络上高清的猫图片有200k,所以我们要利用网络上图片的话,就会产生训练数据与开发/测试数据不一致的问题。我们Dev/Test要和我们的目标一致(Hit the Target), 所以Dev和Test Set数据来源各2.5K手机拍摄的猫照片。为了利用其它方式收集来的数据,我们将剩下的5K手机拍摄和网络的200K混合后作为训练数据。
数据不一致下的评估
当训练数据和开发/测试数据分布不一致的时候,我们做误差分析时要考虑到这方面的影响,所以我们增加一个data mismatch的指标。在Training Set里分割一个集合作为Training-Dev, 这个集合不参与训练,用来同Dev Set做对比
data mismatch指标说明了训练数据和开发数据之间的差异,Dev上的误差率会比Training-Dev大,但也可能像右栏的情况Dev误差率更贴近Human Level.
解决data mismatch的方法: 1. 人工分析Training和Dev集上的差异在哪里,比如噪音,清晰度之类 2. 针对差异使训练数据和开发数据更像,如通过人工合成
3. 迁移学习
迁移学习是将训练过的模型应用到我们的目标上,获得更好更快的效果。训练过的模型(Pre-Trianed)往往通过大数据已经学到有用的low-level feature的描述,所以transfer之后同样能有好的表现
通常我们将训练过的NN里面最后一层参数初始化,保留其他层的参数, 再通过我们的目标训练集的训练重新获得最后一层的参数(也叫Fine-tuning)。有时也可以去掉最后一层之后按照需求添加更多的层数,如下图第二种所示
Transfer A to B的条件:
1. Task A和Task B有着相同的输入,比如都是图片,都是语音信号
2. A比B有更多的数据
3. 训练出的底层特征B能用得上
4. 多任务学习
我们有时不止一个目标,比如在自动驾驶,我们希望汽车能同时够识别出行人,交通灯,指示牌等物体。当然我们可以建造多个单目标的网络,但是用多任务学习可以通过单个网络实现多个任务。具体来说多任务学习是赋予一个例子多个标签,预测结果也有相应的多个表示。
计算Loss的时候需要将出现的多个标签预测结果加起来,如果样例中某项标签缺失,则不计算在内(即图中?项)
多任务学习的适用场景: 1. 多个目标共享共同的底层特征 2. 每个目标的训练数据相似 3. 有一个足够大的网络可以实现所有任务
5.端到端学习
End-End Learning是输入数据,直接得到输出,没有人为的中间步骤。举个例子,人脸识别的门禁系统。End-End是输入图像后直接输出门是否打开。而我们一般可以把复杂的任务分解成多个子任务,人脸识别从图像中截取人脸,然后人脸匹配从数据库中得到权限信息,根据权限再决定门是否打开。
端到端学习的优缺点:
Pros:1. 让数据说话,避免人类感知的打扰 2. 减少了人为设计的步骤
Cons:1. 端到端需要大量的数据 2. 去除掉了可能有用的人为设计
决定端到端学习的关键点:是否有足够大的数据来支持