吴恩达深度学习课程之第三门课 结构化机器学习项目 第一周 机器学习( ML )策略

本文参考黄海广主编针对吴恩达深度学习课程DeepLearning.ai 《深度学习课程 笔记 (V5.1 )》

第一周 机器学习( ML )策略(1 1 )( ML strategy (1 1 ))

 1.1 为什么是 ML 策略?(Why ML Strategy?)

如何构建你的机器学习项目也就是说机器学习的策略。学习如何更快速高效地优化你的机器学习系统。

例子:假设调试猫分类器,经过一段时间的调整,系统达到了 90%准确率,但对你的应用程序来说还不够好。你可能有很多想法去改善你的系统,比如:

1. 收集更多的训练数据。(量)

2. 可能训练集的多样性还不够,你应该收集更多不同姿势的猫咪图片,或者更多样化的反例集

3. 或者再用梯度下降训练算法,训练久一点。

4. 或者尝试用一个完全不同的优化算法,比如 Adam 优化算法。

5. 或者尝试使用规模更大或者更小的神经网络

6. 或者你想试试 dropout 或者𝑀2正则化

7. 或者你想修改网络的架构,比如修改激活函数,改变隐藏单元的数目之类的方法。
尝试优化一个深度学习系统时,可以有很多想法可以去试,问题在于,如果你做出了错误的选择,浪费时间和精力。

 1.2 正交化(Orthogonalization )

搭建建立机器学习系统的挑战之一是,可以尝试和改变的东西太多太多了。包括,比如说,有那么多的超参数可以调。

正交化

1. 一个维度控制转向角

2. 另一个维度来控制你的速度

那么需要一个旋钮尽量只控制转向角,另一个旋钮,控制速度。

但如果一个控制旋钮将两者混在一起,一个控制装置同时影响转向角和速度,同时改变了两个性质,那么就很难令你的车子以想要的速度和角度前进。
然而正交化之后,正交意味着互成 90 度。设计出正交化的控制装置,最理想的情况是和你实际想控制的性质一致,这样你调整参数时就容易得多。可以单独调整转向角,还有你的油门和刹车,令车子以你想要的方式运动。

正交化与机器学习的关系

要弄好一个监督学习系统,你通常需要调你的系统的旋钮。

确保四件事情

1. 首先,通常必须确保至少系统在训练集上得到的结果不错,所以训练集上的表现必须通过某种评估,达到能接受的程度,对于某些应用,这可能意味着达到人类水平的表现,但这取决于你的应用。

2. 在训练集上表现不错之后,希望系统也能在开发集上有好的表现。

3. 然后希望系统在测试集上也有好的表现。

4. 最后,希望系统在测试集上系统的成本函数在实际使用中表现令人满意。

如果算法在成本函数上不能很好地拟合训练集,想要一个旋钮,或者一组特定的旋钮来调整你的算法,让它很好地拟合训练集。按钮可以是训练更大的网络,或者是切换到更好的优化算法,比如 Adam 优化算法,等等。增大训练集可以是另一个可用的旋钮,它可以帮助你的学习算法更好地归纳开发集的规律。
相比之下,如果发现算法对开发集的拟合很差,那么应该有独立的一组旋钮。比如说,你的算法在开发集上做的不好,它在训练集上做得很好,然后你有一组正则化的旋钮可以调节,尝试让系统满足第二个条件。

类比到电视,就是现在你调好了电视的宽度,如果图像的高度不太对,你就需要一个不同的旋钮来调节电视图像的高度,然后你希望这个旋钮尽量不会影响到电视的宽度。

总之,你要非常清楚,到底是上述四个问题中的哪一个,知道你可以调节哪些不同的东西尝试解决那个问题。

吴老师觉得早期停止有点难以分析,因为如果你早期停止,那么对训练集的拟合就不太好,但它同时也用来改善开发集的表现,所以这个旋钮没那么正交化,因为它同时影响两件事情。

1.3 单一数字评估指标(Single number evaluation metric )

无论是调整超参数,或者是尝试不同的学习算法,或者在搭建机器学习系统时尝试不同手段,会发现如果有一个单实数评估指标,进展会快得多,它可以快速告诉你,新尝试的手段比之前的手段好还是差。

一个例子,你之前听过我说过,应用机器学习是一个非常经验性的过程,我们通常有一个想法,编程序,跑实验,看看效果如何,然后使用这些实验结果来改善想法,然后继续走这个循环,不断改进算法。
比如说对于你的猫分类器,之前搭建了某个分类器𝐵,通过改变超参数,还有改变训练集等手段,训练出来了一个新的分类器 B,所以评估你的分类器的一个合理方式是观察它的查准率(precision)查全率(recall)

查准率的定义是在你的分类器标记为猫的例子中,有多少真的是猫。所以如果分类器𝐵有 95%的查准率,这意味着你的分类器说这图有猫的时候,有 95%的机会真的是猫。
查全率就是,对于所有真猫的图片,你的分类器正确识别出了多少百分比。实际为猫的图片中,有多少被系统识别出来?如果分类器𝐵查全率是 90%,这意味着对于所有的图像,比如说你的开发集都是真的猫图,分类器𝐵准确地分辨出了其中的 90%。
查准率和查全率之间往往需要折衷,两个指标都要顾及到。但使用查准率和查全率作为评估指标的时候,有个问题,如果分类器𝐵在查全率上表现更好,分类器𝐶在查准率上表现更好,你就无法判断哪个分类器更好。如果你尝试了很多不同想法,很多不同的超参数,你希望能够快速试验不仅仅是两个分类器,也许是十几个分类器,快速选出“最好的”那个,这样你可以从那里出发再迭代。如果有两个评估指标,就很难去快速地二中选一或者十中选一,所以我并不推荐使用两个评估指标,查准率和查全率来选择一个分类器。你只需要找到一个新的评估指标,能够结合查准率和查全率。

 

有一个单实数评估指标真的可以提高你的效率,或者提高你的团队做出这些决策的效率。现在我们还没有完整讨论如何有效地建立评估指标。 

1.4 满足和优化指标(Satisficing and optimizing metrics)

把顾及到的所有事情组合成单实数评估指标有时并不容易,在那些情况里,现有时候设立满足和优化指标是很重要的。

假设你已经决定你很看重猫分类器的分类准确度,这可以是F1 分数或者用其他衡量准确度的指标。

但除了准确度之外,还需要考虑运行时间,就是需要多长时间来分类一张图。分类器A需要 80 毫秒,B需要 95 毫秒,C 需要 1500 毫秒,就是说需要 1.5 秒来分类图像。

1. 可以将准确度和运行时间组合成一个整体评估指标。所以成本,比如说,总体成本是,这种组合方式可能太刻意,只用这样的公式来组合准确度和运行时间,两个数值的线性加权求和。
2. 还可以做其他事情,就是你可能选择一个分类器,能够最大限度提高准确度,但必须满足运行时间要求,就是对图像进行分类所需的时间必须小于等于 100 毫秒。

所以在这种情况下,我们就说准确度是一个优化指标,因为你想要准确度最大化,你想做的尽可能准确,但是运行时间就是我们所说的满足指标,意思是它必须足够好,它只需要小于 100 毫秒。

通过定义优化和满足指标,就可以给你提供一个明确的方式,去选择“最好的”分类器。在这种情况下分类器 B 最好,因为在所有的运行时间都小于 100 毫秒的分类器中,它的准确度最好。

所以更一般地说,如果你要考虑N个指标,有时候选择其中一个指标做为优化指标是合理的。所以你想尽量优化那个指标,然后剩下N − 1个指标都是满足指标,意味着只要它们达到一定阈值,例如运行时间快于 100 毫秒,但只要达到一定的阈值,你不在乎它超过那个门槛之后的表现,但它们必须达到这个门槛。 

总结一下,如果你需要顾及多个指标,比如说,有一个优化指标,你想尽可能优化的,然后还有一个或多个满足指标,需要满足的,需要达到一定的门槛。现在你就有一个全自动的方法,在观察多个成本大小时,选出"最好的"那个。现在这些评估指标必须是在训练集或开发集或测试集上计算或求出来的。所以你还需要做一件事,就是设立训练集、开发集,还有测试集。

1.5 训练/ 开发/ 测试集划分(Train/dev/test distributions )

设立训练集,开发集和测试集的方式大大影响了建立机器学习应用方面取得进展的速度。 

开发(dev)集也叫做开发集(development set),有时称为保留交叉验证集(hold out cross validation set)。然后,机器学习中的工作流程是,你尝试很多思路,用训练集训练不同的模型,然后使用开发集来评估不同的思路,然后选择一个,然后不断迭代去改善开发集的性能,直到最后你可以得到一个令你满意的成本,然后你再用测试集去评估。

现在,举个例子,你要开发一个猫分类器,然后你在这些区域里运营,美国、英国、其他欧洲国家,南美洲、印度、中国,其他亚洲国家和澳大利亚,那么你应该如何设立开发集和测试集呢?

1. 可以选择其中 4 个区域,我打算使用这四个(前四个),但也可以是随机选的区域,然后说,来自这四个区域的数据构成开发集。然后其他四个区域,用这四个(后四个),也可以随机选择 4 个,这些数据构成测试集

事实证明,这个想法非常糟糕,因为这个例子中,开发集和测试集来自不同的分布。最好让开发集和测试集来自同一分布。就是在你的开发集加上一个单实数评估指标,这就是像是定下目标,要瞄准的靶心,因为一旦建立了这样的开发集和指标,团队就可以快速迭代,尝试不同的想法,跑实验,可以很快地使用开发集和指标去评估不同分类器,然后尝试选出最好的那个。所以,机器学习团队一般都很擅长使用不同方法去逼近目标,然后不断迭代,不断逼近靶心。所以,针对开发集上的指标优化。

所以,为了避免数据差异对模型训练的影响,最好将所有数据随机洗牌,放入开发集和测试集,所以开发集和测试集都有来自八个地区的数据,并且开发集和测试集都来自同一分布,这分布就是你的所有数据混在一起。

设立开发集和测试集时

1. 开发集和测试集来自同一个分布。

2. 都要随机分配到开发集和测试集上。
因为这样,你才能将瞄准想要的目标,让你的团队高效迭代来逼近同一个目标,希望最好是同一个目标。

1.6 开发集和测试集的大小(Size of dev and test sets )

你可能听说过一条经验法则,在机器学习中,把全部数据用 70/30 比例分成训练集和测试集。或者如果你必须设立训练集、开发集和测试集,你会这么分 60%训练集,20%开发集,20%测试集。在机器学习的早期,这样分是相当合理的,特别是以前的数据集大小要小得多。如果你有几千个样本或者有一万个样本,这些做法也还是合理的。

但在现代机器学习中,更习惯操作规模大得多的数据集,比如说你有 1 百万个训练样本,这样分可能更合理,98%作为训练集,1%开发集,1%测试集。因为如果你有 1 百万个样本,那么 1%就是 10,000 个样本,这对于开发集和测试集来说可能已经够了。所以在现代深度学习时代,有时我们拥有大得多的数据集,所以使用小于 20%的比例或者小于 30%比例的数据作为开发集和测试集也是合理的。
要记住,测试集的目的是完成系统开发之后,测试集可以帮你评估投产系统的性能。方针就是,令你的测试集足够大,能够以高置信度评估系统整体性能。所以除非你需要对最终投产系统有一个很精确的指标,一般来说测试集不需要上百万个例子。对于你的应用程序,也许你想,有 10,000 个例子就能给你足够的置信度来给出性能指标了,也许 100,000 个之类的可能就够了,这数目可能远远小于比如说整体数据集的 30%,取决于你有多少数据。

1.7 什么时候该改变开发/ 测试集和指标?(When to change dev/test sets and metrics )

当你的评估指标无法正确衡量算法之间的优劣排序时,在这种情况下,原来的指标错误地预测算法 A 是更好的算法这就发出了信号,你应该改变评估指标了,或者要改变开发集测试集。在这种情况下,你用的分类错误率指标可以写成这样:

 但粗略的结论是,如果你的评估指标无法正确评估好算法的排名,那么就需要花时间定义一个新的评估指标。这是定义评估指标的其中一种可能方式(上述加权法)。

评估指标的意义在于,准确告诉你已知两个分类器,哪一个更适合你的应用。到目前为止我们只讨论了如何定义一个指标去评估分类器,也就是说,我们定义了一个评估指标帮助我们更好的把分类器排序,能够区分出它们在识别色情图片的不同水平,这实际上是一个正交化的例子。

你们要把机器学习任务看成两个独立的步骤,用目标这个比喻,第一步就是设定目标。所以要定义你要瞄准的目标,这是完全独立的一步,这是你可以调节的一个旋钮。如何设立目标是一个完全独立的问题,把它看成是一个单独的旋钮,可以调试算法表现的旋钮,如何精确瞄准,如何命中目标,定义指标是第一步。

总体方针就是,如果你当前的指标和当前用来评估的数据和你真正关心必须做好的事情关系不大,那就应该更改你的指标或者你的开发测试集,让它们能更够好地反映你的算法需要处理好的数据。 

1.8 为什么是人的表现?(Why human-level performance?)

在过去的几年里,更多的机器学习团队一直在讨论如何比较机器学习系统和人类的表现,为什么呢?

我认为有两个主要原因

1. 首先是因为深度学习系统的进步,机器学习算法突然变得更好了。在许多机器学习的应用领域已经开始见到算法已经可以威胁到人类的表现了。

2. 其次,事实证明,当试图让机器做人类能做的事情时,可以精心设计机器学习系统的工作流程,让工作流程效率更高,所以在这些场合,比较人类和机器是很自然的,或者你要让机器模仿人类的行为。

随着时间的推移,当您继续训练算法时,可能模型越来越大,数据越来越多,但是性能无法超过某个理论上限,这就是所谓的贝叶斯最优错误率Bayes optimal error)。所以贝叶斯最优错误率一般认为是理论上可能达到的最优错误率,就是说没有任何办法设计出一个x到y的函数,让它能够超过。

机器学习的进展往往相当快,直到超越人类的表现之前一直很快,当超越人类的表现时,有时进展会变慢

有两个原因,为什么当你超越人类的表现时,进展会慢下来。

1. 一个原因是人类水平在很多任务中离贝叶斯最优错误率已经不远了,人们非常擅长看图像,分辨里面有没有猫或者听写音频。所以,当你超越人类的表现之后也许没有太多的空间继续改善了。

2. 第二个原因是,只要你的表现比人类的表现更差,那么实际上可以使用某些工具来提高性能。一旦你超越了人类的表现,这些工具就没那么好用了。

1.9 可避免偏差(Avoidable bias )

算法在训练集上的表现和人类水平的表现有很大差距的话,说明算法对训练集的拟合并不好。所以从减少偏差和方差的工具这个角度看,在这种情况下,我会把重点放在减少偏差上。你需要做的是,比如说训练更大的神经网络,或者跑久一点梯度下降,就试试能不能在训练集上做得更好。

把这个差值,贝叶斯错误率或者对贝叶斯错误率的估计和训练错误率之间的差值称为可避免偏差。

1.10 理解人的表现(Understanding human-level performance)

在定义人类水平错误率时,要弄清楚目标所在,如果要表明你可以超越单个人类,那么就有理由在某些场合部署你的系统,也许这个定义是合适的。但是如果您的目标是替代贝叶斯错误率,那么这个定义(经验丰富的医生团队——0.5%)才合适。

总结一下我们讲到的,如果你想理解偏差和方差,那么在人类可以做得很好的任务中,你可以估计人类水平的错误率,你可以使用人类水平错误率来估计贝叶斯错误率。所以你到贝叶斯错误率估计值的差距,告诉你可避免偏差问题有多大,可避免偏差问题有多严重,而训练错误率和开发错误率之间的差值告诉你方差上的问题有多大,你的算法是否能够从训练集泛化推广到开发集。

1.11 超过人的表现(Surpassing human- level performance)

所以要达到超越人类的表现往往不容易,但如果有足够多的数据,已经有很多深度学习系统,在单一监督学习问题上已经超越了人类的水平,所以这对你在开发的应用是有意义的。

1.12 改 善 你 的 模 型 的 表 现 ( Improving your model performance)

你们学过正交化,如何设立开发集和测试集用人类水平错误率来估计贝叶斯错误率以及如何估计可避免偏差和方差。现在把它们全部组合起来写成一套指导方针,如何提高学习算法性能的指导方针。

所以我想要让一个监督学习算法达到实用,基本上希望或者假设你可以完成两件事情。
1. 首先,你的算法对训练集的拟合很好,这可以看成是你能做到可避免偏差很低

2. 还有第二件事你可以做好的是,在训练集中做得很好,然后推广到开发集和测试集也很好,这就是说方差不是太大

正交化的精神下,你可以看到这里有第二组旋钮,可以修正可避免偏差问题,比如训练更大的网络或者训练更久。还有一套独立的技巧可以用来处理方差问题,比如正则化或者收集更多训练数据。

总结一下前几段视频我们见到的步骤,如果想提升机器学习系统的性能。

1. 看看训练错误率和贝叶斯错误率估计值之间的距离,让你知道可避免偏差有多大。换句话说,对训练集的优化还有多少空间。2. 看看你的开发错误率和训练错误率之间的距离,就知道你的方差问题有多大。换句话说,你应该做多少努力让你的算法表现能够从训练集推广到开发集,算法是没有在开发集上训练的。

一、如果你想用尽一切办法减少可避免偏差,我建议试试这样的策略:

1. 使用规模更大的模型,这样算法在训练集上的表现会更好,或者训练更久

2. 使用更好的优化算法,比如说加入 momentum 或者 RMSprop,或者使用更好的算法,比如 Adam。

3. 你还可以试试寻找更好的新神经网络架构,或者说更好的超参数。这些手段包罗万有,你可以改变激活函数改变层数或者隐藏单位数,虽然你这么做可能会让模型规模变大。或者试用其他模型,其他架构,如循环神经网络和卷积神经网络。新的神经网络架构能否更好地拟合你的训练集,有时也很难预先判断,但有时换架构可能会得到好得多的结果。

二、当你发现方差是个问题时,你可以试用很多技巧,包括以下这些:

1. 可以收集更多数据,因为收集更多数据去训练可以帮你更好地推广到系统看不到的开发集数据。

2. 可以尝试正则化,包括𝑀2正则化dropout 正则化或者我们在之前课程中提到的数据增强

3. 可以试用不同的神经网络架构超参数搜索,看看能不能帮助你,找到一个更适合你的问题的神经网络架构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clark-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值