机器学习策略(上篇)

正交化

要完善一个监督学习系统,通常需要调整系统的参数。我们要确保四件事情:

  • 必须确保至少系统在训练集上得到不错的结果。所以训练集上的表现必须通过某种评估,达到能接受的程度。对于某些系统,可能意味着达到人类水平的表现。
  • 确保系统在开发集上有好的表现。
  • 确保系统在测试集上有好的表现。
  • 确保系统的成本函数在实际使用中表现令人满意。

正交化过程

如果算法不能很好地拟合训练集,我们希望有一组独立的“旋钮”用来确保我们可以调整我们的算法,使它很好地拟合训练集,这组“旋钮”可以是训练更大的网络或者切换更好的优化算法。

如果算法对开发集的拟合很差,我们希望有一组独立的“旋钮”来调试,例如算法在训练集上表现很好,但在开发集上表现不行。我们希望只改善开发集上的表现而不影响训练集上的表现。增大训练集是一个可行的方式,它帮助我们的学习算法更好地归纳开发集的规律。

如果系统在开发集上做的很好,但在测试集上做得不好呢?我们可能需要更大的开发集,以免系统对开发集过拟合。

如果系统在测试集做的很好但无法给用户很好的用户体验,那么我们需要改变开发集或成本函数。因为如果根据某个成本函数,系统在测试集上做的很好,但它无法反映我们的算法在现实世界中的表现,这意味着要么开发集分布设置不正确,要么成本函数测量的指标不对。

总结:正交化指弄清楚哪个部分出了问题,调整刚好对应的旋钮。

单实数评估指标

无论是调整超参数或者是尝试不同的机器学习算法又或者在搭建机器学习系统时尝试不同手段,如果有一个单实数评估指标,我们的进展会快得多。单实数评估指标可以快速告诉我们新尝试的手段比之前的手段好还是坏。所以当团队开始进行机器学习项目时,我们需要为我们的问题设置一个单实数评估指标。

图 1

 

我们通过一个事例理解单实数评估指标。我们搭建完成分类器A用于对猫进行分类,通过调整超参数、训练集等手段训练出了一个新的分类器B。评估分类器的合理方式是精确率和召回率。精确率指分类器认为是“真猫”的图片中,实际上有多少是真的猫;召回率实际上是真的猫的图片,有多少被分类器识别出来了。图1所示的两个分类器,分类器A的召回率更优而分类器B的精确率更高,我们如何判断这两个分类器哪个更好?

图 2

 

我们需要找到新的评估指标,能够结合精确率和召回率,这个指标是F1分数,我们可以认为其是精确率和召回率的平均值。

图 3

 

我们再看一个例子。假设我们在开发一个服务四大地理大区爱猫人士的应用。两个分类器在来自四大地理大区的数据中得到了不同的误差,比如算法A在美国用户上传的图片中达到3%的误差。我们很难扫一眼四个数字就快速判断算法A或算法B哪个更好,所以我们也要算算平均值。

机器学习策略(上篇)_第1张图片 图 4

 

满足指标和优化指标

要把顾及到的所有事情组合成单实数评估指标有时并不容易,在这些情况里,设立满足和优化指标是很重要的。

机器学习策略(上篇)_第2张图片 图 5

 

假设我们更注重分类器的准确度,但除此之外我们还需考虑运行时间。我们可以将准确度和运行时间组合成一个整体评估指标,比如在能够最大限度提高准确度的情况下必须满足运行时间小于100ms,在这种情况下准确度是一个优化指标,运行时间是满足指标。

更一般地,如果要考虑N个指标,我们通常选择一个指标作为优化指标,其余N-1个作为满足指标。

训练集/开发集/测试集划分

机器学习的工作流程是:尝试很多思路,用不同的训练集训练不同的模型,使用开发集评估不同的思路,选择一个不断迭代去改善开发集的性能直到得到一个满意的模型,最后用测试集评估。

开发集与评估指标是机器学习系统瞄准的靶心。我们必须谨记开发集和测试集要来自同一分布,否则研发团队花费数月时间在开发集上迭代优化,结果最终在测试集上测试系统时测试集和开发集数据差异很大,这时团队很可能收获“意外惊喜”并发现在开发集上训练几个月的数据在测试集上表现却不佳。因此我们需要将所有数据随机洗牌,放入开发集和测试集。

开发集和测试集的大小

在大数据时代,旧的经验发展,即70%的数据集作为训练集并且30%的数据作为开发集和测试集,已经不再适用了。现在流行的是把大量数据分到训练集,少量数据分到开发集和测试集。

机器学习策略(上篇)_第3张图片 图 6 数据集的划分

 

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

评估指标无法正确衡量算法之间的优劣排序时,我们应该改变评估指标,或者改变开发集或测试集。

案例一

Algorithm A: 3% error

Algorithm B: 5% error

假设在构建一个猫分类器,决定使用的指标是分类误差。算法A有3%的误差,算法B有5%的误差,所以算法A似乎做得更好。但实际试一下这些算法,算法A由于某些原因,把很多色情图像分类成猫了。如果部署算法A,用户会看到更多猫图,但它同时也会给用户推送一些色情图像,这是用户完全不能接受的。相比之下,尽管B的误差率更高,但不会推送色情图像。因此,实际上B表现的更好。

上述情况中我们使用的分类误差指标如下,其中m是开发集的例子数,符号L是统计里面表达式为真的例子数的函数。因此下述公式就统计了分类错误的例子。

图 7 误差指标

 

这个评估指标的问题在于它对色情图片和非色情图片一视同仁,但其实我们希望分类器不会错误标记色情图像。修改评估指标的方法是加入权重项,如果不是色情图像w=1,否则w=10。这让算法将色情图分类为猫图时误差这个项快速变大。

图 8 加入惩罚权重的误差指标

 

案例二

Algorithm A: 3% error

Algorithm B: 5% error

假设两个猫分类器A和B,用开发集评估得到的误差为3%和5%,开发集所用图片是网上下载的高质量、取景专业的图片。但在部署算法产品时,算法B看起来表现更好,即使其在开发集上表现不如算法A。我们一直在用从网上下载的高质量图片训练,但当部署到手机应用,算法作用到用户上传的图片时,其取景并不专业,没有把猫完整拍下来或者猫的表情很古怪甚至图像很模糊。实际测试算法时,发现算法B表现更好。

我们的问题在于做评估时用的是很漂亮的高分辨率、取景专业的开发集和测试集。但用户真正关心的是他们上传的图片能不能被正确识别,那些图片可能有点模糊、取景很业余。如果当前的指标和用来评估的数据和我们真正关系必须做好的事情关系不大,那就应该更改指标或者开发/测试集,让它们能够更好地反映算法需要处理好的数据。

建议

即使无法定义出一个很完美的评估指标和开发集,我们也需要快速将其快速设立出来,然后使用它们来驱动团队的迭代速度。如果之后发现选的不好,完全可以马上改。我们不要在没有评估指标和开发集时跑的太久,因为这可能会减慢团队迭代和改善算法的速度。

比较机器学习系统和人类的表现

过去几年中,众多机器学习团队一直在讨论如何比较机器学习系统和人类的表现。比较机器学习系统和人类的表现有两个主要原因:首先是因为深度学习系统的进步,机器学习算法突然变得更好了,在许多机器学习的应用领域已经开始见到算法已经可以威胁到人类的表现了。其次,事实证明,当我们试图让机器人做人类能做的事情时,可以精心设计机器学习系统的工作流传,让工作流程效率更高。

可避免偏差

可避免偏差指贝叶斯误差(Human error)和训练集误差(Training error)的差值。它表明了训练集可以提高的程度。我们希望训练集误差接近贝叶斯误差,但不希望比贝叶斯误差低。因为训练集误差除非在过拟合状态,否则不可能低于贝叶斯误差。

Human error: 1%

Training error: 8%

Dev error: 10%

以猫分类器为例,假设在训练集上的误差为8%,在开发集上的误差为10%,而人类在进行猫的分类时误差只有1%。算法在训练集上的表现和人类水平的表现有很大差距的话,说明算法对训练集的拟合并不好。从减少偏差和方差的角度看,这时我们需把重点放在减少偏差上,故而需要训练更大的神经网络或跑更久的梯度下降以此尝试是否能在训练集上做得更好。

Human error: 7.5%

Training error: 8%

Dev error: 10%

假设数据集中图像非常模糊,即使人类都无法判断这张照片中有没有猫,故而人类的误差是7.5%。此时训练集误差几乎和人类的表现差不多,那么我们需要把重点放在减少算法的方差上。

人类水平表现

对人类水平表现有大概的估计可以让我们做出对贝叶斯误差的估计,这有助于帮我们快速决定是否应该专注于减少算法的偏差还是减少算法的方差。在我们开发的系统的性能超越人类之前,这个决策方法非常有效。但系统的性能超越人类后,我们对贝叶斯误差的估计就不再准确了。

超过人的表现

机器学习进展在接近或超越人类水平的时候会变得越来越慢。以下举例说明原因:假设一个问题在一组人类专家充分讨论后误差为0.5%,单个人类专家误差为1%,算法有0.3%的训练集误差和0.4%的开发集误差。此时我们无法判断可避免偏差是多少,进而无法判断优化算法时应该专注减少偏差还是减少方差,这时我们就没有明确的优化方向了。

改善模型表现

监督学习算法达到实用的标准

  • 算法对训练集拟合很好,即可避免偏差很低。
  • 将训练集中的良好表现延续到开发集和测试集,即方差很低。

改善模型表现的策略

减少可避免偏差的方式

  1. 训练更大规模的模型
  2. 模型训练更久/选取更好的算法
  3. 选取更好的神经网络架构/超参数

减少方差的方式

  1. 收集更多数据去训练
  2. 尝试正则化
  3. 选择更好的神经网络架构

你可能感兴趣的:(改善深层神经网络)