机器学习策略(1)
为什么是ML策略
假如我们在构建一个喵咪分类器,数据集就是上面几个图,训练之后准确率达到90%。虽然看起来挺高的,但是这显然并不具一般性,因为数据集太少了。那么此时可以想到的ML策略有哪些呢?
正交化
正交这个词很好理解,即各个变量之间是相互独立的。在机器学习模型建立的整个流程中,我们需要根据不同部分反映的问题,去做相应的调整,从而更加容易地判断出是在哪一个部分出现了问题,并做相应的解决措施。
正交化或正交性是一种系统设计属性,其确保修改算法的指令或部分不会对系统的其他部分产生或传播副作用。 相互独立地验证使得算法变得更简单,减少了测试和开发的时间。
当我们设计一个监督学习模型时,至少确保下面4个假设正确,且它们是相互正交的:
- 系统在训练集上表现良好
否则,使用更大的神经网络,或者更好的优化算法
- 系统在验证集上表现良好
否则,使用正则化,或者更大的训练集
- 系统在测试集上表现良好
否则,使用更大的验证集
- 在真实的系统环境中表现良好
否则,修改验证/测试集,或者修改代价函数
单一数字评估指标
在训练机器学习模型的时候,无论是调整超参数,还是尝试更好的优化算法,为问题设置一个单一数字评估指标,可以更好更快的评估模型。
Example1
下面是分别训练的两个分类器的 Precision、Recall以及F1 score。
由上表可以看出,以Precision为指标,则分类器A的分类效果好;以Recall为指标,则分类器B的分类效果好。所以在有两个及以上判定指标的时候,我们很难决定出A好还是B好。
这里以Precision和Recall为基础,构成一个综合指标F1 Score,那么我们利用F1 Score便可以更容易的评判出分类器A的效果更好。
指标介绍:
对正例和负例做如下的定义:
True Positive (真正例, TP)被模型预测为正的正样本;可以称作判断为真的正确率
True Negative(真负例 , TN)被模型预测为负的负样本 ;可以称作判断为假的正确率
False Positive (假正例, FP)被模型预测为正的负样本;可以称作误报率
False Negative(假负例 , FN)被模型预测为负的正样本;可以称作漏报率
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:
$$F1-Socre = \dfrac {2} {\dfrac{1}{p}+\dfrac{1}{r}}$$
相当与查准率和查全率的一个特别形式的平均指标。
Example2
下面是另外一个问题多种分类器在不同的国家中的分类错误率结果:
模型在各个地区有不同的表现,这里用地区的平均值来对模型效果进行评估,转换为单一数字评估指标,就可以很容易的得出表现最好的模型。
满足和优化指标
假设有三个不同的分类器性能表现如下:
又时对于某一问题,对模型的效果有一定的要求,如要求模型准确率尽可能的高,运行时间在 100\rm \ ms 以内。这里以 Accuracy 为优化指标,以 Running time 为满足指标,我们可以从中选出B是满足条件的最好的分类器。
一般的,要顾及到所有的事情,组合成单实数评估指标并不容易。所以,我们通常这样考虑:
- 线性组合
基于已知的指标构建一个新的指标:
cost = accuracy - β*time
- 基于满足指标来观察优化指标
如果要考虑N个指标,则选择一个指标为优化指标,其他N-1个指标都是满足指标:
$$N{metric}:\left{ \begin{array}{l} 1\qquad \qquad \qquad Optimizing\ metric\ N{metric}-1\qquad Satisificing\ metric \end{array} \right.$$
比如,我们更关心的是最终的准确率,但是同时也希望耗时不要太长,所以我们可以将满足指标设定为耗时,假设是100ms,然后优化指标就是在100ms用时的情况下准确率的大小。
训练\开发\测试集
训练\开发\测试集选择设置的一些规则和意见:
- 训练\开发\测试集的设置会对产品带来非常大的影响;
- 在选择开发集和测试集时要使二者来自同一分布,且从所有数据中随机选取;
- 所选择的开发集和测试集中的数据,要与未来想要或者能够得到的数据类似,即模型数据和未来数据要具有相似性;
开发集和测试集大小
- 设置的测试集只要足够大,使其能够在过拟合的系统中给出高方差的结果就可以,也许10000左右的数目足够;
- 设置开发集只要足够使其能够检测不同算法、不同模型之间的优劣差异就可以,百万大数据中 1\% 的大小就足够;
什么时候该改变开发\测试集和评估指标
在针对某一问题我们设置开发集和评估指标后,这就像把目标定在某个位置,后面的过程就聚焦在该位置上。但有时候在这个项目的过程中,可能会发现目标的位置设置错了,所以要移动改变我们的目标。
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.
这样通过设置权重,当算法将色情图片分类为猫时,误差项会快速变大。
总结来说就是:如果评估指标无法正确评估算法的排名,则需要重新定义一个新的评估指标。
- Orthogonalization for cat pictures: anti-porn
这其实是一个正交化的例子,在处理机器学习问题时,应该把它切分成独立的步骤:
- 弄清楚如何定义一个指标来衡量你想做的事情的表现;(设定目标)
- 分开考虑如何改善系统在这个指标上的表现;(逼近目标,【优化目标】)
Example2
同样针对example1中的两个不同的猫图片的分类器A和B。
由训练误差可以看出分类器A的分类效果比较好。但实际情况是对分类器A,我们一直使用的是网上下载的高质量的图片进行训练;而当部署到手机上时,由于图片的清晰度及拍照水平的原因,当实际测试算法时,会发现算法B的表现其实更好。
如果在训练开发测试的过程中得到的模型效果比较好,但是在实际应用中自己所真正关心的问题效果却不好的时候,就需要改变开发、测试集或者评估指标。
Guideline:
- 定义正确的评估指标来更好的给分类器的好坏进行排序;
- 优化评估指标。
与人类表现比较
为什么作比较
如图示:
- 蓝色虚线:表示人类识别的准确率
- 紫色曲线:表示机器学习不断训练过程中准确率的变化
- 绿色虚线:表示最高的准确率,即100%
其中紫色曲线在末尾收敛后与绿色虚线之间的差距称为贝叶斯优化误差(Bayse Optima Error)
在实际操作过程中,我们可以以人类准确率为指标来评判我们训练的模型好坏程度,如果准确率不及人类,那么我们可以从以下几个方面进行调整:
- 获取更多的标签数据
- 分析为什么模型在这个数据上错误,而人类会正确判断,对模型进行修正
- 分析和运用偏差和方差
可避免偏差
假设针对两个问题分别具有相同的训练误差和交叉验证误差,如下所示:
对于左边的问题,人类的误差为 1\% ,对于右边的问题,人类的误差为 7.5\% 。
对于某些任务如计算机视觉上,人类能够做到的水平和贝叶斯误差相差不远。(这里贝叶斯误差指最好的分类器的分类误差,也就是说没有分类器可以做到 100\% 正确)。这里将人类水平误差近似为贝叶斯误差。
- 左边的例子: 8\% 与 1\% 差距较大
主要着手减少偏差,即减少训练集误差和人类水平误差之间的差距,来提高模型性能。
- 右边的例子: 8\% 与 7.5\% 接近
主要着手减少方差,即减少开发集误差和测试集误差之间的差距,来提高模型性能。
理解人类表现
如医学图像分类问题上,假设有下面几种分类的水平:
- 普通人:3\% error
- 普通医生: 1\% error
- 专家: 0.7\% error
- 专家团队: 0.5\% error
在减小误诊率的背景下,人类水平误差在这种情形下应定义为: 0.5\% error;
如果在为了部署系统或者做研究分析的背景下,也许超过一名普通医生即可,即人类水平误差在这种情形下定义为: 1\% error 即可。
对人类水平误差有一个大概的估计,可以让我们去估计贝叶斯误差,这样可以让我们更快的做出决定:减少偏差还是减少方差。
而这个决策技巧通常都很有效果,直到系统的性能开始超越人类,那么我们对贝叶斯误差的估计就不再准确了,再从减少偏差和减少方差方面提升系统性能就会比较困难了。
超越人类表现
由于结构化数据、非自然感知、大数据等原因,使得机器学习发挥出“过人”的能力,在“在线广告”、“产品推荐”等方面获得了超越人类的表现,但是在很多方面,例如自然感知相关方面依然未能表现突出。
改善模型表现
基本假设:
模型在训练集上有很好的表现;
模型推广到开发和测试集啥会给你也有很好的表现。
- 减少可避免偏差
训练更大的模型
训练更长时间、训练更好的优化算法(Momentum、RMSprop、Adam)
寻找更好的网络架构(RNN、CNN)、寻找更好的超参数
- 减少方差
收集更多的数据
正则化(L2、dropout、数据增强)
寻找更好的网络架构(RNN、CNN)、寻找更好的超参数