深度学习教程 | AI应用实践策略(下)
- 作者:韩信子@ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/35
- 本文地址:http://www.showmeai.tech/article-detail/220
- 声明:版权所有,转载请联系平台与作者并注明出处
收藏ShowMeAI查看更多精彩内容
本系列为吴恩达老师《深度学习专项课程(Deep Learning Specialization)》学习与总结整理所得,对应的课程视频可以在这里查看。本系列为吴恩达老师《深度学习专业课程》学习与总结整理所得,对应的课程视频可以在这里查看。
引言
在ShowMeAI前一篇文章 AI应用实践策略(上) 中我们对以下内容进行了介绍:
- 正交化方法(Orthogonalization)
- 建立单值评价指标
- 数据集划分要点
- 人类水平误差与可避免偏差(Avoidable Bias)
- 提高机器学习模型性能总结
本篇是吴恩达老师第3门课《Structuring Machine Learning Projects》(构建机器学习项目)后半部分的总结梳理。内容主要覆盖误差分析、系统迭代、数据匹配与定位、迁移学习、多任务学习、端到端系统等。
1.错误分析
如果希望让学习算法能够胜任人类能做的任务,但学习算法还没有达到人类的表现,那么人工检查一下算法犯的错误可以了解接下来应该做什么,这个过程称为错误分析(error analysis)。
假设正在调试猫分类器,取得了90%准确率,相当于10%错误,注意到算法将一些狗分类为猫,需要对模型的一些部分做相应调整,才能更好地提升分类的精度。
1.1 收集错误样例
在开发集(测试集)中,获取大约100个错误标记的例子,然后手动检查,一次只看一个,看看开发集里有多少错误标记的样本是狗。
- 100个数据中有5个样例是狗,如果对数据集的错误标记做努力去改进模型的精度,可以提升的上限是5%,仅可以达到9.5%的错误率,称为性能上限(ceiling on performance)。这种情况下,这样耗时的努力方向不是很值得的事。
- 100个数据中,有50多个样例是狗,改进数据集的错误标记是一个值得的改进方向,可以将模型的精确度提升至95。
这种错误分析虽然简单,但是能够避免花费大量的时间精力去做一些对提高模型性能收效甚微的工作,让我们专注解决影响模型正确率的主要问题,十分必要。
错误分析可以同时评估多个影响模型性能的因素,通过各自在错误样本中所占的比例来判断其重要性。例如,猫类识别模型中,可能有以下几个可以优化的影响因素:
- 修改那些被分类成猫的狗狗图片标签。
- 修改那些被错误分类的大型猫科动物,如:狮子,豹子等。
- 提升模糊图片的质量。
可以建立表格来做并行的分析。如下图所示:
在最左边,人工过一遍想分析的图像集,电子表格的每一列对应要评估的想法,如狗(Dog)的问题、猫科动物(Great cats)的问题、模糊图像(Blurry images)的问题,最后一列写评论(Comments)。
在这个步骤做到一半时,可能会发现其他错误类型,比如可能发现有Instagram滤镜,那些花哨的图像滤镜,干扰了分类器。在这种情况下可以在错误分析途中,增加一列多色滤镜(Instagram滤镜和Snapchat滤镜),再过一遍,并确定新的错误类型百分比,这个分析步骤的结果可以给出一个估计,是否值得去处理每个不同的错误类型。
最终汇总到上述这样的表格里,我们可以敲定更有效的优化策略:把团队可以分成两个团队,其中一个改善大猫的识别,另一个改善模糊图片的识别。
1.2 小结
总结一下,进行错误分析时,你应该观察错误标记的例子,看看假阳性和假阴性,统计属于不同错误类型的错误数量(如上图)。在这个过程中,你可能会得到启发,归纳出新的错误类型。总之,通过统计不同错误标记类型占总数的百分比,有助于发现哪些问题亟待解决,或者提供构思新优化方向的灵感。
2.修正错误标记
我们用mislabeled examples来表示学习算法输出了错误的\(Y\)值。而在做错误分析时,有时会发现数据集中有些样本被人为地错误标记(incorrectly labeled)了,这时该如何处理呢?
2.1 训练集错标
如果是在训练集中,由于机器学习算法对于随机误差的稳健性(Robust)(也称作「鲁棒性」),只要这些出错的样本数量较小,且分布近似随机,就不必花费时间一一修正。
2.2 验证集/测试集错标
如果是验证集与测试集中出现错标样本,该怎么处理呢?
方法很简单,使用上一小节内容介绍的错误分析方法,统计验证集中所有分类错误的样本中错标数据的占比。根据占比大小,决定是否需要修正所有错标数据,还是可以忽略。如下举例说明:
(1) case1
如果评估算法后,是如下这种情况:
- 总体验证集错误率:10%
- 错标样本错误率:0.6%
- 其他原因引起的错误率:9.4%
上面情况下错标样本引起的验证集错误率占比仅为0.6%,占验证集错误情况的6%,而其它类型错误占验证集错误情况的94%。这种情况下,可以忽略错标数据。
(2) case2
如果评估算法后,是如下这种情况:
- 总体验证集错误率:2%
- 错标样本错误率:0.6%
- 其他原因引起的错误率:1.4%
上面情况下错标样本引起的验证集错误率占比依然为0.6%,但是却占验证集错误情况的30%,而其它类型错误占验证集错误情况的70%。这种情况下,错标数据不可忽略,需要手动修正。
通过前面的内容,我们了解到验证集的主要作用是「在不同算法之间进行比较,选择错误率最小的算法模型」。但是,如果验证集有错标数据的存在,当不同算法错误率比较接近的时候,我们无法仅仅根据总体验证集的效果判断哪个算法模型更好,必须修正错标数据。
关于修正错标数据,吴恩达老师还给出了一些建议:
- 在验证集和测试集上同时使用同样的修正手段,以保证验证集和测试集来自相同的分布。
- 同时检查判断正确和判断错误的例子(通常不用这么做)。
- 在修正验证集和测试集时,鉴于训练集的分布不必和验证/测试集完全相同,可以不去修正训练集。
3.快速搭建系统并迭代
如果我们想搭建一个全新的机器学习系统,吴恩达老师建议根据以下步骤快速搭建好第一个系统,然后反复迭代优化:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GX2QivZl-1649925346046)(http://image.showmeai.tech/deep_learning_tutorial/143.png)]
- 设置好训练、验证、测试集及衡量指标,确定目标。
- 快速训练出一个初步的系统,用训练集来拟合参数,用验证集调参,用测试集评估。
- 通过偏差/方差分析以及错误分析等方法,决定下一步优先处理的方向。
4.在不同的分布上训练和测试
有时,我们很难得到来自同一个分布的训练集和验证/测试集。当训练集与验证/测试集不来自同一个分布的时候,我们应该如何解决这一问题,构建准确的机器学习模型呢?
仍以猫识别作为例子,我们的训练集可能由网络爬取得到,图片比较清晰,而且规模较大(例如20万);而验证/测试集可能来自用户手机拍摄,图片比较模糊,且数量较小(例如1万),难以满足作为训练集时的规模需要。
虽然验证集测试集图片质量不高,但是模型最终主要应用在对这些模糊的照片的处理上。有两种解决方法处理训练集和验证/测试集分布不一致:
①方法1:将训练集和验证/测试集完全混合,然后再随机选择一部分作为训练集,另一部分作为验证/测试集。
例如,混合210000例样本,然后随机选择205000例样本作为训练集,2500例作为验证集,2500例作为测试集。
这种做法的优点是实现训练集和验证/测试集分布一致。缺点是验证/测试集中webpages图片所占的比重比mobile app图片大得多。(例如dev set包含2500例样本,大约有2381例来自webpages,只有119例来自mobile app。算法模型对比验证仍然主要由webpages决定,实际应用的mobile app图片所占比重很小,达不到验证效果。)
②方法2:将原来的训练集和一部分验证/测试集组合当成训练集,剩下的验证/测试集分别作为验证集和测试集。
例如,200000例webpages图片和5000例mobile app图片组合成训练集,剩下的2500例mobile app图片作为验证集,2500例mobile app图片作为测试集。
这种做法的核心在于验证/测试集全部来自于mobile app。这样保证了验证集最接近实际应用场合。这种方法较为常用,而且性能表现比较好。
5.数据不匹配
5.1 数据不匹配问题
ShowMeAI上一篇内容 AI应用实践策略(上) 里介绍过,根据人类表现误差、训练误差和验证误差的相对差异可以判定是否出现了bias或者variance。不过有一个问题:
如果训练集和验证/测试集来源于不同分布,则无法直接根据相对值大小来判断。
例如某个模型人类表现误差为0%,训练误差为1%,验证误差为10%。按照 AI应用实践策略(上) 里的方法我们会判断该模型出现了variance。但训练误差与验证误差之间的差值9%可能来自算法本身(variance),也可能来自于样本分布不同。(比如dev set都是很模糊的图片样本,本身就难以识别,跟算法模型关系不大。)
这种情况下,不能简单认为出现了variance。
在可能伴有训练集与验证/测试集分布不一致的情况下,定位是否出现variance的方法是设置定义一个训练-验证集(Training-dev Set)。训练-验证集和训练集的分布相同(或者是训练集分割出的子集),但是不参与训练过程,而是用于验证。
现在,我们有了训练集错误率、训练-验证集错误率,以及验证集错误率。其中,训练集错误率和训练-验证集错误率的差值反映了variance方差;而训练-验证集错误率和验证集错误率的差值反映了样本分布不一致的问题,从而说明模型擅长处理的数据和我们关心的数据来自不同的分布,我们称之为数据不匹配(Data Mismatch)问题。
举例说明,如果训练集错误率为1%,训练-验证集错误率为9%,验证集错误率为10%,则variance方差问题比较突出。如果训练集错误率为1%,训练-验证集错误率为1.5%,验证集错误率为10%,则数据不匹配比较突出。通过引入训练-验证集,能够比较准确地定位出现了variance还是数据不匹配问题。
总结人类水平误差、训练集错误率、训练-验证集错误率、验证集错误率、测试集错误率之间的差值所反映的问题如下图所示:
5.2 处理方法
吴恩达老师给出了2条关于解决数据不匹配问题的建议:
- ① 做错误分析,尝试了解训练集和验证/测试集的具体差异(主要是人工查看训练集和验证集的样本);
- ② 尝试将训练数据调整得更像验证集,或者收集更多类似于验证/测试集的数据。
要将训练数据调整得更像验证集,我们可以使用人工数据合成方法(artificial data synthesis)。
以语音识别问题为例,实际应用场合(验证/测试集)是包含背景噪声的,而作为训练样本的音频很可能是清晰而没有背景噪声的。为了让训练集与验证/测试集分布一致,我们可以给训练集人工添加背景噪声,合成类似实际场景的声音。
人工合成数据能够使数据集匹配,从而提升模型的效果。但需要注意的是,不能给每段语音都增加同一段背景噪声,因为这样模型会对这段背景噪音出现过拟合现象,使得效果不佳。
6.迁移学习
迁移学习(Tranfer Learning)是通过将已训练好的神经网络模型的一部分网络结构应用到另一模型,将一个神经网络从某个任务中学到的知识和经验运用到另一个任务中,以加快训练学习速度和提升模型效果。
例如,我们将为猫识别器构建的神经网络迁移应用到医疗影像诊断中。
猫识别器神经网络训练完成后,已经学习到了一些有关图像的结构和性质等方面的知识,这时候只要先删除神经网络中原有的输出层,加入新的输出层并随机初始化权重系数(\(W^{[L]}\)、\(b^{[L]}\)),随后用新的训练集进行训练,就完成了以上的迁移学习。
如果新的数据集很小,可能只需要重新训练输出层前的最后一层的权重,即\(W^{[L]}\)、\(b^{[L]}\),并保持其他参数不变;而如果有足够多的数据,可以只保留网络结构,重新训练神经网络中所有层的系数。这时初始权重由之前的模型训练得到,这个过程称为预训练(Pre-Training),之后的权重更新过程称为微调(Fine-Tuning)。
上述过程的迁移学习会有效,是因为神经网络浅层部分能够检测出许多图片固有特征,例如图像边缘、纹理、曲线等。使用之前训练好的神经网络部分结果有助于我们更快更准确地提取X光片特征。二者处理的都是图片,而图片处理是有相同的地方,第一个训练好的神经网络已经帮我们实现如何提取图片有用特征了。因此,即便是即将训练的第二个神经网络样本数目少,仍然可以根据第一个神经网络结构和权重系数得到健壮性好的模型。
你也可以不止加入一个新的输出层,而是多加几个新层。
吴恩达老师指出,迁移学习适用于满足以下条件的场景:
- 两个任务有同样的输入(比如都是图像或者都是音频);
- 拥有更多数据的任务迁移到数据较少的任务;
- 某一任务的低层次特征(底层神经网络的某些功能)对另一个任务的学习有帮助。
7.多任务学习
除了我们前面讲到的构建神经网络解决二分类或者多分类任务,神经网络还可以完成多任务学习(Multi-Task Learning),它指的是使用单个神经网络模型,利用共享表示采用并行训练同时学习多个任务。
多任务学习的基本假设是多个任务之间具有相关性,并且任务之间可以利用相关性相互促进。例如,属性分类中,抹口红和戴耳环有一定的相关性,单独训练的时候是无法利用这些信息,多任务学习则可以利用任务相关性联合提高多个属性分类的精度。
下面是一个汽车自动驾驶的例子。这个场景中需要实现的多任务是识别行人、车辆、交通标志和信号灯。多任务学习模型的成本函数及对应的损失函数为:
其中,\(j\)代表任务下标,总有\(c\)个任务。
多任务学习和Softmax回归看上去有些类似,容易混淆。它们的区别是,Softmax回归的输出向量\(y\)中只有一个元素为1;而多任务学习的输出向量\(y\)中可以有多个元素为1。
吴恩达老师指出,多任务学习的应用场景有以下特质:
- 训练的一组任务可以共用低层次特征;
- 通常,每个任务的数据量接近;
- 能够训练一个足够大的神经网络,以同时做好所有的工作。多任务学习会降低性能的唯一情况(即和为每个任务训练单个神经网络相比性能更低的情况)是神经网络还不够大。
在多任务深度网络中,低层次信息的共享有助于减少计算量,同时共享表示层可以使得几个有共性的任务更好的结合相关性信息,任务特定层则可以单独建模任务特定的信息,实现共享信息和任务特定信息的统一。
在实践中,多任务学习的使用频率要远低于迁移学习。计算机视觉领域中的物体识别是一个多任务学习的例子。
8.端到端学习
8.1 端到端学习与传统流水线
在传统的机器学习分块模型中,每一个模块处理一种输入,然后其输出作为下一个模块的输入,构成一条流水线。而端到端深度学习(End-to-end Deep Learning)将所有不同阶段的数据处理系统或学习系统模块组合在一起,只用一个单一的神经网络模型来实现所有的功能。它将所有模块混合在一起,只关心输入和输出。
如果数据量较少,传统机器学习分块模型所构成的流水线效果也不错。但如果训练样本非常大,应用的神经网络模型比较复杂,那么端到端深度学习模型的性能会比传统机器学习分块模型更好。
而如果数据集规模适中,还是可以使用流水线方法,但是可以混合端到端深度学习,通过神经网络绕过某些模块,直接输出某些特征。
如下是语音识别模型中传统流水线流程、混合模式和端到端学习模式的对比示意图。
8.2 端到端学习优缺点
如下是端到端学习的优缺点总结:
优点
- 只要有足够多的数据,剩下的全部交给一个足够大的神经网络。比起传统的机器学习分块模型,可能更能捕获数据中的任何统计信息,而不需要用人类固有的认知(或者说,成见)来进行分析
- 所需手工设计的组件更少,简化设计工作流程
缺点
- 需要大量的数据
- 排除了可能有用的人工设计组件
总结一下,决定一个问题是否应用端到端学习的关键点是:是否有足够的数据,支持能够直接学习从\(x\)映射到\(y\)并且足够复杂的函数。
ShowMeAI系列教程推荐
- 图解Python编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解AI数学基础:从入门到精通系列教程
- 图解大数据技术:从入门到精通系列教程
- 图解机器学习算法:从入门到精通系列教程
- 机器学习实战:手把手教你玩转机器学习系列
- 深度学习教程 | 吴恩达专项课程 · 全套笔记解读
推荐文章
- 深度学习教程 | 深度学习概论
- 深度学习教程 | 神经网络基础
- 深度学习教程 | 浅层神经网络
- 深度学习教程 | 深层神经网络
- 深度学习教程 | 深度学习的实用层面
- 深度学习教程 | 神经网络优化算法
- 深度学习教程 | 网络优化:超参数调优、正则化、批归一化和程序框架
- 深度学习教程 | AI应用实践策略(上)
- 深度学习教程 | AI应用实践策略(下)
- 深度学习教程 | 卷积神经网络解读
- 深度学习教程 | 经典CNN网络实例详解
- 深度学习教程 | CNN应用:目标检测
- 深度学习教程 | CNN应用:人脸识别和神经风格转换
- 深度学习教程 | 序列模型与RNN网络
- 深度学习教程 | 自然语言处理与词嵌入
- 深度学习教程 | Seq2seq序列模型和注意力机制