结构化机器学习项目

2018-12-12  本文已影响0人  疯了个魔

正交化

构建机器学习系统的挑战之一就是其中有很多你可以尝试、更改的东西,例如,其中有很多的超参数需要进行训练。把握好尝试、更改的方向,认识到进行的调整将带来的影响,是十分关键的。
正交化(Orthogonalization)件时,不会产生或传播副作用到系统种的其他组件的一种系统设计属性。它使得验证一个算法独立于另一个算法时变得更加容易,同时也能减少设计和开发的时间。
例如在学习驾驶一辆汽车时,主要是在学习转向、加速、制动这三个基本的控制方法,这三种控制手段互不干扰,你只要通过不断得训练,熟练掌握它们就好。而假如要你去学会驾驶一辆只带一根操纵杆的汽车,操纵杆设计好了每操作一下就控制一定的转角、一定的速度,这时学习成本就大了很多。所谓的正交化,就是这个道理。
当设计一个监督学习系统,需做到符合下面四个假设且它们是正交的:

  1. 建立的模型在训练集上表现良好;
  2. 建立的模型在开发集(验证集)上表现良好;
  3. 建立的模型在测试集上表现良好;
  4. 建立的模型在实际的应用中表现良好。
    当做到正交化时,如果发现:

找准目标

单一数字评估

构建机器学习系统时,通过设置一个单一数字评估指标(single-number evaluation metric),可以更为快速地判断出在经过几次调整后得到的不同结果里,哪个的效果要好些。
对于一个分类器,评价分类器性能的指标一般是分类的准确率(Accuracy),也就是正确分类的样本数和总样本数之比,它也就可以作为一个单一数字估计指标。例如之前的猫分类器的几个算法都是通过准确率作其性能好坏的标准。
对于二分类问题常用的评价指标是精确率(Precision)召回率(Recall),将所关注的类作为正类(Positive),其他的类为负类(Negative),分类器在数据集上预测正确或不正确,4种情况出现的种数分别记为:

  1. TP(True Positive)——将正类预测为正类数
  2. FN(False Negative)——将正类预测为负类数
  3. FP(False Positive)——将负类预测为正类数
  4. TN(Ture Negative)——将负类预测为负类数
    将精准率定义为:
    P = \frac{TP}{TP + FP}
    召回率定义为:
    R = \frac{TP}{TP + FN}
    而当遇到以下这种情况不好判别时,就需要采用F1度量(F1 Score)来判断两个分类器的好坏。
    模糊情况
    F1度量定义为:
    F_1 = \frac{2}{\frac{1}{P} + \frac{1}{R}} = \frac{2TP}{2TP + FP + FN}
    F1度量值其实就是精准率和召回率的调和平均数(Harmonic Mean),它是一种基于其平均值改善的方法,比简单地取平均值效果要好。如此,算出上图种A分类器的F1度量值为92.4%,B分类器的为91.0%,从未得知A分类器效果好些。这里F1度量值就作为了单一数字评估指标。

满足、优化指标

运行时间指标
然而有时,评判的标准不限于一个单一数字评估指标。比如上图中的几个猫分类器,想同时关心它们各自的识别准确率和运行时间,但如果把这两个指标组合成一个单一数字评估指标的话,就不太好了。这时,就需要把一个指标作为优化指标(Optimizing Metric),而另外的一些的作为满足指标(Satisficing Metric)
如上面所举的例子中,准确率就是一个优化指标,因为想要分类器尽可能做到正确分类,而运行时间就是一个满足指标,如果你想要分类器的运行时间不多于某个值,那你需要选择的分类器就应该是以这个值为界里面准确率最高的那个,以此作出权衡。
除了采用这些标准来评判一个模型外,也要学会在必要时及时地调整一些评判指标,甚至是更换训练数据。例如两个猫分类器A和B的识别误差分别为3%和5%,但是处于某种原因,A识别器会把色情图片误识为猫,引起用户的不适,而B不会出现这种情况,这时,识别误差大一些的B反而是更好的分类器。可以用以下公式来计算错误识别率:
人类表现水平
上图展示了随着时间的推进机器学习和人的表现水平的变化,一般的,当机器学习超过人的表现水平后,它就进步地很缓慢了,其中有一个重要的原因是人类的对于一些自然感知问题的表现水平几近于贝叶斯误差(Bayes Error)。贝叶斯误差被定义为最优的可能误差,换句话说,就是任何从x到精确度y映射的函数都不可能超过这个值。
当建立的机器学习模型的表现还没达到人类的表现水平时,可以通过各种手段来提升它。例如采用人工标记过的数据进行训练,通过人工误差分析了解为什么人能够正确识别,或者是进行误差、偏差分析。
通过与人类在某件事情上的表现水平向比较,可以清楚地表明一个机器学习模型对此的表现的好坏程度,由此作出判断出后续应该进行减小偏差还是减小方差。
可避免偏差
训练集的误差和人类表现水平的误差的差值就称为可避免偏差(Avoidable Bias)。例如上图中的两个场景下,将人的错误率和机器学习模型的错误率进行比较,看以看出在A场景下,学习算法的错误率和人的错误率的可避免偏差较大,这种情况下后续的工作就是通过之前介绍过的方法来降低训练集的错误率,以减小偏差。而在B场景下,学习算法和人的表现相当,偏可避免偏差只有0.5%,,后续的工作就应该转向尽可能地减小开发集和训练集那部分2%的方差。
人类表现水平给了我们一种估计贝叶斯误差的方式,而不是之前的将训练的错误率直接对着0%的方向进行优化。所以在获取到某项任务的人为误差数据时,就可以将这些数据作为贝叶斯误差的代理,以此来分析学习算法的偏差及方差。如果训练集与人类表现水平之间的误差差值大于训练集与开发集之间的差值,往后就应该专注于降低偏差,反之,就应该专注于降低方差。
缩小偏差、误差的方法
上图中总结出了各种应对偏差及方差的方法。总之,可避免偏差低便意味着你的训练过程做的很好,可接受范围内的方差意味着你的模型在开发、测试集上的表现与训练集上同样好。
此外,如果出现可避免误差为负值,也就是机器学习模型的表现超过人类表现水平即贝叶斯误差的代理的情况时,并不意味着你的模型的性能已经达到极点了,往后想要再提高就要另寻一些常规方法了。现在机器学习在很多领域已经做到这一点了,例如进行在线广告业务、产品推销、预测物流运输时间、信用评估等等。

错误分析

当使用一个学习算法做人类可以做的任务时,如果这个学习算法还达不到人类去做时的性能,通过人工检查算法得出的结果中出现的一些错误,可以使你深入了解下一步要进行的工作,这个过程便称为错误分析。
比如对于一个猫分类器,在开发组里你已经取得了90%的识别准确率,还存在10%的出错率,而且还发现分类器会将一些看起来像猫的狗的图片误识别为猫,这时就不是立即盲目地转向去做一个能够精确识别出狗的算法,而是先进行错误分析。可以先把学习算法标签错误的图片找出来,然后进行人工检查,假如100张错误标签的图片中有5张是狗的图片,那么也就表明你的学习算法的10%的错误中大致只有5%来自于狗,也就是0.5%的错误来自于狗,这表明改善狗的识别问题并不能给你的学习算法带来多大提升。但如果100张错误标签的图片中有50张是狗的图片,也就是5%的错误是狗产生的,那么对于狗的识别就是你要解决的问题了。这样,先通过少量的时间去分析问题,再决定后面的要进行大方向。

表格分析
在对输出结果中错误标签的样本进行人工分析时,常常可以建立一个表格,来记录每一个样本的一些情况,比如某些图像是模糊的,或者是把狗识别成了猫等等,以此来更加清楚地进行分析。
当发现输入的样本中,有一些样本是人为原因的错误标签,如果是在训练集中,只要这些出错的样本数量较小,分布地也比较随机,由于机器学习算法对于随机误差的稳健性(Robust)(也称“鲁棒性”),就不必花时间去一一修正它们;如果出现在开发集或者测试集,就可以在进行误差分析的时候,将这种情况对你的识别准确率的影响作出大致分析,这样对于是否值得去将输入中的错误标记一一进行修正,就有个明确的答案了。
总结一下:在构建一个机器学习系统时,尽可能按照以下几点来做:
  1. 设置好训练、开发、测试集及衡量指标,找准目标;
  2. 快速构建出一个初步的系统,用训练集来拟合参数,开发集调参,测试集评估;
  3. 采用方差/偏差分析或者错误分析等方法来决定下一步工作。

不匹配的数据集

训练、开发、测试集的来源都应该要是相同的。在无法达成这一要求下,对于不同来源的数据集,就要充分考虑如何将它们进行划分。
举个例子,想要开发一款手机应用,就像现在的Google相册中分类功能一样,能对用户上传的猫的图片进行识别。假如现在有1万张普通用户上传的猫的图片数据,这些图片的质量都不太好,有一些可能是模糊的,另外又网络上获取了20万张质量较好的猫的图片。
构建机器学习模型时,在开发集和测试集上,一定要反映出将来需要面临的数据。考虑到例子中这个机器学习模型主要将应用在识别用户拍摄的猫的图片上,在划分数据上,就可以将20万张网络获取和图片和5千张用户上传的图片共20.5万张图片作为训练集,剩下的5千张图片一半作开发集,一半作测试集。长远来看,这种分配方法比起随机打乱所有数据样本再进行分配性能要好。
在这种情况下,由于数据集的不匹配,后续如果进行方差/偏差分析,就很难找到问题的根源了,例如对于上面的例子,由于开发集包含的样本比训练集中的样本更加难以准确识别,开发集的错误率往往会大于训练集的错误率。为了解决这个问题,可以再定义一个训练-开发集,训练-开发集和训练集的来源相同,但是这部分并不参与训练。


训练-开发集

如上图所示,加入训练-开发集后得到的数据中,在B场景下训练集错误率和训练-开发集之间相差较大,它们的来源相同,由此就可以知道这是个偏差问题,后面各个场景下都可以按照之前的偏差/方差分析进行分析了,训练-开发集便起到了这个作用。
对于不匹配的数据集,偏差/方差分析过程如下:


偏差、方差分析
在一些情况下,可以直接通过一些手段直接解决数据集不匹配的问题。首先,需要进行人工错误分析,以了解训练、开发、测试集之间存在的差异,随后根据分析结果制作一些数据或者收集之间互相匹配的数据集。例如,必要时可以进行人工合成,将一些高质量的照片模糊化,或者对一些声音信息加入一些噪音,以此来使数据集匹配。

多任务和端到端学习

迁移学习

迁移学习(Tranfer Learning)是将一个神经网络从一个任务中学到的知识和经验,运用到另一个任务中。

迁移学习
如上图中,将为猫识别器构建的神经网络迁移应用到放射诊断中,因为猫识别器的神经网络已经学习到了关于图像的结构和性质等方面的知识,所以只要先删除神经网络的中最后一层,输出层的权重值也改为随机初始化的值,随后输入新的训练数据进行训练,就完成了以上的迁移学习。
如果你有一个小数据集,就只训练输出层前的最后一层,或者也许是最后一两层, 并保持其他参数不变。
如果你有足够多的数据,你可以重新训练神经网络中剩下的所有层。如果重新训练神经网络中的所有参数,则在这个图像识别的初始阶段称为预训练(Pre-Training),它将预先初始化各个神经网络的权重值,之后的权重更新过程便称为微调(Fine-Tuning)
符合下面的条件时,进行迁移学习才是有意义的:
  1. 两个任务使用的数据集相同;
  2. 拥有更多数据的任务到数据较少的任务;
  3. 任务底层神经网络的某些功能对另一个任务有帮助。

多任务学习

多任务学习(Multi-Task Learning)是采用一个神经网络来同时执行多个任务,且这些任务的执行可以相互促进。

多任务学习
在自动驾驶技术中,车辆必须同时检测视野范围内的各种物体,这时就要用到多任务学习,训练一个神经网络来检测多种物体,这样可以做到一些早期特征在不同类型的对象间共享。假如要同时识别行人、汽车、路标、交通灯,则上图片的标签将表示为:
神经网络结构
符合下面的条件时,采用多任务学习才是有意义的:
  1. 进行的任务都能从共享的较低级别功能中受益;
  2. 对每个任务拥有的数据量相当;
  3. 有能力训练足够大的神经网络来完成所有任务。

端到端学习

端到端深度学习(End-to-end Deep Learning)是将处理或学习系统简化为一个神经网络。

端到端学习
如图,传统的语音识别系统,是由声学模型、词典、语言模型构成,而其中的语音模型和语言模型是分别训练的,而不同的语言也有不同的语言模型,比如英语和中文。而端到端的语音识别系统,从语音特征(输入端)到文字串(输出端)中间就只需要一个神经网络模型。
端到端深度学习并不能应用于每一个问题,因为它需要大量的标记数据。它主要应用于音频转录,图像捕捉,图像合成,机器翻译,自驾车转向等。
端到端学习的优点:
端到端学习真的只是让数据说话。所以如果你有足够多的(x, y)数据,那么不管从x到y最适合的函数映射是什么,如果你训练一个足够大的神经网络,希望这个神经网络能自己搞清楚,而使用纯机器学习方法,直接从x到y输入去训练的神经网络,可能更能够捕获数据中的任何统计信息,而不是被迫引入人类的成见。
端到端深度学习的第二个好处就是这样,所需手工设计的组件更少,所以这也许能够简化你的设计工作流程,你不需要花太多时间去手工设计功能,手工设计这些中间表示方式。
端到端学习的缺点:
它可能需要大量的数据。要直接学到这个x到y的映射,你可能需要大量(x, y)数据。
另一个缺点是,它排除了可能有用的手工设计组件。如果你没有很多数据,你的学习算法就没办法从很小的训练集数据中获得洞察力。所以手工设计组件在这种情况,可能是把人类知识直接注入算法的途径。我觉得学习算法有两个主要的知识来源,一个是数据,另一个是你手工设计的任何东西,可能是组件,功能,或者其他东西。所以当你有大量数据时,手工设计的东西就不太重要了,但是当你没有太多的数据时,构造一个精心设计的系统,实际上可以将人类对这个问题的很多认识直接注入到问题里,进入算法里应该挺有帮助的。
上一篇 下一篇

猜你喜欢

热点阅读