机器学习开发策略

文章目录
  1. 1. ML策略
  2. 2. 正交化 Orthogonalization
  3. 3. 单一数字评估指标 Single number evaluation metric
  4. 4. 满足和优化指标
  5. 5. 训练/开发/测试集划分
  6. 6. 开发集和测试集的大小
  7. 7. 什么时候该改变开发集/测试集和指标
  8. 8. 比较人类表现水平
  9. 9. 可避免偏差
  10. 10. 理解人类表现水平
  11. 11. 总结

吴大大结构化机器学习项目总结,完善中…

ML策略

假设你构建了一个喵咪分类器,训练之后准确率达到90%,但在测试集上还不够好。此时你可以想到的优化方法有哪些呢?总结后大致如下:

  • 收集更多的数据
  • 收集更多的多样化训练集,比如不同姿势的猫咪图片等
  • 用梯度下降法训练更长时间
  • 尝试Adam算法
  • 尝试更大的网路
  • 尝试小一点的网络
  • 尝试dropout随机失活算法
  • 加上L2正则项
  • 改善网络结构,如变更激活函数,变更隐藏层节点数量

优化的方法虽然很多,但如果方向错误,可能白费几个月时间。
那通过哪些策略可以减少错误发生的几率呢?怎么判断哪些方法可以尝试,哪些方法可以丢弃呢?


正交化 Orthogonalization

优化前首先需要明白正交化。教科书式定义(可以直接略过 =。=):正交化是一种系统设计属性,它确保修改指令或算法的组成部分不会对系统的其他组件产生或传播副作用。独立地验证某部分而不对其他部分产生影响,能有效减少测试和开发时间。

正交性很好理解,就像以前的老式黑白电视机,它有很多调节画面的旋钮。假设第一个旋钮控制上下方向,第二个旋钮控制左右方向。当我们需要调节画面时,调节上下方向不会影响左右方向。这样互不影响的设计能大大减少调节画面的时间。

同样,要弄好一个监督学习系统,我们也需要考虑系统的旋钮。
通常我们需要保证下面四个方面是正交的。

  • 首先系统在训练集上表现良好
    • 如果拟合不好,那么尝试使用更大的神经网络或者切换更好的优化算法,比如Adam等
  • 其次系统在开发集上表现良好
    • 如果拟合不好,尝试正则化或者更大的训练集
  • 然后系统在测试集上表现良好
    • 如果拟合不好,尝试更大的开发集
  • 最后系统在真实(生产)环境中表现良好
    • 如果表现不好,意味着开发测试集分布设置可能不对,或者损失函数不能有效反映算法在现实世界的表现

我们需要使用正交化的思想去分析系统的瓶颈究竟出自哪一个方面,当系统表现不佳时,哪些旋钮是值得去尝试的。尝试过程中需要训练网络,吴大大在这特意提到,他自己训练神经网络时通常不会提前停止网络训练,因为这会让问题的分析复杂化。比如提前停止训练集的训练,它在影响训练集的拟合的同时会改善开发集的表现,这样问题就不正交化了。


单一数字评估指标 Single number evaluation metric

当我们知道模型在哪个集合拟合不好时,我们就有了优化的方向。无论是调整超参数,还是尝试更好的优化算法,为了更好更快的重新评估模型,我们都需要为问题设置一个单一的数字评估指标。

下面是分别训练的两个分类器的 Precision(精准率)、Recall(召回率)以及F1 score。

由上表可以看出,以 Precision 为指标,则分类器 A 的分类效果好;以 Recall 为指标,则分类器 B 的分类效果好。所以仅用以上判定指标,我们有时很难决定出 A 好还是 B 好。

这里以 Precision 和 Recall 为基础,构成一个综合指标 F1 Score ,那么我们利用F1 Score便可以更容易的评判出分类器A的效果更好。

指标介绍:

在二分类问题中,通过预测我们得到下面的真实值 y 和预测值 y^ 的表:

  • Precision(精准率):
    $Precision = \dfrac{True\ positive}{Number\ of\ predicted\ positive} \times 100\%= \dfrac{True\ positive}{True\ positive + False\ positive}$

假设在是否为猫的分类问题中,查准率代表:所有模型预测为猫的图片中,确实为猫的概率。

  • Recall(召回率):
    $Recall = \dfrac{True\ positive}{Number\ of\ actually\ positive} \times 100\%= \dfrac{True\ positive}{True\ positive + False\ negative}$

假设在是否为猫的分类问题中,查全率代表:真实为猫的图片中,预测正确的概率。

  • F1 Score:
    $vF1-Socre = \dfrac {2} {\dfrac{1}{p}+\dfrac{1}{r}}$

相当与精准率和召回率的一个特别形式的平均指标。

示例:下面是另外一个问题多种分类器在不同的国家中的分类错误率结果:

模型在各个地区有不同的表现,这里用地区的平均值来对模型效果进行评估,转换为单一数字评估指标,就可以很容易的得出表现最好的模型。


满足和优化指标

有时候把我们所有顾及的事情组成单一数字评估指标并不容易。这个时候,可以尝试把指标划分为满足指标和优化指标。

比如现在有三个不同的分类器性能表现如下:

假设我们对模型效果有一定的要求,不仅要求准确率,还要求运行时间在100 ms以内。那么我们可以以 Accuracy 为优化指标,以 Running time 为满足指标。一旦Running time达到要求,我们就可以把全部精力放在优化指标上。以这个思想,我们很快可以从中选出B是满足条件的最好的分类器。

一般的,如果要考虑N个指标,则选择一个指标为优化指标,其他N-1个指标都是满足指标:
$$
N_{metric}:\left\{ \begin{array}{l}
1\qquad \qquad \qquad Optimizing\ metric\\
N_{metric}-1\qquad Satisificing\ metric
\end{array} \right.
$$


训练/开发/测试集划分

确立了评估指标,就是确定了靶心,团队拿到数据就可以快速迭代不断逼近指标。这个时候正确的数据集的划分就非常重要了,它直接关乎你的团队效率。

我们知道训练集是用来训练模型的,开发集(也要交叉验证集)用来尝试迭代各种想法,用来优化性能,得到一个满意的损失结果后,最后用测试集评估。

现在假设有这样的一个数据集,需要将他们划分为开发集和测试集, 有些人可能会随机选择几个国家的作为开发集,剩下的作为测试集,就如下图所示。

有些人可能觉得没问题,其实问题很大!因为开发集和测试集不服从同一分布,这就好像你在准备托福考试,你尽可能的得到了所有的考试技巧和其他资料,最后你的确得到了不错的成绩。但是后来因为工作需求需要你会说俄语,此时如果你用之前托福的资料来对付俄语考试则显然不对,这也就是为什么有时候开发集准确率高,但是测试集低。

所以数据要随机洗牌,然后放到训练、开发和测试集中。其次,这些随机洗牌的数据的来源也需要注意,即你选择的数据集,要能反应出你未来希望得到的数据,即模型数据要和未来数据相似,这样模型在生产环境中面对新的数据才能有好的表现。


开发集和测试集的大小

机器学习发展到现在,数据集的划分与传统稍有不同。具体详情见下图:

开发集有时候需要足够大才能评估不同的想法,至于测试集的量,除非你对最终投产的系统有非常高的精准指标,否则一般情况下,1W的数据量足够。注意测试集的划分不再需要按照传统占据30%,以现在的数据量,30%很可能超过百万。


什么时候该改变开发集/测试集和指标

在针对某一问题我们设置开发集和评估指标后,这就像把目标定在某个位置,后面的过程就聚焦在该位置上。但有时候在这个项目的过程中,可能会发现目标的位置设置错了,所以要移动改变我们的目标。

example1

假设有两个猫的图片的分类器:

  • 评估指标:分类错误率
  • 算法A:3%错误率
  • 算法B:5%错误率

这样来看,算法A的表现更好。但是在实际的测试中,算法A可能因为某些原因,将很多色情图片分类成了猫。所以当我们在线上部署的时候,算法A会给爱猫人士推送更多更准确的猫的图片(因为其误差率只有3%),但同时也会给用户推送一些色情图片,这是不能忍受的。所以,虽然算法A的错误率很低,但是它却不是一个好的算法。

这个时候我们就需要改变开发集、测试集或者评估指标。

假设开始我们的评估指标如下:
$Error = \dfrac{1}{m_{dev}}\sum\limits_{i=1}^{m_{dev}}I\{y^{(i)}_{pred}\neq y^{(i)}\}$

该评估指标对色情图片和非色情图片一视同仁,但是我们希望,分类器不会错误将色情图片标记为猫。

修改的方法,在其中加入权重$w^{(i)}$:

$Error = \dfrac{1}{\sum w^{(i)}}\sum\limits_{i=1}^{m_{dev}} w^{(i)}I\{y^{(i)}_{pred}\neq y^{(i)}\}$
其中:

$$
w^{(i)}=\left\{ \begin{array}{l}
1\qquad \qquad \qquad 如果x^{(i)}不是色情图片\\
10或100\qquad \qquad如果x^{(i)}是色情图片
\end{array} \right.
$$

这样通过设置权重,当算法将色情图片分类为猫时,误差项会快速变大。
总结来说就是:如果评估指标无法正确评估算法的排名,则需要重新定义一个新的评估指标。

example2

同样针对example1中的两个不同的猫图片的分类器A和B。

但实际情况是对,我们一直使用的是网上下载的高质量的图片进行训练;而当部署到手机上时,由于图片的清晰度及拍照水平的原因,当实际测试算法时,会发现算法B的表现其实更好。

如果在训练开发测试的过程中得到的模型效果比较好,但是在实际应用中自己所真正关心的问题效果却不好的时候,就需要改变开发、测试集或者评估指标。

Guideline:

  • 定义正确的评估指标来更好的给分类器的好坏进行排序;
  • 优化评估指标。

比较人类表现水平

很多机器学习模型的诞生是为了取代人类的工作,因此其表现也会跟人类表现水平作比较。

上图展示了随着时间的推进,机器学习系统和人的表现水平的变化。一般的,当机器学习超过人的表现水平后,它的进步速度逐渐变得缓慢,最终性能无法超过某个理论上限,这个上限被称为贝叶斯最优误差(Bayes Optimal Error)

贝叶斯最优误差一般认为是理论上可能达到的最优误差,换句话说,其就是理论最优函数,任何从 x 到精确度 y 映射的函数都不可能超过这个值。例如,对于语音识别,某些音频片段嘈杂到基本不可能知道说的是什么,所以完美的识别率不可能达到 100%。

因为人类对于一些自然感知问题的表现水平十分接近贝叶斯最优误差,所以当机器学习系统的表现超过人类后,就没有太多继续改善的空间了。

也因此,只要建立的机器学习模型的表现还没达到人类的表现水平时,就可以通过各种手段来提升它。例如采用人工标记过的数据进行训练,通过人工误差分析了解为什么人能够正确识别,或者是进行偏差、方差分析。

当模型的表现超过人类后,这些手段起的作用就微乎其微了。


可避免偏差

通过与贝叶斯最优误差,或者说,与人类表现水平的比较,可以表明一个机器学习模型表现的好坏程度,由此判断后续操作应该注重于减小偏差还是减小方差。

模型在训练集上的误差与人类表现水平的差值被称作可避免偏差(Avoidable Bias)。可避免偏差低便意味着模型在训练集上的表现很好,而训练集与验证集之间错误率的差值越小,意味着模型在验证集与测试集上的表现和训练集同样好。

如果可避免偏差大于训练集与验证集之间错误率的差值,之后的工作就应该专注于减小偏差;反之,就应该专注于减小方差。


理解人类表现水平

我们一般用人类水平误差(Human-level Error)来代表贝叶斯最优误差(或者简称贝叶斯误差)。对于不同领域的例子,不同人群由于其经验水平不一,错误率也不同。一般来说,我们将表现最好的作为人类水平误差。但是实际应用中,不同人选择人类水平误差的基准是不同的,这会带来一定的影响。

例如,如果某模型在训练集上的错误率为 0.7%,验证集的错误率为 0.8%。如果选择的人类水平误差为 0.5%,那么偏差(bias)比方差(variance)更加突出;而如果选择的人类水平误差为 0.7%,则方差更加突出。也就是说,根据人类水平误差的不同选择,我们可能因此选择不同的优化操作。

这种问题只会发生在模型表现很好,接近人类水平误差的时候才会出现。人类水平误差给了我们一种估计贝叶斯误差的方式,而不是像之前一样将训练的错误率直接对着 0% 的方向进行优化。

当机器学习模型的表现超过了人类水平误差时,很难再通过人的直觉去判断模型还能够往什么方向优化以提高性能。


总结

想让一个监督学习算法达到使用程度,应该做到以下两点:
1)算法对训练集的拟合很好,可以看作可避免偏差很低;
2)推广到验证集和测试集效果也很好,即方差不是很大。

根据正交化的思想,我们有一些措施可以独立地优化二者之一。