摘要:本文主要向大家介绍了机器学习入门之结构化机器学习项目-机器学习(ML)策略2,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。
本文主要向大家介绍了机器学习入门之结构化机器学习项目-机器学习(ML)策略2,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。
一、进行误差分析
在机器学习的过程中,如果机器学习模型的性能还没到达人工水平,那我们可以人工寻找算法中有哪些错误,这个问题叫作误差分析。一般在开发集上运用误差分析。
人工误差分析
如图中所示,举一个猫类分类器的例子。在开发集上猫类分类器已经达到百分之九十的准确率,也就是说存在百分之十的误差。我们发现错误识别的例子中存在的问题有把一些像猫的狗也分进猫类中。那我们是否应该训练一些狗的图片提升分类器的性能呢?
训练狗的样本可能要花费很长时间,我们也不知道训练之后是否会获得很好的效果,此时可以用误差分析。从开发集样本中挑出100个错误识别的样本,人工统计有多少个样本属于“狗类”问题。
如果只有5个样本属于“狗类”问题,也就是说“狗类”问题占5%,那么经过训练最理想的效果是你提升了5%的准确率,误差从10%下降到9.5%。如果有50个样本属于“狗类”问题,也就是说“狗类”问题占50%,那么经过训练最理想的效果是你提升了50%的准确率,误差从10%下降到5%。这是你就可以通过误差分析提升的性能比例决定是否改善这种错误类型。
经过训练所能获得最理想的效果提升称为“ceiling”,也就是每种错误类型的改善都存在天花板。
多个错误类型
误差分析也可以同时分析多个错误类型。
比如图中有三种错误类型,建立一张表格,把每个样本的错误类型进行统计,并在“commet”栏中标注一些具体信息,最后统计这种错误类型所占的比例。当发现新的错误类型时,也可以新开一列统计。这种人工统计的方式允许你很快了解每种错误类型的ceiling在哪里,从而决定改善哪个错误类型。
有人觉得在机器学习中进行人工操作很蠢,但实际这种人工统计的方式给出了提升性能的清晰思路。
二、错误标记的数据
样本是由输入X和输出Y组成的,在所有的样本中,可能存在标记错误的样本,那么我们是否需要修正这些样本后重新训练呢?
标记错误样本
如果错误样本属于训练集:事实证明深度学习算法对训练集上随机的错误样本有很大的鲁棒性,也就是说随机错误样本不会对训练集产生很大的影响。但如果是系统性的错误样本,比如持续把白色小狗标记成猫类,就会产生很大影响。
误差分析
如果错误样本属于开发集:我们在误差分析中再增加一列统计多少错误分类是属于“错误数据标记”类型。之后分析三个数据——开发集上的误差、由于错误数据标记引起的误差、由于其他错误类型引起的误差。
比如A类分类器6%的错误属于“错误数据标记”类型,开发集上的误差是10%,那么由于错误数据标记引起的误差是0.6%。B类分类器30%的错误属于“错误数据标记”类型,开发集上的误差是2%,那么由于错误数据标记引起的误差是0.6%。同样是0.6%的错误数据标记误差,所占的比例却不同,B类30%的错误来自错误的数据标记,严重影响了开发集误差,可能需要重新学习修改标注后的样本。
开发集是帮助我们在不同机器学习模型中选择合适的一种。如果其中有机器学习模型因为错误数据标记产生较大误差,则不能确定它正常的性能,需要修订数据后重新计算。
Tips
对于开发集和测试集错误标记数据的Tips:
*如果要修正数据,通过对开发集和测试集采用同样的处理,确保它们的数据属于同一分布。前面也提到过,开发集是确定靶心后不断逼近,并希望能将这种逼近方式推广到测试集上去,所以它们的数据必须属于同一分布。
*如果你检查了错误识别中错误标记的数据,最好也检查正确识别中错误标记的数据,虽然增加了很多工作量,但这些错误数据有可能对你学习模型的性能产生很大影响。
*训练集数据可以和开发集测试集数据不来自同一分布,因为训练集对随机的错误样本有很大的鲁棒性。
三、快速搭建你的第一个系统,并进行迭代
当我们搭建一个新的机器学习模型时,并不需要一开始精细思考搭建一个复杂模型,可以先快速建立一个肮脏模型,之后进行迭代。
搭建系统
Ng推荐的流程是:
1.建立开发测试集和评测准则,确立你学习模型要逼近的目标。
2.快速建立一个肮脏模型。
3.利用偏差/方差分析和误差分析朝最有效的一个方向优化。
比如说在语音识别领域,有很多优化的方向,如果建立模型之前你全部思考是毫无头绪,凭借分析最初肮脏模型的结果,可以确定迭代的目标。
如果你建立的模型有很多学术论文的支持,比如人脸识别,那通过别人的经验之谈可以刚开始就建立一个比较复杂的模型。
四、在不同的划分上进行训练并测试
当训练集数据和开发集测试集不在同一分布上时,应该怎么办?
不同分布
深度学习需要海量的数据,所以搭建学习模型的数据都希望数据越多越好,也就会从各方面获取数据,造成数据分布不同。
仍旧以猫类分类器为例。我们现在有从网页中爬取的20万张图片,有从用户那里收集的1万张图片,两个数据集合明显不来自同一分布,我们学习模型的目标是识别用户上传的数据,所以那1万张图片才是我们真正在意的,该如何使用呢?
选择一:将两个集合合并成21万张图片,洗牌后按比例放入训练、开发、测试集。这样有优点也有缺点,优点是三个集合来自同一分布,缺点是这样做模糊了模型要逼近的目标,这时我们真正在意的1万数据能发挥的作用很小,这个缺点是致命的。
选择二:将全部不在意数据和部分在意数据组成训练集,剩下在意数据按比例分配到开发集和测试集中去。甚至有的时候,可以将全部在意数据只用于开发集和测试集,这样做就让学习模型确定了正确的目标。
五、不匹配数据划分的方差和偏差
通过分析方差和偏差我们可以知道优化模型的方向,但如果我们的数据划分不匹配,如何分析方差和偏差呢?
方差、偏差、不匹配数据
数据匹配的情况下,通过分析贝叶斯最优误差和训练集误差可以判断存不存在偏差问题,通过分析训练集误差和开发集误差可以判断存不存在方差问题。但如果数据分布不匹配,如果训练集误差和开发集误差相差较大,究竟是存在高方差问题,还是训练时的数据分布不能很好地适应开发集的数据分布造成问题呢?(我们把后一种问题成为数据不匹配问题Data mismatch)。
为了判断问题出自两种情况的哪一种,我们要新定义一种数据集合:训练-开发集,也就是从训练集中拿出一部分组成训练-开发集,通过模型在此集合上运行的结果判断。
我们用图中所示例子说明四种情况:
1.Human error : 0%,Training error:1%,Training-Dev error : 9%,Dev error:10%。存在高方差问题。
2.Human error : 0%,Training error:1%,Training-Dev error : 1.5%,Dev error:10%。存在数据不匹配问题。
3.Human error : 0%,Training error:10%,Training-Dev error : 11%,Dev error:12%。存在高偏差问题。
4.Human error : 0%,Training error:10%,Training-Dev error : 11%,Dev error:20%。存在高偏差问题和数据不匹配问题。
问题总结
总结就是:人类水平和训练误差决定是否存在高偏差问题,训练误差和训练-开发误差决定是否存在高方差问题,训练-开发误差和开发误差决定是否存在数据不匹配问题,开发误差和测试误差决定是否存在开发数据过度拟合的问题。
问题解决公式
六、解决数据不匹配问题
通过分析训练-开发集误差和开发集误差,如果发现存在数据不匹配问题,该如何解决?
解决数据不匹配问题
解决方案:
*通过人工误差分析尝试寻找训练集数据和开发测试集数据有哪些不同。
*制造或收集更多的相似数据到开发测试集中。
如何制造或收集到更多与训练集相似的数据?一种方法是人工合成数据。人工合成数据有的时候很有用,比如在语音识别领域。
人工合成数据e.g.1
假如我们需要有汽车噪音为背景的语音片段放入开发测试集合,可以将两段音频合成。但这种合成要十分谨慎,可能会导致对合成数据的过度拟合。比如说我们有10000小时的语音音频和1小时的汽车噪音音频,我们可能会将这1小时汽车噪音音频复制10000份,然后与语音音频叠加,叠加后的结果在人耳听来是伴有噪音的正确音频数据。但这1小时的汽车噪音音频数据可能属于可用噪音音频集合的一小部分,你重复拿这1小时人工合成数据,之后的训练结果可能会对这1小时噪音数据过度拟合。解决方法是,如果手机10000小时的噪音数据成本不大,用正常10000小时噪音数据去训练可能会获得更好的结果。
人工合成数据e.g.2
这种过拟合错误再举一个例子。比如深度学习模型用于车辆识别,我们用二十种车型与不同的背景人工合成,获得许多数据放入开发测试集中。但这二十种车型是正常生活中遇到车型集合的一个小子集,这样有可能导致对这二十种车型数据过拟合。
七、迁移学习
当你希望解决一个问题,却有很少量的数据,所以你需要找到一个数据很多的相关问题,来预先学习,并把知识迁移到这个新问题上来。
迁移学习
比如说任务A是图像识别,经过学习已经拥有一个性能出色的模型。此时我们希望这个模型能够迁移到放射科诊断中,因为它们的输入都是图像,图像识别模型中中前几层神经元实现的低层次特征识别可能能应用到放射图像中。我们可以更改最后一层或几层,将更改的隐藏层参数随机,只训练更改的隐藏层输出诊断结果。
再比如任务A是语音识别,我们希望该模型应用到场景类似的任务B语音词唤醒上去。更改最后几层,神经网络前面学到的语义识别很有可能让语音词唤醒获得一个好性能。
如果任务B的数据较少,可以只训练更改的隐藏层。如果任务B的数据较多,可以训练整个神经网络。
原来的任务A叫作预训练(pre-training),迁移的任务B叫作微调(fine tuning)。
迁移学习应用场景
什么时候适合使用迁移学习?
*任务A和任务B有相同的输入。(第一个例子都是输入图像,第二个例子都是输入音频)
*任务A的数据要远远多于任务B的数据。因为任务B的数据价值是极大地高于任务A的,所以如果任务B本身数据和任务A差不多或超过任务A,那它依靠自己的数据就能获得更好的性能,也就不需要迁移学习了。
*任务A的低层次特征对任务B的学习是有帮助的。(第一个例子图像识别的轮廓识别等对放射图像有益,第二个例子语音识别的语义分析对唤醒词判断有益)
八、多任务学习
多任务学习是利用一个足够大的神经网络,一次性解决多个问题。多任务学习使用的频率要低于迁移学习,但在一些应用中,多任务学习的性能要好于建立多个神经网络分别解决问题,计算机视觉领域是一个很好的例子。
自动驾驶中图像识别
在自动驾驶应用中,我们需要通过一张图像识别很多东西,比如说行人、车辆、标志、车灯等,这是不同的任务,但由于神经网络前期工作类似,使用多任务学习在一个神经网络中同时执行这些任务可能会获得很好的效果。
多任务学习模型
根据任务数量决定输出神经层有多少个标签,利用标签总和计算成本函数,一个图像中不一定准确标识了每个标签的结果,如果结果不确定用?代替(比如没说是否有标识,就用?),在计算成本函数时可以忽略?标签。
多任务学习应用场景
多任务学习应用场景:
*当多个任务的训练有类似的低层次特征时,它们会相互受益。
*通常:每个任务的数据数量比较接近。
*能够训练一个足够大的神经网络可以在所有任务上体现良好性能。
九、端到端的深度学习
端到端的深度学习
利用深度学习解决一个问题通常需要一些步骤,很多学者致力于研究怎样的步骤能够获得更好的结果。比如在语音识别中,可以先利用MFCC提取音频特征,之后利用机器学习确定音位(phonemes),进而确定词汇组成文本。
近年来端到端的深度学习逐渐崛起,它的思想就是利用一个神经网络代替这些步骤,直接从输入的音频获得输出的文本。
假如我们有3,000h的音频,可能数据没有大到可以运用端到端的深度学习。但当音频数据达到10,000h甚至100,000h时,可能端到端的深度学习会获得更好的性能。
如果数据量较小,这种流程式解决问题的方法可能会获得很好的结果。当数据量超过一定界限后,端到端的深度学习模型性能可能会获得一个飞涨。如果数据介于这两者之间,我们也可以实现不纯粹的端到端深度学习模型,比如从音频得到音位,之后得到文本输出。
面部识别
数据量不够时,我们可以将面部识别分成人脸检测,人脸识别两部分。人脸检测从图像中获取人脸,人脸识别判断获取的人脸特征。当数据量足够时,可直接从获取的图像到身份结果输出搭建端到端的深度学习模型。
更多例子
由于现在有海量英语到法语的输入输出数据对(x,y),我们可以搭建端到端深度学习模型获得更好性能;相比之下,手骨检测不会有多少图像数据,可能先通过图像辨析骨头,再将辨析的骨头与数据库对比得到年龄是一种更好的方法。
优点和缺点
使用端到端深度学习模型的优点和缺点:
优点:
*真正让数据说话。不被人类看待问题的方式影响。
*不再需要人工设计的步骤。
缺点:
*需要更多的数据。更多的数据才足够让学习模型洞见规律。
*排除了可能很有用的人工设计。人工设计是一把双刃剑,有的时候错误的人工设计降低了模型的性能,但更多时候,人工设计是一种解决问题的良好方式。
关键问题
使用端到端深度学习模型的关键问题:是否有足够的数据,能够学习从x到y的复杂映射函数。
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能机器学习频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号