1.正交化
这是一个老式电视,有一组旋钮可以对画面进行调节,例如高度、宽度、画面梯形角度、画面位置、画面旋转等等,但是如果有一个旋钮,旋转时可以调节上面所有参数,那么就会出现一种情况:当前的画面高度和宽度都合适,但是画面位置不对,我旋转该万能旋钮,画面位置对了,结果高度和宽度又不合适了。这里面就体现正交化的思想:电视设计师在设计旋钮的过程,尽可能的让一个旋钮只控制一种功能或属性,多个旋钮控制互不相关的功能或属性,只有这样,才能让调节更加合适。
正交化在坐标系中可视化,就像平面中的x轴和y轴,3维坐标系中的x、y、z轴。在x轴上移动坐标,永远不会影响y轴的坐标,它们相互垂直。由此,这启发我们也在深度学习领域设置一组旋钮,这些旋钮分别控制不同的功能,当我们的模型在某一方面的表现不好时,就可以针对问题调整对应的旋钮,从而提高模型的性能。
一个模型的完成需要经过:训练集、验证集、测试集、实际运用。从这四个方面考虑模型的性能,如果一个模型在训练集表现不好,就需要一组正交旋钮调整,让模型在训练集表现的更好,比如更大的训练集、更好的优化算法。如果一个模型在训练集表现良好,但在验证集表现不好,就需要正交旋钮调整超参数。如果一个模型在训练和验证集都表现良好,但是在测试集表现不好,就需要正交旋钮调整比如开发集规模更大。如果一个模型在前三个阶段都可以,但是实际运用效果较差,就需要正交旋钮调整比如损失函数、损失函数的评价指标(也是优化目标)等等。
2.单实数评估指标
在训练网络的过程中,我们通常的目标是损失函数最小化,但是对于网络整体的性能究竟如何?我们想让网络朝那些方向发展?就需要设计一个评估指标,表示网络当前的性能。
机器学习和深度学习是一个实验性和经验性的过程,通常我们产生一个idea,就编写代码,然后进行训练测试,根据评估指标,修改idea进而再次迭代这一过程。假设我们有一个猫咪图片分类器A和B,A的查准率(一张图片被正确识别为猫的概率)是95%,召回率(所有猫的图片有多少被正确识别的)是90%。B的查准率是98%,召回率是85%。这两个分类器在两个指标各有优劣,我们可以使用平均数来将两个指标合成为一个指标。使用调和平均数:
其中,P是查准率,R是召回率。
经过计算发现A分类器效果更好,因此淘汰B分类器,对A分类器再进行优化。但是有些指标难以合成为一个评估指标,如下:
分类器A的运行时间最短,但是准确率最低,B运行时间较短,准确率也还可以,C运行时间远远大于A和B,但是准确率最高。如果从准确率出发,会选择C分类器,但是它的运行时间1.5s,难以接受。如果选择最快的分类器A,它的准确率又比较低。可以采用简单的线性合成,例如:
但是这种方式过于随意。还可以采用约束条件,比如选出最具有代表性的指标作为优化指标------准确率,其余指标进行条件约束,这样情况下我们可以尽可能的满足其他需求下,优化准确率。比如我们选择RunningTime的时间不超过100ms,这样的话C就被淘汰,然后选择满足约束条件的模型中优化指标最好的,也就是B分类器,这样的话就可以帮助我们选择良好的模型。
3.训练集、验证集和测试集
如果我们要训练一个有关地区分类的模型,有如下图片8个地区,应该如何进行训练集、开发集和测试集的划分?现有两种方案,第一种:训练集取一部分国家,开发集和测试集取一部分国家。第二种:训练集、开发集和测试集都从8个随机选取数据,也就是说每个集合8个国家的数据都涵盖部分。
实际上,如果选择第一种方案,很有可能出现在训练集表现良好,在开发集和测试集表现较差。这是由于不同国家的地理环境、风土人情都不同,训练出来的模型适应这些国家,就不一定适应其他国家,因此需要选择第二种方案。第二种方案的训练集、开发集和测试集都来自同一分布,训练出来的模型鲁棒性较好。这就是训练集、开发集和测试集划分的重要原则:来自同一分布。
至于训练集、开发集和测试集的数据比例,见如下链接:深度学习基础---参数调优http://t.csdnimg.cn/JDIXI
4.什么时候应该改变开发集、测试集和评估指标
在实际运用模型的时候,可能出现一些情况:模型的目标出现偏差,这时候就需要改变开发集、测试集和评估指标了。
4.1.改变评估指标
假设有猫咪分类器A和B,实际中希望分类器向用户推送猫咪的照片。A模型只有3%的错误率,但是其中会推送一些低俗照片,这是用户所不能接受的。B分类器虽然有5%的错误率,但是不会推送低俗照片。模型的评估指标是错误率,如下:
这种情况下,评估指标告诉我们模型A效果更好,但是实际运用用户告诉我们模型B更好。就启示我们,评估指标出现了问题,因此需要更改评估指标。可以对评估指标进行修改:
其中,mdev开发集的样本数量,w(i)是惩罚权重,如果是低俗照片,该值大,比如10或100等,如果不是,该值小,比如1。这样就赋予了低俗图片更大的错误率,这样就有了更加准确的目标,即错误率越小。
改变评估指标其中也蕴含着正交化的思想,即改变评估指标只是第一步,第二步与其独立,就是优化损失函数。可以将损失函数也加上惩罚权重,比如:
这是对惩罚权重进行归一化的损失函数,通过这样,如果模型的J很大,就说明低俗照片分类的很多,优化函数就会向更少的低俗照片分类进行优化,从而降低损失。
4.2.改变开发集、测试集
还是猫咪分类器的例子,可能出现一种情况,开发集和测试集选择的图片全是高清大图,而实际部署模型后,用户上传的图片千奇百怪,可能很不清晰。这就会导致一种情况,模型在评估指标、开发集和测试集上的表现都很好,但是实际中表现就不好。
这启发我们去更改开发集和测试集,可能需要我们在开发集和测试集添加一些不清晰的图片或各种花样的图片,让模型能更好的反应实际情况。
5.人类水平表现与改善模型
5.1.什么是人类水平表现
机器学习项目的发展是随着时间的增加,模型的性能逐渐上升,但是并不是无限上升,而是在一定程度后,趋于平缓,这个一定程度就是指人类水平表现和贝叶斯最优错误率之间。如下图所示,紫色的线就是机器学习项目准确率的曲线,而蓝色的线是人类水平表现的准确率线,绿色的线是贝叶斯最优错误率的线。
贝叶斯最优错误率是指理论上所能达到的最优错误率,没有任何办法设计一个函数可以达到最优错误率。
人类水平表现是指人类能达到的错误率,对于自然感知领域,人类的准确率是比较高的,因为人擅长听、看等,因此人类水平表现距离贝叶斯最优很近。
5.2.机器学习与人类水平表现关系
在未超过人类表现前,机器学习发展迅速,但是超过人类表现,机器学习的发展就比较缓慢。这里可能有两个原因:1.人类水平表现和贝叶斯最优之间没有多少差距,因此模型到这个区间没有更多的改善空间。2.在没超过人类表现以前,我们可以有很多工具和技巧来发展机器学习,但是一旦超过人类水平,这些技巧可能就不起作用了。
如下图所示,假如正在进行一个图像识别的分类任务,训练误差为8%,开发误差为10%,在机器学习发展未超过人类水平表现的情况下,来看看不同人类水平表现错误率对模型训练策略的影响:
由于人类擅长识别图像,因此人类水平表现的错误率和贝叶斯最优错误率相差不大,且贝叶斯最优错误率一定比人类水平表现小,而我们的目的是为了优化模型从而使机器学习项目更加接近贝叶斯最优错误率,这里称贝叶斯最优错误率和机器学习项目训练集错误率的差值为可避免误差。同时用人类水平表现来估计贝叶斯最优错误率。
如果人类水平表现错误率为1%,那么可避免误差就是7%,而粗略估计训练集和开发集误差之差为方差,则方差为2%。还是在下面那个链接提到:
深度学习基础---参数调优http://t.csdnimg.cn/JDIXI
方差和偏差在机器学习中的理解方式是以贝叶斯最优错误率为0%为前提的,但是实际上这是很难达到的,比如音频分类,如果音频的质量很差,人类都难以听清楚内容,那么贝叶斯最优错误率也很难为0。因此可避免误差就是偏差的一种实际表现。那么在人类水平表现错误率为1%的情况下,偏差比方差大,此时更应该注意偏差,于是可以采用更复杂的网络、更长的训练时间或更优的模型与优化算法等技巧来进行优化。
如果人类水平表现错误率为7.5%,那么可避免误差就是0.5%,方差就是2%。此时更应该注意方差,可以采用正则化、更多的数据或更优的模型等技巧来进行优化。
那在机器学习发展超过人类水平表现的情况下呢?
上图所示,以人类团队的错误率作为人类水平表现,那么绿色框中的人类水平表现为0.5%,比训练误差0.3%和开发误差0.4%都高,此时机器学习的性能已经超过人类水平表现了,此时不知道可避免误差为多少。因为可能是模型过拟合了,或者说贝叶斯最优错误率为0.1%、0.2%或0.3%都有可能,这时无法判断究竟是偏差大还是方差大,于是对于机器学习项目的进展就很缓慢,也就是紫线后面的趋势。
注意:人类水平表现究竟是取大众水平还是取顶尖水平?比如在医学图像识别案例中:
普通人识别图片的错误率为3%,普通医生为1%,经验丰富的医生为0.7%,而经验丰富的医生的团队为0.5%。可以确定的是,贝叶斯最优错误率是理想情况下能达到的最小值,而人类水平表现一定<=贝叶斯最优错误率,因此用顶尖水平作为人类水平表现来估计贝叶斯错误率是最好的选择。而如果在一些场合只需要模型超过个人水平,那用普通人的水平作为人类水平表现就是合理的。
人类擅长自然感知类型的任务,比如视听说等,因此在图像分类识别或语音识别,人类水平表现和贝叶斯最优很接近,机器学习模型很难超过人类的表现。但是并不是所有的模型都无法超过人类,比如预测类(天气预报等)或癌症视图分析等,这些方面机器做的水平就比人类高。
5.3.如何根据人类水平表现改善模型
我们说过,可避免误差是偏差的重要反映,因此如果可避免误差大于方法,就选择训练大模型、训练更长时间、更好的优化算法或更优的模型和超参数搜索等方式改进。如果方差更大,那就选择更多的数据、正则化或更优的模型和超参数搜索等方式改进。
这也是正交化思维的体现之一,保证训练集误差很低可以看成低可避免误差,这是一种优化模型的维度。而确保训练集误差低,开发集误差也低,是低方差的体现,也是另一种优化模型的维度。
6.误差分析
6.1.误差分析
假设正在进行猫咪图片分类器,分类器有10%的错误率和90%的正确率,这还远远达不到预期,并且观察错误分类发现,很多小狗的照片被分类为小猫,那么是否应该针对这类小狗图片进行优化?
回答这个问题前,首先应该进行误差分析,所谓误差分析就是人工针对错误案例进行标注、分析,从而得到模型的优化方向的技术。误差分析需要从开发集中取出部分错误数据,这里假设取100个错误分类的样本,然后进行人工统计,有多少小狗被分类成小猫了。
这里分成两种情况:情况一:100个错误样本中只有5个小狗,那么即使将这五个小狗全部优化分类正确,也才提升了0.5%的准确率(10%*5%),分类器仍有9.5%的提升空间。情况二:100个错误样本中有50个小狗,如果全部分类正确,就提升了5%的准确率,提升幅度比较大。
现在再来回答刚刚问题。如果优化小狗图片对模型的提升很多,那就有优化的必要;但是如果没有多大提升,那不如把精力花费在更有效的途经上。
同时,我们可以考虑多个评估想法,比如误差分析的时候考虑:改善分类错误的小狗、改善分类错误的猫科动物、改善图片清晰度低。取100个分类错误的开发集样本,列一张表格:
|-----|----|------|-------|--------|
| 图片 | 狗 | 猫科动物 | 图片不清晰 | 备注 |
| 1 | √ | | | 比特犬 |
| 2 | | √ | √ | 下雨天的猎豹 |
| ... | | | | |
| 100 | √ | | √ | 模糊的柴犬 |
| 总计% | 8% | 43% | 65% | |
针对这张表格的误差分析,发现图片不清晰的比例很大,因此优化图片不清晰样本比优化狗对模型的改善有效的多。
如果在误差分析统计的过程中,发现有其他的评估考虑,比如发现有图片出现破损或污染,也可以在表格中再添加一列,然后再次进行误差分析(重新人工标注)。
6.2.清除标注错误数据
如果在训练的过程中发现,图片和标签不一致,比如下图中第六张图片是狗,标签是1(猫)。那么是否值得花费时间去修复这个错误的标签?
在训练集上,如果偶尔出现一两个这样的错误,由于训练集很大,因此可能这样的错误不会对训练产生影响,深度学习对随机错误还是很健壮的。但是如果经常出现这样的错误,比如标注人员是色盲,把所有某种颜色的狗都看成了猫,也就是系统错误,这样就对模型产生比较深的影响,就需要修改错误标签。
在开发集和测试集上,如果这些标签错误严重影响了在开发集上评估算法的能力,那么就应该去花时间修正错误的标签。但是,如果它们没有严重影响到用开发集评估成本偏差的能力,那么可能就不应该花宝贵的时间去处理。也就是利用误差分析,比如还是10%的错误率,其中6%是标注错误的样本,那么只有0.6%的错误是标注错误,9.4%是其他错误,这时候就集中优化这9.4%。如果错误率降到2%,但是还是0.6%的错误样本(原来那0.6%没有被优化一点),此时0.6%就占了2%错误率的30%,这个比例已经很大了,因此就需要集中修改错误标注的标签。
开发集的目标是,从多个不同的模型中选择最优的模型,因此如果开发集中存在较高比例的错误标注,就值得进行修改,否则开发集评估的模型不再可信。
在清除错误标签数据时注意:
1.开发集和测试集保持同一分布,即同时检查开发集和测试集的错误标签。
2.不仅考虑错误标签,对于正确的标签也需要考虑(通常不需要这样做)。
3.可以不用花很多精力考察训练集。
最后注意:通常进行一个项目,建议先快速搭建一个简单粗糙的模型进行训练,然后观察方差和偏差,决定模型的优化方向,这样的效率比直接考虑复杂的有效的多。
7.训练集与开发集测试集来自不同分布
7.1.训练集与开发集测试集来自不同分布的优点
在训练模型的时候,如果数据越多,算法效果越好,这就导致开发人员会搜集大量的数据,因此训练集数据和开发集、测试集可能无法来自同一分布,事实证明,这种方式对算法的改善还有很大作用。
如上图所示,猫咪分类器的数据来源有两种,一种是从网页爬虫获得,可以获得大量的高清图片。而第二种是用户手机app上传,这种方式数据较少,且清晰度可能更低。假如第一种方式可以获得200000张图片,而第二种方式可以获得10000张图片,如何划分训练集、开发集和测试集效果更好?
第一种:将所有图片合并并洗牌随机分配给训练集、开发集和测试集,这样做的好处是来自同一分布,但是缺点却很明显:搭建的模型在实际运用中接受的更多数据是用户上传的模糊图片。
第二种:将5000张手机上传图片和200000张图片合并作为训练集,另5000张图片一半作为开发集,一半作为测试集。这样的好处是模型将更加关系开发集的优化,也就是我们的实际目标。缺点是:训练集、开发集和测试集不是同一分布。
但是事实证明第二种方式更加有效,可以长期为系统带来更好的性能。其实背后的道理显而易见,训练集的数据量很大,因此模型比较健壮,当在开发集表现不好时,就会使用一些技巧进行优化,降低在开发集上的损失,于是模型逐渐在开发集和测试集上表现的更好。
7.2.如何分析不同分布的偏差和方差
下图所示的情况(图片分类)究竟是什么?
如果训练集和开发集属于同一分布,那么这就属于高方差。但是如果不属于同一分布,问题的就说不清了,因为开发集可能比训练集的图片难以识别,比如分辨率低,图片重要区别元素少等。因此这9%的方差很难说清究竟是高方差还是其他问题。为了解决这样的问题,我们需要设置训练---开发集。
上图是我们原先设置训练集、开发集、测试集的方式,从训练集中随机打乱,分出一部分数据作为训练---开发集,这样训练---开发集和训练集来自同一分布,只在训练集跑优化算法,而训练---开发集只进行向前传播,然后进行方差、偏差分析。如下图:
可以把分析数据填入下图所示的表格中,假如下图正在进行汽车语音识别的任务,我们获取到大量的各行各业的语音数据和少部分专业汽车语音数据。显然可以把各行各业的语音数据作为训练集和训练---开发集,把专业数据作为开发集和测试集,如果人类对各行各业的语音数据的人类水平表现误差为4%,训练误差为7%,训练---开发误差为10%,开发集和测试集的误差为6%(也可以在专业数据上进行人类水平表现和训练模型,这样有助于获得更多的误差数据分析模型的优化方向),下图第一列是大量的各行各业的语音数据,第二列是少部分专业汽车语音数据,第一行是人类水平表现误差,第二行是训练误差,第三行是不进行优化算法的误差。
则上图中,人类水平表现和训练误差间衡量的是可避免误差(也就是偏差),训练误差和训练---开发误差之间衡量的是方差(同一分布),训练---开发误差和开发误差、测试误差之间衡量的是数据不匹配问题(就是因为不同分布导致的开发、测试误差和训练---开发误差出现差距的问题)。
对于方差、偏差我们都有相应的处理手段,但是对于数据不匹配问题,目前没有系统有效的方式来解决,只能靠一些手段去试。比如做误差分析,或者看看训练集和开发集,试图找出这两个数据集的分布到底有什么不同,然后看看是否有办法收集更多看起来像开发集的数据作训练。
有一种办法是人工数据合成,比如,如果要合成语音识别的数据,就可以将两段音频合成为一段,这样虽然增加了数据量,让训练集更像开发集,但可能出现模型的过拟合,因为新音频的本质和原来的音频有很多相似之处,只是人类听不出来。因此使用人工数据合成时,一定要谨慎,很有可能从所有可能性的空间只选了很小一部分去模拟数据。