第三门课 结构化机器学习项目(Structuring Machine Learning Projects)
第一周 机器学习(ML)策略(1)(ML strategy(1))
文章目录
- 第三门课 结构化机器学习项目(Structuring Machine Learning Projects)
-
- 第一周 机器学习(ML)策略(1)(ML strategy(1))
-
- 1.1 为什么是ML策略?(Why ML Strategy?)
- 1.2 正交化(Orthogonalization)
- 1.3 单一数字评估指标(Single number evaluation metric)
- 1.4 满足和优化指标(Satisficing and optimizing metrics)
- 1.5 训练/开发/测试集划分(Train/dev/test distributions)
- 1.6 开发集和测试集的大小(Size of dev and test sets)
- 1.7 什么时候该改变开发/测试集和指标?(When to change dev/test sets and metrics)
- 1.8 为什么是人的表现?(Why human-level performance?)
- 1.9 可避免偏差(Avoidable bias)
- 1.10 理解人的表现(Understanding human-level performance)
- 1.11 超过人的表现(Surpassing human- level performance)
- 1.12 改善你的模型的表现(Improving your model performance)
1.1 为什么是ML策略?(Why ML Strategy?)
大家好,欢迎收听本课,如何构建你的机器学习项目也就是说机器学习的策略。我希望通过这门课程你们能够学到如何更快速高效地优化你的机器学习系统。那么,什么是机器学习策略呢?
我们从一个启发性的例子开始讲,假设你正在调试你的猫分类器,经过一段时间的调整,你的系统达到了90%准确率,但对你的应用程序来说还不够好。
你可能有很多想法去改善你的系统,比如,你可能想我们去收集更多的训练数据吧。或者你会说,可能你的训练集的多样性还不够,你应该收集更多不同姿势的猫咪图片,或者更多样化的反例集。或者你想再用梯度下降训练算法,训练久一点。或者你想尝试用一个完全不同的优化算法,比如Adam优化算法。或者尝试使用规模更大或者更小的神经网络。或者你想试试dropout或者 L 2 L2 L2正则化。或者你想修改网络的架构,比如修改激活函数,改变隐藏单元的数目之类的方法。
当你尝试优化一个深度学习系统时,你通常可以有很多想法可以去试,问题在于,如果你做出了错误的选择,你完全有可能白费6个月的时间,往错误的方向前进,在6个月之后才意识到这方法根本不管用。比如,我见过一些团队花了6个月时间收集更多数据,却在6个月之后发现,这些数据几乎没有改善他们系统的性能。所以,假设你的项目没有6个月的时间可以浪费,如果有快速有效的方法能够判断哪些想法是靠谱的,或者甚至提出新的想法,判断哪些是值得一试的想法,哪些是可以放心舍弃的。
我希望在这门课程中,可以教给你们一些策略,一些分析机器学习问题的方法,可以指引你们朝着最有希望的方向前进。这门课中,我会和你们分享我在搭建和部署大量深度学习产品时学到的经验和教训,我想这些内容是这门课程独有的。比如说,很多大学深度学习课程很少提到这些策略。事实上,机器学习策略在深度学习的时代也在变化,因为现在对于深度学习算法来说能够做到的事情,比上一代机器学习算法大不一样。我希望这些策略能帮助你们提高效率,让你们的深度学习系统更快投入实用。
1.2 正交化(Orthogonalization)
搭建建立机器学习系统的挑战之一是,你可以尝试和改变的东西太多太多了。包括,比如说,有那么多的超参数可以调。我留意到,那些效率很高的机器学习专家有个特点,他们思维清晰,对于要调整什么来达到某个效果,非常清楚,这个步骤我们称之为正交化,让我告诉你是什么意思吧。
,一个旋钮调整这个(宽度),一个旋钮调整这个(梯形角度),以此类推。
相比之下,想象一下,如果你有一个旋钮调的是 0.1 x 0.1x 0.1x表示图像高度, + 0.3 x +0.3x +0.3x表示图像宽度, − 1.7 x -1.7x −1.7x表示梯形角度, + 0.8 x +0.8x +0.8x表示图像在水平轴上的坐标之类的。如果你调整这个(其中一个)旋钮,那么图像的高度、宽度、梯形角度、平移位置全部都会同时改变,如果你有这样的旋钮,那几乎不可能把电视调好,让图像显示在区域正中。
所以在这种情况下,正交化指的是电视设计师设计这样的旋钮,使得每个旋钮都只调整一个性质,这样调整电视图像就容易得多,就可以把图像调到正中。
接下来是另一个正交化例子,你想想学车的时候,一辆车有三个主要控制,第一是方向盘,方向盘决定你往左右偏多少,还有油门和刹车。就是这三个控制,其中一个控制方向,另外两个控制你的速度,这样就比较容易解读。知道不同控制的不同动作会对车子运动有什么影响。
想象一下,如果有人这么造车,造了个游戏手柄,手柄的一个轴控制的是 0.3 × 0.3× 0.3×转向角-速度,然后还有一个轴控制的是 2 × 2× 2×转向角 + 0.9 × +0.9× +0.9×车速,理论上来说,通过调整这两个旋钮你是可以将车子调整到你希望得到的角度和速度,但这样比单独控制转向角度,分开独立的速度控制要难得多。
所以正交化的概念是指,你可以想出一个维度,这个维度你想做的是控制转向角,还有另一个维度来控制你的速度,那么你就需要一个旋钮尽量只控制转向角,另一个旋钮,在这个开车的例子里其实是油门和刹车控制了你的速度。但如果你有一个控制旋钮将两者混在一起,比如说这样一个控制装置同时影响你的转向角和速度,同时改变了两个性质,那么就很难令你的车子以想要的速度和角度前进。然而正交化之后,正交意味着互成90度。设计出正交化的控制装置,最理想的情况是和你实际想控制的性质一致,这样你调整参数时就容易得多。可以单独调整转向角,还有你的油门和刹车,令车子以你想要的方式运动。
那么这与机器学习有什么关系呢?要弄好一个监督学习系统,你通常需要调你的系统的旋钮。
确保四件事情,首先,你通常必须确保至少系统在训练集上得到的结果不错,所以训练集上的表现必须通过某种评估,达到能接受的程度,对于某些应用,这可能意味着达到人类水平的表现,但这取决于你的应用,我们将在下周更多地谈谈如何与人类水平的表现进行比较。但是,在训练集上表现不错之后,你就希望系统也能在开发集上有好的表现,然后你希望系统在测试集上也有好的表现。在最后,你希望系统在测试集上系统的成本函数在实际使用中表现令人满意,比如说,你希望这些猫图片应用的用户满意。
我们回到电视调节的例子,如果你的电视图像太宽或太窄,你想要一个旋钮去调整,你可不想要仔细调节五个不同的旋钮,它们也会影响别的图像性质,你只需要一个旋钮去改变电视图像的宽度。
所以类似地,如果你的算法在成本函数上不能很好地拟合训练集,你想要一个旋钮,是的我画这东西表示旋钮,或者一组特定的旋钮,这样你可以用来确保你的可以调整你的算法,让它很好地拟合训练集,所以你用来调试的旋钮是你可能可以训练更大的网络,或者可以切换到更好的优化算法,比如Adam优化算法,等等。我们将在本周和下周讨论一些其他选项。
相比之下,如果发现算法对开发集的拟合很差,那么应该有独立的一组旋钮,是的,这就是我画得毛毛躁躁的另一个旋钮,你希望有一组独立的旋钮去调试。比如说,你的算法在开发集上做的不好,它在训练集上做得很好,但开发集不行,然后你有一组正则化的旋钮可以调节,尝试让系统满足第二个条件。类比到电视,就是现在你调好了电视的宽度,如果图像的高度不太对,你就需要一个不同的旋钮来调节电视图像的高度,然后你希望这个旋钮尽量不会影响到电视的宽度。增大训练集可以是另一个可用的旋钮,它可以帮助你的学习算法更好地归纳开发集的规律,现在调好了电视图像的高度和宽度。
如果它不符合第三个标准呢?如果系统在开发集上做的很好,但测试集上做得不好呢?如果是这样,那么你需要调的旋钮,可能是更大的开发集。因为如果它在开发集上做的不错,但测试集不行这可能意味着你对开发集过拟合了,你需要往回退一步,使用更大的开发集。
最后,如果它在测试集上做得很好,但无法给你的猫图片应用用户提供良好的体验,这意味着你需要回去,改变开发集或成本函数。因为如果根据某个成本函数,系统在测试集上做的很好,但它无法反映你的算法在现实世界中的表现,这意味着要么你的开发集分布设置不正确,要么你的成本函数测量的指标不对。
我们很快会逐一讲到这些例子,我们以后会详细介绍这些特定的旋钮,在本周和下周晚些时候会介绍的。所以如果现在你无法理解全部细节,别担心,但我希望你们对这种正交化过程有个概念。你要非常清楚,到底是四个问题中的哪一个,知道你可以调节哪些不同的东西尝试解决那个问题。
当我训练神经网络时,我一般不用early stopping,这个技巧也还不错,很多人都这么干。但个人而言,我觉得用early stopping有点难以分析,因为这个旋钮会同时影响你对训练集的拟合,因为如果你早期停止,那么对训练集的拟合就不太好,但它同时也用来改善开发集的表现,所以这个旋钮没那么正交化。因为它同时影响两件事情,就像一个旋钮同时影响电视图像的宽度和高度。不是说这样就不要用,如果你想用也是可以的。但如果你有更多的正交化控制,比如我这里写出的其他手段,用这些手段调网络会简单不少。
所以我希望你们对正交化的意义有点概念,就像你看电视图像一样。如果你说,我的电视图像太宽,所以我要调整这个旋钮(宽度旋钮)。或者它太高了,所以我要调整那个旋钮(高度旋钮)。或者它太梯形了,所以我要调整这个旋钮(梯形角度旋钮),这就很好。
在机器学习中,如果你可以观察你的系统,然后说这一部分是错的,它在训练集上做的不好、在开发集上做的不好、它在测试集上做的不好,或者它在测试集上做的不错,但在现实世界中不好,这就很好。必须弄清楚到底是什么地方出问题了,然后我们刚好有对应的旋钮,或者一组对应的旋钮,刚好可以解决那个问题,那个限制了机器学习系统性能的问题。
这就是我们这周和下周要讲到的,如何诊断出系统性能瓶颈到底在哪。还有找到你可以用的一组特定的旋钮来调整你的系统,来改善它特定方面的性能,我们开始详细讲讲这个过程吧。
1.3 单一数字评估指标(Single number evaluation metric)
无论你是调整超参数,或者是尝试不同的学习算法,或者在搭建机器学习系统时尝试不同手段,你会发现,如果你有一个单实数评估指标,你的进展会快得多,它可以快速告诉你,新尝试的手段比之前的手段好还是差。所以当团队开始进行机器学习项目时,我经常推荐他们为问题设置一个单实数评估指标。
我们来看一个例子,你之前听过我说过,应用机器学习是一个非常经验性的过程,我们通常有一个想法,编程序,跑实验,看看效果如何,然后使用这些实验结果来改善你的想法,然后继续走这个循环,不断改进你的算法。
比如说对于你的猫分类器,之前你搭建了某个分类器 A A A,通过改变超参数,还有改变训练集等手段,你现在训练出来了一个新的分类器B,所以评估你的分类器的一个合理方式是观察它的查准率(precision)和查全率(recall)。
查准率和查全率的确切细节对于这个例子来说不太重要。但简而言之,查准率的定义是在你的分类器标记为猫的例子中,有多少真的是猫。所以如果分类器 A A A有95%的查准率,这意味着你的分类器说这图有猫的时候,有95%的机会真的是猫。
查全率就是,对于所有真猫的图片,你的分类器正确识别出了多少百分比。实际为猫的图片中,有多少被系统识别出来?如果分类器 A A A查全率是90%,这意味着对于所有的图像,比如说你的开发集都是真的猫图,分类器 A A A准确地分辨出了其中的90%。
所以关于查准率和查全率的定义,不用想太多。事实证明,查准率和查全率之间往往需要折衷,两个指标都要顾及到。你希望得到的效果是,当你的分类器说某个东西是猫的时候,有很大的机会它真的是一只猫,但对于所有是猫的图片,你也希望系统能够将大部分分类为猫,所以用查准率和查全率来评估分类器是比较合理的。
但使用查准率和查全率作为评估指标的时候,有个问题,如果分类器 A A A在查全率上表现更好,分类器 B B B在查准率上表现更好,你就无法判断哪个分类器更好。如果你尝试了很多不同想法,很多不同的超参数,你希望能够快速试验不仅仅是两个分类器,也许是十几个分类器,快速选出“最好的”那个,这样你可以从那里出发再迭代。如果有两个评估指标,就很难去快速地二中选一或者十中选一,所以我并不推荐使用两个评估指标,查准率和查全率来选择一个分类器。你只需要找到一个新的评估指标,能够结合查准率和查全率。
在机器学习文献中,结合查准率和查全率的标准方法是所谓的 F 1 F_1 F1分数, F 1 F_1 F1分数的细节并不重要。但非正式的,你可以认为这是查准率 P P P和查全率 R R R的平均值。正式来看, F 1 F_1 F1分数的定义是这个公式: 2 1 P + 1 R \frac{2}{\frac{1}{P} + \frac{1}{R}} P1+R12
在数学中,这个函数叫做查准率 P P P和查全率 R R R的调和平均数。但非正式来说,你可以将它看成是某种查准率和查全率的平均值,只不过你算的不是直接的算术平均,而是用这个公式定义的调和平均。这个指标在权衡查准率和查全率时有一些优势。
但在这个例子中,你可以马上看出,分类器 A A A的 F 1 F_1 F1分数更高。假设 F 1 F_1 F1分数是结合查准率和查全率的合理方式,你可以快速选出分类器 A A A,淘汰分类器 B B B。
我发现很多机器学习团队就是这样,有一个定义明确的开发集用来测量查准率和查全率,再加上这样一个单一数值评估指标,有时我叫单实数评估指标,能让你快速判断分类器 A A A或者分类器 B B B更好。所以有这样一个开发集,加上单实数评估指标,你的迭代速度肯定会很快,它可以加速改进您的机器学习算法的迭代过程。
我们来看另一个例子,假设你在开发一个猫应用来服务四个地理大区的爱猫人士,美国、中国、印度还有世界其他地区。我们假设你的两个分类器在来自四个地理大区的数据中得到了不同的错误率,比如算法 A A A在美国用户上传的图片中达到了3%错误率,等等。
所以跟踪一下,你的分类器在不同市场和地理大区中的表现应该是有用的,但是通过跟踪四个数字,很难扫一眼这些数值就快速判断算法