吴恩达深度学习课程之第三门课 结构化机器学习项目

本文参考黄海广主编针对吴恩达深度学习课程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 是更好的算法这就发出了信号,你应该改变评估指标了,或者要改变开发集测试集。在这种情况下,你用的分类错误率指标可以写成这样:

吴恩达深度学习课程之第三门课 结构化机器学习项目

吴恩达深度学习课程之第三门课 结构化机器学习项目

吴恩达深度学习课程之第三门课 结构化机器学习项目 但粗略的结论是,如果你的评估指标无法正确评估好算法的排名,那么就需要花时间定义一个新的评估指标。这是定义评估指标的其中一种可能方式(上述加权法)。

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