1.为什么要ML策略
图8.1 启发性的例子假设正在调试猫分类器,经过一段时间的调整达到了90%准确率,但是仍然不够理想,需要改善。改善方法比如:
去收集更多的训练数据,
或者集更多不同姿势的猫咪图片增加多样性,
或者更多样化的反例集,
或者用梯度下降算法训练更久一点,
或者尝试用一个完全不同的优化算法,比如Adam优化算法,
或者尝试使用规模更大或者更小的神经网络,
或者试试 dropout 或者 L2正则化,
或者修改网络的架构,比如修改激活函数,改变隐藏单元的数目等。
当尝试优化一个深度学习系统时,通常有很多想法可以去试,问题在于该想法是否有用,而不是在做无用功,这时ML策略特别重要。
2.正交化
建立机器学习系统挑战之一是,可以尝试和改变的东西太多,这时需要用到正交化,即对于调整哪些东西,可以得到哪些效果,是明确的。
图8.2 正交化例子如图8.2,电视的图像有很多按钮去调整,比如:
一个旋钮用来调图像垂直方向的高度,
一个旋钮用来调图像宽度,
一个旋钮用来调梯形角度,
一个旋钮用来调整图像左右偏移,
一个旋钮用来调图像旋转角度等。
汽车的行驶也是需要很多控制去控制,比如:
方向盘控制方向,
油门和刹车控制速度等。
每个功能调整都对应一个控制,而不会使用一个控制去控制所有功能,因为这样很难。上面两个例子就是正交化,各个调整互成90度,一个调整对应一个性质,从而很容易调整到想要的效果。
图8.3 好的学习系统需要确保的方面设计一个监督学习系统,确保以下四方面是正确的并且是正交的。首先,通常必须确保至少系统在训练集上得到的结果不错,即训练集上的表现必须通过某种评估,达到能接受的程度,对于某些应用,这可能意味着达到人类水平的表现,但这取决于你的应用。然后系统也能确保在开发集上有好的表现,在测试集上也要确保有好的表现,在实际使用中表现也要确保令人满意。
如果算法在成本函数上不能很好地拟合训练集,就需要一组“旋钮”,让它很好地拟合训练集,旋钮可能是训练更大的网络,或者可以切换到更好的优化算法,比如Adam优化算法等。
算法在开发集上做的不好,在训练集上做得很好,就需要有一组正则化(或增大的训练集等)的“旋钮”可以调节,尝试让系统满足在开发集上有好的表现。
如果系统在开发集上做的很好,但测试集上做得不好呢?那么“旋钮”可能是更大的开发集。因为如果它在开发集上做的不错,但测试集不行这可能意味着对开发集过拟合了,需要往回退一步,使用更大的开发集。
最后,如果测试集上做得也很好,但实际应用无法给用户提供良好的体验,这意味着需要回去改变开发集或成本函数,要么开发集分布设置不正确,要么成本函数测量的指标不对。
训练神经网络时,一般不用early stopping(开发集上的表现开始下降的时候,停止训练)。因为early stopping影响对训练集的拟合,同时也用来改善开发集的表现,所以这个“旋钮”没那么正交化。
3单一数字评估指标
无论是调整参数,还是尝试不同的学习算法,或者是在搭建机器学习系统时尝试不同手段,如果有单一数字评估指标,进展会很快。因为单一数字评估值可以让你很容易知道新尝试的手段比之前的手段好还是坏。
图8.4 单一数字评估指标应用机器学习是一个非常经验性的过程,通常是有一个想法,然后编程跑实验,然后用实验结果去改善想法,这不断循环的过程,想法也不断得到改善。
假设对于猫分类器,之前已搭建了分类器A,通过改变超参数还有改变训练集等手段,现在训练出新的分类器B。评估分类器一个合理方法是对比查准率和查全率。A和B(或者更多分类器)查准率和查全率并不一致(都高或者都低),很难快速去选择合适分类器,所以需要找到一个新的指标去结合查准率和查全率。在机器学习文献中,结合查准率和查全率的标准方法是F1分数(数学上叫调和平均数),通过F1分数就能很快选择出合适的分类器。
很多团队都是这样做,通过明确的开发集测出查准率和查全率,然后加上单一数字评估指标,快速判断算法好坏,从而使迭代更快。
4.满足和优化指标
要把顾及到所有事情组合成单一数字评估指标,有时不容易,这时候设立满足指标和优化指标尤为重要。
图8.5 例子如图8.5,假设衡量分类器的指标有准确率和运行时间,将准确率和运行时间组合成单一指标显然不合理,因为一般来说,运行时间10ms和100ms对于用户来说差别不大。可以将运行时间设置为满足指标,<100ms即可,准确率为优化指标,越精确越好,这样根据精确度判断分类器好坏即可。
一般地,假设有N个指标,可以将1个设置为优化指标,其余设置为满足指标。
5.开发/测试集划分
设立训练集、开发集和测试集的方式,大大影响你或你团队在建立机器学习应用方面取得进展的速度。
图8.6 开发集和测试集的设立开发集也称为保留交叉验证集。
机器学习中的工作流程是:尝试很多思路,用训练集训练不同的模型,然后用开发集评估不同的思路从而选一个模型,然后不断迭代去改善在开发集的性能,直到最后得到一个令人满意的模型,在使用测试集去进行评估。
如图8.6,开发集和测试集必须在同一分布,即瞄准同一靶心,而不是开发集数据来自四个地区,而测试集数据来自另外四个地区。不然已经在开发集上逼近靶心了,最后用测试集评估时会很失望,因为测试集对的是另外一个靶心。
6.数据集的大小
图8.7 数据集划分方式在早期的机器学习中,数据量很小,所以数据集划分一般是训练集70%测试集30%或者训练集60%开发集20%测试集20%,但在如今大数据时代,数据量都是百万以上的,数据集划分一般为开发集98%开发集1%测试集1%,开发集和测试集有1万条已经足够满足了。
有些团队不需要测试集,即只划分训练集和开发集,这时开发集称为测试集(没有统一的术语),但是不建议这样做,防止对开发集过于拟合。
7.什么时候改变开发集、测试集和指标
设立开发集、测试集和评估指标是给团队一个目标(靶心),让算法不断逼近这个目标。但有时这个目标可能有偏差,需要去改变开发集、测试集和指标从而去修正目标。
图8.8 猫例子如图8.8,一个猫分类器,评估指标是错误识别率,假设计算错误识别率公式为:
Error=(1/m) * I{y_pred(i)≠y(i)}。
A分类器的错误识别率为3%,B分类器的错误识别率为5%,所以按照这个公式,自然是A分类器更好,选择给用户使用的自然是A。但是A分类器会把色情图识别成猫图,B而不会,这令用户非常不满,所以需要修改评估指标去调整算法目标,可以在错误识别率公式加上权重w,即:
如果是色情图,则w=10,反之,w=1,加大色情图片权重,
Error=(1 / ) * * I{y_pred(i)≠y(i)},
上面的步骤分为设立目标,然后瞄准和击中目标,这两步是独立分开的,其实也是一个正交化过程。
图8.9 另外个例子如图8.9,分类器在训练时使用的是网上下载的高清高质量图,而在实际应用中的图片确实用户手机拍摄的,图片可能模糊或质量低,从而令用户很不满意。这时需要修改开发集、测试集去调整算法目标,即把一部分手机拍摄的的图片放入开发集、测试集。
目标设定难以一下子很准确,可以在训练算法过程中不断迭代,不断修改。
8.为什么与人的表现对比
在过去几年时间里,很多机器学习团队一直在讨论,如何比较机器学习系统和人类的表现。为什么要去比较,原因有二:①深度学习算法的进步使机器学习算法突然变得更好了,在许多领域机器学习算法已经威胁到人类的表现了;②让机器做人类能做的事,需要根据人类表现去设计机器学习系统的工作流程,让其工作效率更高。
图8.10 与人类表现比较如图8.10,训练一个算法时,一般地,在未超越人类表现水平(蓝虚线)时其准确度迅速提升,当超过人类表现水平后就会很缓慢的向理论最佳性能水平逼近(绿虚线),即贝叶斯最优误差,一般不会是0%。
超过人类表现水平后进展缓慢原因是:
一是人类表现一般都是极其接近贝叶斯最优误差;
二是在未超越人类表现时有很多工具可以辅助提高性能,超越之后这些工具就没那么奏效。
图8.11 为什么与人类水平的表现相比如图8.11,只要机器学习算法还比人类表现差,就可以从以下策略优化:
一是可以获取大量人类标记数据喂给算法;
二是人类可以协助分析错误;
三是更好去分析偏差/方差。
9.可避免偏差
图8.12 可避免偏差和方差如图8.12,在猫分类中,人类表现基本上就是贝叶斯最优误差。训练集误差与贝叶斯最优误差的差距即是可避免偏差,训练集误差与开发集(验证集)误差的差距即是方差。如果可避免偏差较大则考虑优先优化可避免偏差,否则优化方差。
10.理解人的表现
图8.13 根据人的误差估算贝叶斯误差如图8.13,一副医学影像,普通人能做出正确判断错误率是3%,普通医生是1%,专家是0.7%,专家团队是0.5%,则贝叶斯误差<=0.5%。那么哪个错误率代表着人的表现呢?其实这要根据你研究的课题,你是要算法超过一个普通的医生,那么人的表现错误率就是1%,还是超过专家,那么人的表现错误率就是0.7%。一般地,认为人的最高水平为贝叶斯误差,即0.5%。
图8.14 误差举例如图8.14,在训练算法时,一般使用人的表现误差代替贝叶斯误差。
假设训练集误差为5%,测试集误差为6%,此时,无论贝叶斯误差为0.5%、0.7%还是1%,可避免偏差比方差大得多,所以此时应该先减少可避免偏差。
假设训练集误差为1%,测试集误差为5%,此时,无论贝叶斯误差为0.5%、0.7%还是1%,方差比可避免偏差大得多,所以此时应该先减少方差。
假设训练集误差为0.7%,测试集误差为0.8%,此时,当贝叶斯误差为0.5%应该是减少可避免偏差,当贝叶斯误差为07%应该是减少方差;所以此时贝叶斯的估算很重要,假设你只知道专家误差为0.7%,那么很难去估算出贝叶斯误差为0.5%,也就造成了算法水平超过人的表现时很难去分辨出是可避免偏差还是方差,即很难去往前推进。
图8.15 总结以前章节讲的都是按贝叶斯误差为0来,根据偏差和方差拟合网络,但实际上很少有贝叶斯误差为0。识别猫人类水平几乎完美,可以认为贝叶斯误差为0,但在语言识别上就不能认为贝叶斯误差为0,因为语言识别会存在很多噪点。即我们需要根据可避免偏差和方差来拟合网络。
11.超过人的表现
图8.16 和人的表现对比如图8.16,假设单个人误差为1%,团队误差为0.5%,那么认为贝叶斯误差为0.5%。当训练集误差为0.3时,是该认为算法过拟合了还是贝叶斯误差还要更低,这时已无法凭借人类经验去做出判断,现有的工具这时就没那么好用了,所以当算法超出人类表现时就很艰难再继续往前。
12.改善模型的表现
图8.17 改善模型的方法如图8.17,改善模型第一先尽可能拟合训练集数据,尽量减少可避免偏差,方法有:训练更大的模型;使用更好的算法,如momentum、RMSprop、Adam等;更换模型架构如循环神经网络,卷积神经网络等。
然后就是减少方差,方法有:训练更多数据;使用正则化;更换模型架构等。
网友评论