03.构建机器学习项目

机器学习 (ML) 策略 (1)

当优化一个深度学习系统时,可能有很多想法去改善系统,如下图所示:改善系统想法如果做出错误的选择方向,可能浪费大量的时间。因此,下面介绍一些构建机器学习工程常用的策略。

正交化

正交化 (Orthogonalization)是指每次调整只影响模型某一方面的性能,对其他没有影响。此种方法可以有助于更有效进行机器学习模型调试和优化。
机器学习(监督学习)系统中,需要确保四个功能:

  1. Fit training set well on cost function
  2. Fit dev set well on cost function
  3. Fit test set well on cost function
  4. Performs well in real world

其中:

  • 对于第一条,如果模型在训练集上表现不好,可以尝试训练更大的神经网络,或更换一种更好的优化算法(如 Adam);
  • 对于第二条,如果模型在验证集上表现不好,在训练集上表现好,可以进行正则化处理或加入更多训练数据;
  • 对于第三条,如果模型在测试集上表现不好,在验证集上表现好,可以尝试使用更大的验证集进行验证;
  • 对于第四条,如果模型在实际应用中表现不好,在测试集上表现好,可能需要改变验证集或成本函数。

单值评价指标

构建机器学习系统时,设置单值评价指标 (single-number evaluation metric )可帮助快速比较不同模型的优劣,选择最优模型,加速机器学习开发过程。
例如,对于分类问题,常用评价指标是精确率( Precision )和召回率( Recall )。$$\text {精确率}=\dfrac {\text {预测为阳性样本中真实阳性样本数}}{\text {预测为阳性样本数}}\times 100 \%$$$$\text {召回率}=\dfrac {\text {正确预测为阳性样本数}}{\text {所有阳性样本数}}\times 100 \%$$假如有 AB 两个分类器,两项指标如下表所示:

分类器 精确率 召回率
A 95% 90%
B 98% 85%

如果用精确率和召回率两个指标,则很难判断 AB 哪个指标更好。实际中,经常使用综合了精确率和召回率两个指标的 F1 Score评价模型, F1 Score 是精确率和召回率的调和平均数( Harmonic Mean ),公式如下:$$F1 =\dfrac {2}{\dfrac {1}{P}+\dfrac {1}{R}}$$其中 P 表示精确率,R 表示召回率。
通过计算 AB 两个分类器的 F1 Score ,可以看出模型 A 效果更好。

分类器 精确率 召回率 F1 Score
A 95% 90% 92.4%
B 98% 85% 91.0%

如果有多个指标,也考虑取平均值。
有一个开发集,加上单实数评估指标,迭代速度会很快,可以加速改进机器学习算法的迭代过程。

满足和优化指标

有时将所有事情组合成单实数评估指标并不容易,而设立满足和优化指标可满足需求。如考虑下面三个分类器:

Classifier Accuracy Running time
A 90% 80ms
B 92% 95ms
C 95% 1500ms

将运行时间设置为满足指标,小于 100ms 就行,准确率设为优化指标,则 B 分类器是最优的。
更一般地,如果考虑 N 个指标,考虑选择其中一个指标为优化指标,剩下 N-1个指标是满足指标是合理的。

训练/验证/测试集划分

构建机器学习系统时,我们采用不同的学习方法,在训练集上训练出不同的模型,然后使用验证集对模型的好坏进行评估,确信其中某个模型足够好时再用测试集对其进行测试。

验证集和评估指标相当于目标(靶心)。若想在测试集上得到较好的结果,应该满足验证集和测试集来自于同一分布(相当于目标不变)。

验证集和测试集的大小

较早时候,数据量小(小于 1 万),通常按照如下经验法则划分:

  • 无验证集:70% / 30%
  • 有验证集:60% / 20% / 20%

这是为了保证验证集和测试集有足够的数据。在数据规模较大情况下,例如百万级数据量,应考虑将比例设置为 99% / 1% / 1% ,就可保证验证集和测试集规模足够。
测试集的大小应该设置得足够提高系统整体性能的可信度,验证集的大小也要设置得足够用于评估几个不同的模型。应该根据实际情况对数据集灵活地进行划分。

改变验证/测试集和指标

如果当前的指标和当前用来评估的数据和真正关心必须做好的事情关系不大,那就应该更改指标或者开发测试集,让它们能更够好地反映算法需要处理好的数据。

比较人类表现水平

很多机器学习模型的诞生是为了取代人类的工作,因此会和人类的表现水平比较。和人类比较图中显示,当机器学习超过人类表现水平时,其进步变得缓慢,最终无法超过理论上限,此上限称为贝叶斯最优误差( Bayes Optimal Error )。贝叶斯最优误差一般认为是理论上可能达到的最优误差,换句话说,其就是理论最优函数。
因为人类对一些自然感知问题表现十分接近贝叶斯最优误差,只要机器学习模型表现没有超过人类表现水平时,可以通过各种手段提升它,例如采用人工标记数据训练,通过人工误差分析了解为什么人能够进行正确识别,或者进行偏差,方差分析。

可避免偏差

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

模型在训练集上的误差和人类表现水平差值称为可避免偏差( Avoidable Bias )。可避免偏差小表明模型在训练集上表现好。训练集和验证集之间的错误率差值越小,说明模型在验证集上表现好。
可避免偏差大于训练集和验证集之间的错误率差值,则之后应重点减小偏差,反之应重点减小方差。

理解人的表现

我们一般用人类水平误差代表贝叶斯最优误差。对于不同领域的例子,不同人群由于其经验水平不一,错误率也不同。一般来说,将表现最好的作为人类水平误差。实际应用中,不同人选择不同人类水平误差基准不同,会造成一定的影响。

改善模型性能( Improving your model performance )

一个监督学习模型达到好的效果,应该满足:

  1. 模型对训练集拟合很好,可以看作可避免偏差低
  2. 在验证集和测试集上效果也很好,可以看作方差不是很大

模型构建总结正交化思想应用到模型的构建上。

机器学习 (ML) 策略 (2)

误差分析

如果希望学习算法能够胜任人类能做的任务,但学习算法还没有达到人类的表现,此时人工检查下算法犯的错误也许可以了解接下来应该做的工作。这个过程称为误差分析

  • 例如,可能会发现一个猫图片识别器错误地将一些看上去像猫的狗误识别为猫。这时,立即盲目地去研究一个能够精确识别出狗的算法不一定是最好的选择,因为我们不知道这样做会对提高分类器的准确率有多大的帮助。
    这时,我们可以从分类错误的样本中统计出狗的样本数量。根据狗样本所占的比重来判断这一问题的重要性。假如狗类样本所占比重仅为 5% ,那么即使花费几个月的时间来提升模型对狗的识别率,改进后的模型错误率并没有显著改善;而如果错误样本中狗类所占比重为 50% ,那么改进后的模型性能会有较大的提升。因此,花费更多的时间去研究能够精确识别出狗的算法是值得的。

在对输出结果中分类错误的样本进行人工分析时,可以建立一个表格来记录每一个分类错误的具体信息,例如某些图像是模糊的,或者是把狗识别成了猫等,并统计属于不同错误类型的错误数量。这样,分类结果会更加清晰。错误分类总结:进行错误分析,你应该找一组错误样本,可能在你的开发集里或者测试集里,观察错误标记的样本,看看假阳性( false positives )和假阴性( false negatives ),统计属于不同错误类型的错误数量。在这个过程中,你可能会得到启发,归纳出新的错误类型。

错误标注样本数据

在训练集中,深度学习算法对训练集中随机误差是很具有鲁棒性( robust )的。只要出错的样本数据量较少,错误随机或近似随机,则不用花费太多时间修复他们。
:深度学习算法对随机误差很健壮,但对系统性的错误就没那么健壮了。比如说,如果做标记的人一直把白色的狗标记成猫,那就成问题了。因为你的分类器学习之后,会把所有白色的狗都分类为猫。
在验证集和测试集中,在进行误差分析时,通过统计人工标记出错占的比例来大致分析这种情况对模型的识别准确率的影响,并比较该比例的大小和其他错误类型的比例,以此判断是否值得去将错误的标记一一进行修正,还是忽略。
在验证集和测试集上进行错误样本修正时,有如下建议:

  1. 在验证集和测试集上同时使用相同的修正手段,保证验证集和测试集来自相同的分布;
  2. 同时检查判断正确和判断错误的样本(通常不用这么做);
  3. 修正验证集和测试集时,考虑到训练集分布和验证/测试集分布可以不同,因此可以不去修正训练集。

快速搭建系统并迭代

Bulid your first system quickly then iterate 初始系统的全部意义在于,有一个学习过的系统,有一个训练过的系统,让你确定偏差方差的范围,就可以知道下一步应该优先做什么,让你能够进行错误分析,可以观察一些错误,然后想出所有能走的方向,哪些是实际上最有希望的方向。

在不同的分布上进行训练和测试

有时,我们很难得到来自同一个分布的训练集和验证/测试集。例如在猫识别器中,训练集来自网络获取(规模大,例如 20 万张,图片清晰),验证集和测试集来自用户上传(规模小,例如 1 万张,图片模糊)。我们的目标是针对用户上传的图片进行分类,所以建议划分数据集如下:将 20 万张网络图片和 5000 张用户上传图片用作训练集,剩下 5000 张用户上床的图片一般作为验证集,一半作为训练集

数据集划分 训练集 验证集 测试集
数量 20.5万 5000 5000
来源 20万来自网络,5000来自用户上传 用户上传 用户上传

比起混合数据集所有样本再随机划分,这种分配方法虽然使训练集分布和验证/测试集的分布并不一样,但是能保证验证/测试集更接近实际应用场景,在长期能带来更好的系统性能。

不匹配数据分布偏差和方差

之前的学习中,我们通过比较人类水平误差、训练集错误率、验证集错误率的相对差值来判断进行偏差/方差分析。但在训练集和验证/测试集分布不一致的情况下,无法根据相对差值来进行偏差/方差分析。因为训练集错误率和验证集错误率的差值可能来自于算法本身(归为方差),也可能来自于样本分布不同,和模型关系不大。

在可能存在训练集和验证/测试集分布不一致的情况下,为了解决这个问题,可以再定义一个训练-验证集Training-dev Set )。训练-验证集和训练集的分布相同(或者是训练集分割出的子集),但是不参与训练过程。
训练-验证集错误率和验证集错误率反映了样本分布不一致的问题,从而说明模型擅长处理的数据和我们关心的数据来自不同的分布,我们称之为数据不匹配(Data Mismatch)问题。
总结如下图数据不匹配

解决数据不匹配问题

解决数据不匹配问题的建议如下:

  • 做错误分析,了解训练集和验证/测试集具体差异;
  • 尝试将训练集变得更加像验证集,或者搜集更多类似于验证/测试集的数据。

若打算将训练数据调整得更像验证集,可以使用的一种技术是人工合成数据。要注意避免过拟合问题。(例如不能给每段语音都增加同一段背景噪声,因为这样模型会对这段背景噪音出现过拟合现象,使得效果不佳)

迁移学习

迁移学习( Tranfer learning )是通过将已训练好的神经网络模型的一部分网络结构应用到另一模型,将一个神经网络从某个任务中学到的知识和经验运用到另一个任务中,以显著提高学习任务的性能。

  • 例如,我们将为猫识别器构建的神经网络迁移应用到放射科诊断中。因为猫识别器的神经网络已经学习到了有关图像的结构和性质等方面的知识,所以只要先删除神经网络中原有的输出层,加入新的输出层并随机初始化权重系数(\(W ^L \),\(b ^L \)),随后用新的训练集进行训练,就完成了以上的迁移学习。

如果新的数据集很小,可能只需要重新训练输出层前的最后一层的权重,即 \(W ^L \),\(b ^L \),并保持其他参数不变;而如果有足够多的数据,可以只保留网络结构,重新训练神经网络中所有层的系数。这时初始权重由之前的模型训练得到,这个过程称为预训练 (Pre-Training ),之后的权重更新过程称为微调 ( Fine-Tuning )。
有时可能不止加入一个新的输出层,而是多加入几个新层。迁移学习迁移学习适用情况如下:

  1. 两个任务有同样的输入(例如都是图形或者语音);
  2. 拥有更多数据的任务迁移到数据较少的任务;
  3. 某一任务低层次特征对另一个任务学习有帮助。

多任务学习

多任务学习( Multi-Task Learning )是使用单个神经网络同时学习多个任务,其基本假设是多个任务之间具有相关性,且任务之间可以利用相关性相互促进。例如交通灯、汽车和行人对识别停车标志有一定的相关性。
以自动驾驶为例,实现的多任务是识别行人、车辆、交通标志和信号灯。例如在输入的图像检测出车辆和交通标志,则输出 \(y\) 是:$$y=\begin {bmatrix}0\\1\\1\\0 \end{bmatrix}$$其网络结构如下:多任务学习图中 \(j\) 表示任务下表,\(c\) 表示任务数。
多任务学习也可以处理只有部分物体被标记的情况,例如标签:$$y=\begin {bmatrix}?\\1\\?\\0 \end{bmatrix}$$求和时候,只需忽略带有 \(?\) 的项,不会影响多任务学习模型的训练。
多任务学习和 Softmax 区别是:Softmax 输出 y 中只有一个为 1 ,多任务学习可以有多个为 1 。
多任务学习适用情况如下:

  1. Training on a set of tasks that could benefit from having shared lower-level features.
  2. Usually: Amount of data you have for each tasks is quit similar.
  3. Can train a big enough neural network to do well on all the tasks.

实际中,多任务学习使用频率要低于迁移学习。

端到端学习 (end-to-end deep learning)

在传统的机器学习分块模型中,每一个模块处理一种输入,然后其输出作为下一个模块的输入,构成一条流水线。而端到端深度学习(End-to-end Deep Learning)只用一个单一的神经网络模型来实现所有的功能。它将所有模块混合在一起,只关心输入和输出。

如果数据量较少,传统机器学习分块模型所构成的流水线效果会很不错。但如果训练样本足够大,并且训练出的神经网络模型足够复杂,那么端到端深度学习模型的性能会比传统机器学习分块模型更好。
而如果数据集规模适中,还是可以使用流水线方法,但是可以混合端到端深度学习,通过神经网络绕过某些模块,直接输出某些特征。
总结如下图所示:端到端学习决定一个问题是否应用端到端学习的关键点是:是否有足够的数据,支持能够直接学习从 x 映射到 y 并且足够复杂的函数。
有时比起一步到位学习,把问题分解为几个简单步骤可能效果更好。例如人类识别系统中,首先弄清脸在哪(人脸识别),然后弄清脸是谁(将识别的人脸放大,识别身份)。人脸识别