吴恩达深度学习课程笔记-8

﹥>﹥吖頭↗ 提交于 2020-02-01 00:11:10

03. 结构化机器学习项目

第二周 机器学习策略(二)

2.1 误差分析

 前面提到,对于模型错误率高于人类错误率的,可以采取误差分析等方法改进。比如,将分类模型分类错误的样本拎出来看看,找找主要原因,找找提升空间更大的改进方向,而不是自己瞎猜盲干。

吴恩达老师给出的方法:抽取一部分模型出错的样本,比如100个,挨个查看分析原因,列一个表格统计不同原因下的样本数。

图像 原因1 原因2 ... 备注
1     ...
2      
3    
...        
百分比        

可以在逐个查看的过程中添加新的原因。显然,那些占百分比更高的原因有着更大的提升空间。

2.2 数据标注错误

在上面误差分析的过程中可能会发现一些标签错误的样本,如何处理?

  • 深度学习方法对于训练集中的随机错误标签具有非常高的鲁棒性,尤其在训练样本很多的时候,这部分错误标签产生的影响微乎其微;而系统错误,比如所有的白狗都被标记为猫,产生的影响不可忽略;
  • 对于验证集中的错误标签,可以在前面那个表格中增加一列进行统计,判断错误标签是否对模型准确率产生了较大的影响,如果是,那就要花时间纠正这些错误,否则没必要;
  • 注意,验证集和测试集要采取同样的处理方法,确保有相同的分布;

2.3 快速搭建一个系统

如果是从头开始一个项目,不要先考虑太多问题,不要先考虑太多改进措施,先快速搭建一个系统,开始迭代,根据结果再采取误差分析、偏差方差分析等方法决定下一步要干什么。

2.4 在不同分布的数据上进行训练和测试

在实际项目中,训练集和测试集的分布不同是常见的问题,考虑以下场景:通过网络爬取等方法收集了大量训练图片约200k张,而实际应用场景的图片只收集了约10k张,该如何划分训练/开发/测试集?

推荐做法:网络收集的200k张图片作为训练集,然后将实际应用场景的图片分成5k开发集和5k测试集,或者将实际应用场景图片的一半放入训练集共205k张,剩下的分成2.5k开发集和2.5k测试集。

因为开发集的指标是项目的目标,如果将所有的图片混在一起再划分,那么开发集中大部分都将是网络图片,造成项目的目标就偏了!

2.5 & 2.6 数据不匹配

再来思考,如果按照前一节的划分方法,训练集和开发集的数据分布不同,那还能用开发集上的评估结果来衡量方差、偏差吗?你细品……

那肯定是不能了,解决方法是在训练集中分出一个训练-开发集(training-dev set),这样训练-开发集和训练集的数据分布是一样的,可以用来分析偏差/方差,下面举例分析可能出现的几种情况:

 
Human level 0% 0% 0% 0%
Training error 1% 10% 1% 7%
Training-dev error 9% 11% 1.5% 10%
Dev error 10% 12% 10% 6%
Test error 11% 12% 11% 6%

注意:“Human level”和“Training error”之间的差距表示偏差(可避免偏差),“Training error”和“Training-dev error”之间的差距表示方差,“Training error”和“Dev error”之间的差距表示数据不匹配,“Dev error”和“Test error”之间的差距表示开发集的过拟合程度。

上表中①存在方差问题,②存在偏差问题,③存在数据不匹配问题,④这种情况也有可能存在,就是实际情况比训练集中的情况更简单。

方差、偏差问题的解决方法前面讲过很多了,如果出现开发集过拟合也可以考虑扩充开发集的样本数量,但是对于数据不匹配,还没有统一的方法有效的解决。可以通过误差分析试着找出数据不匹配的问题,然后收集更多数据或者采用数据合成来减小训练集和开发集/测试集的差异。

数据合成是常用的方法,比如用安静环境下的声音叠加室外噪声来模拟真实语音,这样往往能够起到一定作用,但是有可能引入新的问题,比如收集了安静环境下的声音10000小时,但室外噪声只有100小时,用这些噪声合成的语音训练网络,有可能会使网络对这100小时噪声过拟合,尽管在人类听来并无差别。

2.7 迁移学习

如果已经训练好的任务A网络可以学习到的知识应用到类似的任务B上,而不是再重新训练任务B网络,这在任务B的数据要远远少于任务A时很有必要,因此迁移学习非常有用。

比如一个训练好的图像识别网络,如果要把它用于医学图像诊断,可以将原来训练好的网络最后一层的参数重新随机初始化,然后再用医学图像训练诊断任务,这样也能取得很好的效果。

对于目标任务来说,之前的物体识别网络称为预训练模型(pre-training);而对原网络来说,后面的再训练称为微调(fine tuning)。

迁移学习去掉的可以是原网络的最后一层或者几层,也可以是增加几层。如果目标任务的数据够多,可以对整个网络的参数继续训练,如果数据不多,可以固定前面的参数,只训练最后几层。

运用迁移学习的条件是:

  • 任务A和任务B有着同样的输入,比如都是图像;
  • 任务A的数据要比任务B的数据多得多;
  • 任务A处理一些低级特征的能力对于任务B有帮助;

2.8 多标签学习

原课程题目是多任务学习,不过吴恩达老师讲的多任务在我看来应当归于多标签。前面提到图片分类任务都是一张图片给一个标签,而多标签任务是对图片中的多个物体都给出标签,这其实可以在一个神经网络中完成,只要增加网络输出层的单元数量,代价函数改为多标签的代价函数进行训练即可。

多标签能够起作用,在于识别物体时处理低级特征的能力是共通的,而且只要网络足够大,一般多标签网络的效果要比为每一种物体单独训练一个识别网络的效果要好。

2.9 & 2.10 端到端学习

传统的机器学习在处理一些任务时往往有很复杂的流水线,有很多手工设计的步骤。

而端到端学习不一样,直接喂给一个网络原始数据作为输入和想要的内容作为目标就可以训练出一个不错的模型,比如机器翻译。这看起来很不错,确实端到端学习很有用,可以省去很多中间流程的手工设计,而且是纯靠数据说话,避免了人为设计引入的偏见。但它不是灵丹妙药,并不总是起作用,一个基本的要求就是端到端学习的数据要足够多,相比较之下,传统流水线可能在数据量较少的时候就表现的很好,毕竟有些精心设计的组件很有用处,这点端到端学习不行。

在决定应用端到端学习之前先问自己,有没有足够的数据来训练一个足够复杂的端到端网络?

当端到端学习所需的数据并不十分充分时,将任务分成几个子任务或许可以大大降低难度,比如下面这个人脸打卡任务:

 

原任务的数据很少,但人脸检测、人脸识别的数据很多,拆成两个子任务使得这一任务更加容易。 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!