吴恩达老师的深度学习课程一共分为五门课,目前为止已经学了前两门课,分别是《深度学习和神经网络》、《改进深层次的神经网络:调整超参数、正则化和优化》,今天开始第三门课程《结构化机器学习项目》的学习,这门课程两周就可以完成。

1.前言

《构建机器学习项目》这门课程就是学习机器学习策略,从而能够高效的优化机器学习系统。所谓的机器学习策略可以解释为上图,我们正在构建一个猫类分类器,但是其效果不是很好,那么我们就想到一些优化该分类器的方法,比如增加更多的数据,增加数据的多样性(更多猫的姿势或者多样性的反例图片),使得梯度下降优化器训练得更久,使用另一个完全不同的优化器(如Adam),一个更大或者更小的网络,使用Dropout或者L2正则化,改变神经网络架构(修改激活函数或者改变隐藏层单元数量)。优化方法有很多,但是一旦选择错误就可能在一个方向上白费时间,那么所谓的机器学习策略,就是能够判断哪些方法可以尝试,哪些方法可以直接舍弃。

2.正交化

在构建机器学习系统的过程中有一个挑战,就是可以修改和尝试的值太多,超参数就很多不知道要调整哪个,但如果能够清晰的知道调整哪个参数能够达到什么样的效果,那么这样的一个过程就叫做正交化。

为了更加理解什么是正交化,列举了上图中的两个例子。 ​ 左边一个例子是老式电视机,这个电视机上有着很多的按钮,用于调整电视机图像位置,例如第一个按钮用来调整图像的高度,第二个按钮用来调整图像的宽度,第三个按钮用来调整梯形的角度,等等。电视设计师花了很多时间设计电路,目的就是让每个按钮都对应一个功能,假如一个按钮的功能是0.1×图像高度+0.3×图像宽度-1.7×梯形角度,那么这个按钮永远不可能将图像调至中间,那么所谓的正交化就是要让一个按钮对应一个功能,也就是知道需要调整哪个按钮,并且知道它能够达到怎样的效果,这样就很容易将图像调整至电视机中间。 ​ 右边一个例子是驾驶车辆,我们都知道方向盘用于控制方向,油门和刹车用于控制速度,控制速度和方向的控制器是相互独立的,调整方向时不会影响速度,同样调整速度时不会影响方向,这样就可以轻松的控制方向和速度。如果有个控制器是0.3×角度-0.8×速度,这样也可以使得方向和速度达到我们的要求,但是比起单独控制速度和变量难得多。所谓的正交化就是速度和方向是正交的两个轴,他们的变化不会互相影响。

那么机器学习的正交化是什么?如上图要想要一个效果好的机器学习系统,就要调整系统的按钮,确保达到四个要求:①确保系统在训练集上效果不错;②确保系统在验证集上效果不错;③确保系统在测试集上效果不错;④确保系统在真实场景中的应用效果不错,也就是有比较好的泛华能力。那么如果训练集上效果并不好,这时候就要调整按钮,这个按钮可以是增大网络规模或者更换优化器;如果训练集上效果比较好,验证集上效果不是很好,这时就可能是在训练集上出现了过拟合的情况,调整的按钮就可以是正则化或者是增大训练集;如果验证集上效果比较好,测试集上效果不是很好,这时就可能是在验证集上出现了过拟合的情况,调整的按钮就可以是增大验证集;如果测试集上效果比较好,泛华效果不是很好,这时就可能是成本函数不适应现实场景情况或者是验证集出现了差错,调整的按钮就可以是改变成本函数或者是改变验证集。所谓的机器学习策略的正交化就是针对特定的情况,调整特定的参数,达到想要的效果。 ​ 值得强调的是early stopping这个按钮,不是常用的正交化按钮,因为early stopping可以使得数据集没有那么拟合,又可以改善验证集的表现,它影响着两个因素,所以不被常用。 ​ 学习了上述知识之后,正交化可以进一步解释为:针对某一情况,选择特定的优化方法(按钮),达到预期的效果。

3.单一数字评估指标

无论是在调整超参数,还是尝试不同的优化算法,如果设置了一个单一实数评估指标,那么这个过程都会快很多,因为它会快速的告诉我们现在的算法相比于上一个算法,哪个好一点。

假如有一个猫图片分类器A,然后通过调整超参数和改变数据集得到猫分类器B。评估该分类器的比较好的两个指标是查准率和查全率,查准率是指分类器分类是猫的图片中真的是猫图片的概率,查全率是指总图片中分类器分类正确的概率。但是这里有一个问题就是B分类器的查准率比A分类器查准率好,B分类器的查全率比A分类器的查全率好,就无法判断出哪个分类器的效果好一点。因此为了尝试更多的超参数或者是想法,并且能够从十几个分类器中快速的选择出最好的那一个,我们最好是定义单实数评估指标,而不是如上图这样的查全率和查准率两种指标。上图是F1分数就是查全率和查准率的某种平均值,不是直接平均值,是一种调和平均值,其公式如上图,它能够很好的代表查全率和查准率,并且可以看出A分类器的F1分数比B分类器好,因此可以快速的选择A分类器而淘汰B。

4.满分指标和优化指标

要将考虑的多件事情组合为一个单一实数指标是一个不容易的事情。针对于有太多需要考虑的事情的情况下,提出满分指标和优化指标。如上图左边的例子有三个猫分类器,我们将分类器的分类准确度看的很重,是必须考虑的评估指标,除此之外,运行时间(分类一张图片需要的时间)也是必须考虑的指标,那么要将这两个指标都考虑进来,一种方法是计算两个指标的线性加权求和值:accuracy+0.5×running_time。另一种方法就是指定准确度最优化的情况下,满足运行时间的要求,也就是将准确度令为优化指标,因为想准确度最优化,而运行时间为满足质变,因为只要满足了运行时间要求就可以不管这个指标了,意思是只要定义了满足指标和优化指标,就相当于给了一个明确的方式去获得较好的分类器。 ​ 那么在现实情况中指标肯定不止两个,假如有N个指标,你想要最大化的优化其中的一个指标,那么这个指标就是优化指标,剩下的N-1个都是满足指标。

再看上图右边的例子,是一个检测唤醒语的系统,例如说了‘Hey siri’,你的语音控制系统就被唤醒。这里有两个指标,一个是当我们说唤醒语时,设备真的被唤醒的概率,一个是我们并没有说唤醒语,设备随机被唤醒的次数。在这里就可以将当我们说唤醒语时,设备真的被唤醒的概率设置为优化指标,因为我们想让这种概率最大化,另外将设备随机被唤醒的次数设置为满足指标,比如24小时内只能被随机唤醒一次,这样就能够比较好的衡量唤醒检测系统的准确性。

5.设置验证集和测试集

无论是单实数评估指标,还是满足和优化指标都是从训练集、验证集和测试集上面计算得来的,因此在获取这些指标之前,应该学会如何设置训练集、验证集和测试集,并且如何设置训练集、验证集和测试集会大大的影响机器学习项目的进展速度。

机器学习的流程是当我们拥有很多个想法的时候,会构建多个模型,然后用训练集去训练这些模型,然后用验证集找出比较好的模型,一直迭代,直到达到成本函数要求,将最后的模型在测试集上测试,检测其泛化能力和实际应用性。

那么在机器学习的流程中如何设置验证集和测试集就显得尤为的重要,因为它们可以影响该流程收敛的速度。如上图设置了一个猫图片分类器,这个分类器要投入如上图的八个地区使用,假设将前四个地区得到的数据设置为验证集,将后四个地区得到的数据设置为测试集,那么结果会非常的糟糕,因为这些数据来自不同的分布,就像上图右上角我们设置了验证集和单实数评估指标,这会使得我们的快速的找到最好的分类器,也就是快速的逼近如上图的靶心,那么花了几个月的时间从验证集上找到了最好的分类器,一旦在测试集上进行测试时就会得到非常糟糕的结果,因为测试集和验证集根本是不同的分布。这时的解决办法就是将八个地区的数据随机洗牌,然后均匀的放入验证集和测试集中,使它们为同一分布。

如果收集的数据使得模型效果很好,那么就要多收集这样的数据,然后将其随机分配到验证集和测试集中去。因此在设置验证集和测试集的时候,一定要使两个数据集来自于同一个分布。

训练集如何设置会在后面的视频里面提到,对于如何设置训练集、验证集和测试集可以归纳为上述的射击靶子的例子,设置验证集和单实数评估指标可以找到我们需要瞄准的目标,设置与验证集同一分布的测试集,可以真正的瞄准目标,而训练集的设置就可以决定逼近瞄准目标的速度。

6.验证集和测试集的大小

通过上一节我们知道了如何设置验证集和测试集,必须让它们来自同一分布,最终瞄准的才是同一个目标。那么它们的大小又应该如何设置,在原来数据量比较小的时代,常常的划分方式为:①70%训练集、30%测试集;②60%训练集、20%验证集、20%测试集,这对于数据量比较小的情况下是很合理的,但当数据量达到百万级别,那么划分方式为98%训练集、1%验证集、1%测试集,因为万级的数据已经够验证集和测试集了。

测试集的功能是验证模型的泛化能力以及实际应用性,其大小直接决定它的置信度评估系统的整体性能,但是一万,十万的数据足以它使用。有时候在设置训练集、验证集和测试集的时候,还忽略了测试集,其实这是不建议的,因为用一组无偏差的数据最后对模型进行评估是比较保险的。

在原来验证集比较大的原因是因为想要找出比较好的模型(比较好的想法),测试集的目的是得到较好模型的成本偏差,原来数据量比较小的时候验证集和测试集所占总数据的比例还比较大,但是现在数据多起来了,验证集和测试集远远占据不了总数据的20%。

7.什么时候改变验证_测试集和评估指标

有了验证集和评估指标之后,我们就知道我们需要瞄准的目标是什么,测试集可以真正瞄准目标。但是有时候发现瞄准的目标弄错了,需要瞄准另外一个目标,这时候就要改变验证_测试集和评估指标。

如上图是一个猫分类器,在收集大量的图片时,不小心混入了很多的色情图片。利用分类错误率作为评估指标,A分类器的分类错误率只有3%,B分类器的错误率有5%,因此A分类器是比较好的。但是由于某种原因A分类器容易将色情图片识别为猫,那么如果部署A分类器,用户会看到更多的猫图片,但是也会推送色情图片,对于用户来说是不希望看到色情图片的。那么B分类器虽然提供的猫图片比较少,但是它不会推送色情图片,这是用户希望的。因此根据用户的实际需要,B分类器是更好的选择,但是验证集和评估指标显示A分类器更好,说明评估指标已经不能衡量算法的优劣顺序,出现这样的情况就意味着应该改变评估指标,或者是验证集和测试集了。

如果你的评估指标无法正确评估好算法的排名,那么就需要花时间定义一个新的评估指标。这是定义评估指标的其中一种可能方式(上述加权法)。评估指标的意义在于,准确告诉你已知两个分类器,哪一个更适合你的应用。

上述是一个正交化的例子,告诉我们机器学习项目应该分为独立的两步进行。第一步就是思考设定一个怎样的指标去衡量我们想要做的事情,也就是设置一个目标;第二步是思考我们的系统如何在这个指标上面进行优化,也就是精确瞄准这个目标.

上图是需要改变评估指标,测试集或者验证集的另一个例子。有两个猫分类器A和B,两个分类器的验证集和测试集都是网上下载的高质量的猫咪图片。利用错误分类率作为评估指标,结果显示A错误分类率为3%,B错误分类率为5%,显然A的效果比较好。但是当把这两个分类器都部署到手机应用上时,B表现的效果却要好一点,这是因为手机应用用户上传的猫图片都是低分辨率的,不容易识别的,与验证集和测试集很不一样,这样评估指标并不能很好的对分类器进行优劣排序,因此就应该改变验证_测试集或者是评估指标。

8、为什么是人的表现

很多机器学习的团队都在研究如何比较机器学习系统和人的表现,原因有两个:①由于深度学习领域的兴起,很多机器学习的算法都得到了优化,有些算法已经危及到人类的表现;②使得机器去学习人类要做的事情,或者模仿人类的行为,为其设置精细的工作流程可以加快工作效率,这种情况下与人类的行为作比较也是比较合理的。

上图的曲线图中横轴是时间,纵轴是准确率,蓝色虚线代表人类水平,绿色虚线代表理论上限(贝叶斯最优错误率)。假设一个团队使得自己的机器学习系统在一个问题上模仿人类的行为,在未达到人类水平时,机器学习系统的性能上升是非常快的,但是一旦超过了人类水平,机器学习系统的性能还是可以上升的,只不过上升得非常慢,且不会超过贝叶斯最优错误率,如上图的紫色曲线所示。贝叶斯最优错误率是无法达到的,也就是无法找到一个函数使得x(完全模糊的猫图片)到y(100%能够识别出来是猫),它只是x到y的理论上的函数。

为什么机器学习系统的性能一旦超过了人类水平就会非常慢,有两个原因:①在很多任务中人类的水平与贝叶斯最优错误率很相近,因此一旦超过人类的水平,就没有很大的提升空间了;②很多工具在为超过人类水平时对于提升机器学习系统的性能很有帮助,一旦超过人类水平,这些工具就不好使用了。

对于人类很擅长的任务,比如图片识别、语言识别等,人类很擅长处理这些自然数据,当机器学习系统在这些任务上还没有超过人类的水平时,可以通过如上图的三个方法提高机器学习系统的性能:①请人或者是花钱让人标记很多的标签,给系统喂更多的例子;②让人类去看算法错误的例子,找到错误出在那里,分析人类为什么对,算法为什么错;③更好的分析方差和偏差。但是一当机器学习系统的性能超过人类的水平,这些方法就很难使用了。这也是和人类比较的好处,特别是人类擅长的任务上。

9、可避免偏差、可避免方差

为什么机器学习系统很擅长模仿人类的行为,并且可以超越人类的水平?这是因为在我们知道了人类的水平之后,我们就可以知道我们的模型到底做得多好,或者说是多差,进而通过调整偏差和方差,快速提升机器学习系统的性能,从而达到人类的水平,或是超过人类的水平

如上图还是以猫图片分类器为例子,假如训练集的错误率为8%,验证集的错误率为10%,人在识别猫图片的错误率为1%,那么可以看出训练集的错误率为8%与人类识别是有差距的,这时算法与训练集都不能有比较好的拟合,这时候就是高偏差的表现,可以通过加大神经网络模型和延长梯度下降训练的时间来减少偏差。

又假设训练集的错误率为8%,验证集的错误率为10%,人在识别猫图片的错误率为7.5%(图片很糊,人类都不能辨别出图片中有猫),那么可以看出训练集的错误率为8%与人类识别很接近,但是验证集上的错误率与人的识别还是有差距的,因此就可能在训练集上过拟合的,这时候就是高方差的表现,可以通过正则化减少方差。

在很多计算机视觉任务中,我们都用人类的错误率来代替贝叶斯最优误差率,因为人类比较擅长计算机视觉的任务,这种替代是比较合理的。同理将上图中的人在识别猫图片的错误率认为就是贝叶斯最优误差率,左边一个例子的贝叶斯最优误差率为1%,那么有很多改进的空间,可以通过减少偏差的手段,左边一个例子的贝叶斯最优误差率为7.5%,训练集上没有很多改进的空间,而验证集上还是有改进的空间,可以通过减少方差的手段。

那么将训练集上的错误率与贝叶斯最优误差率的差值叫做可避免偏差,我们希望训练集上的错误率可以接近贝叶斯最优误差率,但是也不希望能够超过贝叶斯最优误差率,因为贝叶斯最优误差率是一个理论上的最优值,如果超过只有过拟合这种情况。将验证集上的错误率与训练集上的错误率的差值可以叫做可避免方差。那么以后用来形容一个分类器性能好不好时,如果单单从训练集和验证集上的错误率看是看不出来的,以后就可以用可避免偏差和可避免方差描述一个分类器的性能。

右边一个例子的可避免误差为0.5%,可避免方差为2%,因此减少方差是重要问题。左边这个例子的可避免误差为7%,可避免方差为2%,因此减少偏差是重要问题。

10、理解人的表现

在很多的论文中都用到人类水平表现这个词,正确理解这个词语也许会帮助加快机器学习项目的进展。

在前面已经知道在计算机视觉和一些图像处理任务中可以利用人类水平错误率来代替理论上最低的贝叶斯最优错误率。上图是一个医学图像分类的例子,假如一个普通的人错误率为3%,一个普通的医生错误率为1%,一位医术高超的医生错误率是0.7%,一个医术高超的医生团队的错误率是0.5%。

那么如何界定上述这么多错误率(3%、1%、0.7%、0.5%)中哪个才是人类水平错误率?要知道我们需要的人类水平错误率是用来代替贝叶斯最优错误率的,因此贝叶斯最优错误率肯定是小于等于0.5%的,因此我们应该将我们所知道的最低的错误率0.5%作为人类水平错误率,也许会有更好的团队,拥有更低的错误率,但是我们已知的最低就是0.5%,就将它作为人类水平错误率。

但是如果再写论文或者部署系统时,人类水平错误率1%就可以达到实用要求,那么也可以将人类水平错误率定为1%。所以我们要清楚自己定义人类水平错误率的目的是什么,如果只是为了达到某一要求,可以根据自己的实际需要选择人类水平错误率,但是如果是利用人类水平错误率代替贝叶斯最优错误率,那就只能选择最低的0.5%的人类水平错误率。

上图还是医学图像分类的例子,仍然用人类水平错误率代替贝叶斯最优错误率,其中训练集上的错误率与贝叶斯最优误差率的差值叫做可避免偏差,验证集上的错误率与训练集上的错误率的差值可以叫做可避免方差。当训练集上的错误率为5%,验证集上的错误率为6%时,这时候选择0.7%、0.5%还是1%作为人类水平错误率其实都差不多,因为无论是0.7%、0.5%还是1%中的哪个值可避免偏差都比可避免方差大得多,应该将关注点放在减少偏差上。

又比如训练集上的错误率为1%,验证集上的错误率为5%时,这时候选择0.7%、0.5%还是1%作为人类水平错误率其实都差不多,因为无论是0.7%、0.5%还是1%中的哪个值可避免方差都比可避免偏差大得多,应该将关注点放在减少方差上。

又比如训练集上的错误率为0.7%,验证集上的错误率为0.8%时,这时候选择0.7%、0.5%还是1%作为人类水平错误率就比较重要,因为选择不同的值,就会导致是方差的问题还是偏差的问题,没有选择好,就会优化错误,模型的性能就得不到很好的提升。

讲这个例子也是说明了,在我们的模型离人类水平很远的时候,无论选择哪个人类水平错误率,都可以确定是方差还是偏差的问题,进而进行改进使得模型的性能得到提升。但是在我们的模型离人类水平很近的时候,选择哪个人类水平错误率就是一个关键的问题,否则很难确定是方差还是偏差的问题,模型的性能也难以得到提升。因而人类水平错误率的选择对于后期模型性能的提升是比较重要的。

在之前的例子中我们没有人类水平错误率,而直接是将0%的错误率作为训练集错误率的对比值,因而从中直接估计偏差,但是现在我们不用偏差来形容模型的性能了,通过定义用人类水平错误率代替贝叶斯最优错误率,从而确定可避免偏差和可避免方差,它们可以用来形容模型的性能,还可以根据它们的值采取相应的减少偏差或者方差的策略,进而替身模型的性能。

11、超过人的表现

很多团队都会因为机器在特定的识别分类任务中超越人的表现而惊喜。因为机器的性能越接近于人的表现,就越难以提升,更别说超越人的表现了。其原因可以看到上图的例子。左边一个例子中一个团队的错误率是0.5%,,一个人的错误率是1%,机器在训练集上的错误率是0.6%,机器在验证集上的错误率是0.8%,那么如果要挑选人类水平表现来代替贝叶斯最优错误率(理论最低)的话,就只能选0.5%作为贝叶斯最优错误率,这时候的可避免偏差和方差分别是0.1和0.2,进而调整可避免方差的空间比调整可避免偏差要多,因此就知道应该去调整方差,从而提升机器的性能。

看到上图右边一个例子一个团队的错误率是0.5%,一个人的错误率是1%,机器在训练集上的错误率是0.3%,机器在验证集上的错误率是0.4%,这时候如果要挑选人类水平表现来代替贝叶斯最优错误率(理论最低)的话,也只能选择0.5%,但是这就以为着机器在训练集上过拟合了0.2%,但是贝叶斯最优错误率也可能为0.1 %,0.2%等,那么这时候不知道怎么定义贝叶斯最优误差率,就不知道应该调整偏差还是方差,模型的性能也难以得到提升。因此只要机器的性能0.3%超过了人类水平表现0.5%,或者接近人类水平表现,我们就无法根据人类的建议进行模型的优化。

但是现在机器学习系统可以在很多问题上超越人类表现水平。如上图的四个问题,机器学习系统都已经超越了人类的水平。第一个问题是推送的网络广告,哪个网络广告用户更感兴趣,更有可能点击。第二个问题产品推荐,哪个是用户更需要的产品。第三个问题物流预测,预测物流从A地到B地的时间。第四个问题贷款偿还能力的预测,从而决定是否提供贷款服务。这四个问题都是来自于结构化数据,例如用户点击记录、用户购买记录、物流时间记录、贷款记录及结果。当然这些结构化数据,都不是自然感知问题,不是计算机视觉,语音识别和自然语言处理等任务,这些自然感知任务中人类表现水平是比较强的,不容易超越,但是在上图的非自然感知问题中,只要数据够多,计算机很容易超过人类。另外大量的数据是计算机在各类任务超越人类的关键。

但是在一些计算机视觉任务和语音识别任务,以及医疗任务中,很多机器学习系统也超过了人类的水平,但这是因为经过了搜集了大量的数据,尝试了大量的深度学习模型,调整了很久的超参数才得到的效果。

12、改变模型的表现

已经学习过了正则化、如何设置验证集和测试集、人类水平表现代替贝叶斯最优错误率、可避免偏差和方差等内容,现在将这些内容组合作为算法优化指导方针。

如上图假设模型在训练集上拟合得比较好,也就是可避免偏差比较低。另外模型在验证集和测试集上推广的效果也比较好,也就是可避免方差比较低。在正交化的方针下,设置如上图的两组按钮灵活的调整可避免偏差和方差,进而提高模型的性能,也就是使用更大的模型或者训练更久来减少可避免偏差,和通过正则化或者更大的数据集减少可避免方差。

总结一下前面内容如何调整可避免偏差和方差的流程。首先是将人类水平表现去代替贝叶斯最优错误率,然后计算出可避免偏差和方差。如上图又将减少可避免偏差的方法总结了一遍:更大的网络模型;训练更久;更优化的梯度算法(Adam、RMSP);更好的神经网络架构;更好的超参数组合。减少方差的方法总结:更多的数据;正则化(L2、Dropout);更好的神经网络架构;更好的超参数组合。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐