长文解读吴恩达新书《MachineLearningYearning》
1学习策略首先强调整本书不是讲机器学习的算法,而是讲让在实践中做机器学习项目时采用的策略,简称学习策略 (learning strategy)。该策略包括如何应对以下几个问题:
- 用完机器学习后效果不好怎么办?
- 在项目之前如何设定有效的目标?
- 如何有效的进行误差分析?
- 如何有效的识别误差来源?
- 如何解决数据分布不匹配问题?
1.1
深度学习的起飞
要点:深度学习的流行是因为现在有大量的数据和便宜的算力。
深度学习可以不严谨的认为就是神经网络,而神经网络早在 1969 年就被研究了,而 1986 年 Hinton 的反向传播算法的论文也有效的提升了训练网络的速度,但为什么近些年深度学习才全面起飞呢?原因有三点:
- 大数据:IoT 产生的图片,语音,文本等。
- 高算力:CPU 到 GPU 到 TPU。
- 强算法:数据增多了,算力便宜了,研究员才有能力来研究更强的算法。这是一个正循环过程。
下图展示了四种模型的在数据量由小到大的表现。当数据量越来越大时,传统机器学习的表现会趋于平缓,喂它再多的数据也消化不了了。而深层神经网络对数据的非常饥渴,现在如果想要最先进 (state-of-the-art) 的表现,只有用“深度学习”加“大数据”!
大神的图其实有些不准确,在 2000 年前数据不够多时,支撑向量机 (SVM) 的表现是稳定的压着神经网络的。更合理的图应该如下:
1.2
正交策略
要点:机器学习每次只调试一个参数,保持其它参数不变。这种每次只改变模型某一性能的策略叫做正交策略。
“正交性”是几何学中的术语,通俗理解正交 (orthogonalization) 就是垂直。用在计算技术中:
- 正交系统意味着各组件互相不依赖或解耦 (可以局部修正)
- 非正交系统意味着各组件互相依赖 (不能局部修正)
通常正交系统比非正交体统好,就像在线性代数中,正交向量比非正交向量好,如下图,你愿意用向量 a 和 b (正交) 还是用向量 c 和 d (非正交) 来表示 X?
同理,你愿意将表现 X 归结于因素 a 和 b (正交) 还是归结于因素 c 和 d (非正交)?
相信你的选择都是正交,因为只有正交,你调整一个组件不会影响到另一个组件。在神经网络模型中,以下四个命题是相互正交的:
- 模型在训练集上的表现
- 模型在开发集上的表现
- 模型在测试集上的表现
- 模型在真实环境的表现
通常模型在训练集 (training set) 上训练,在开发集 (development set, dev set) 上调参,在测试集 (test set) 上评估,在真实环境中运用,因此模型的表现通常有以下关系
P训练集 > P开发集 > P测试集 > P真实环境
因此当模型在
P训练集 = 差
- 模型复杂度不够,用更深的神经网络
- 算法不够好,训练时间加长或者用 Adam
P训练集 = 好,看 P开发集
-
P开发集 = 差
-
过拟合训练集,用更大的训练集或使用正则化
-
P开发集 = 好,看 P测试集
-
P测试集 = 差
-
过拟合开发集,用更大的开发集
-
P测试集 = 好,看 P真实环境
-
P真实环境 = 差
-
数据分布不同,修改开发测试集
-
代价函数不合理,修改代价函数
-
P真实环境 = 好,恭喜你终于成功!
最后,我觉得其实麦肯锡的“MECE 原则”比“正交策略”更适合描述此问题。MECE, 全称 Mutually Exclusive Collectively Exhausive,中文是“相互独立,完全穷尽”。它是一种解决问题的方法,对于一个大问题能不重叠不遗漏的分成子问题。正交策略只点出“相互独立”的性质,而 MECE 原则还包括“完全穷尽”性质,处理问题格局更大一些。
2目标设定机器学习中需要划分训练集 (用于训模),开发集 (用于调参) 和测试集 (用于评估)。为了更快更有效的开始项目,合理指定开发集测试集、选取单一指标、和迅速更换开发集测试集 (一旦出现问题) 是三大要点。接下来三小节会具体阐明。
2.1
数据划分
要点 1:划分训练-开发-测试,数据少可按传统的 60/20/20 划分,数据多可按的 98/1/1 划分。对开发集来说,具体百分比要看它是否能区分不同算法的指标 (比如精度)。
在大数据时代前,当样本数量不多 (小于一万) 的时候,通常将训练-开发-测试的比例设为 60/20/20;比如 10,000 个数据被随机分成 6,000 个用于训练,2,000 个用于开发,2,000 个用于测试。
在大数据来临时,当样本数量很多(百万级别) 的时候,通常将训练-开发-测试的比例设为 98/1/1;比如 1,000,000 个数据个数据被随机分成 980,000 个用于训练,10,000 个用于开发,10,000 个用于测试。
对开发集理数据数量的设定,应该遵循的准则是该数量能够检测不同算法或模型的区别,以便选择出更好的模型。比如模型 A 和 B 的精度是 90% 和 90.1%,两者差 0.1%。那么开发集
- 100 个数据不够,100×0.1% = 0.1 个数据,无法分辨 A 和 B 的差异
- 1,000 个数据也不够,1,000×0.1% = 1 个数据,较难分辨 A 和 B 的差异
- 10,000 个数据够了,10,000×0.1% = 10 个数据,容易分辨 A 和 B 的差异
对于测试集数据数量的设定,传统上是全部数据的 20% 到 30%;在大数据时代,我们不再用百分比,而是设定一个绝对数值,比如 1,000 到 10,000 个。
要点 2:训练集、开发集和测试集的数据要来自同一分布。
首先训练集和开发集的数据要来自同一分布,如果在 P 分布训练集上训练,又在 Q 分布开发集上调参,效果明显不会好。
其次训练集和测试集的数据要来自同一分布,要不然训练误差和真实误差 (通常认为是测试误差) 之间的霍夫丁不等式不成立,那么整个计算学习理论也站不住脚了。
最后开发集和测试集来源于同一分布。如果它们不来自同一分布,那么我们从开发集上选择的最佳模型往往在测试集上不会表现很好。举个例子,我们在开发集上找到最接近靶心的箭,但是测试集的靶心却远远偏离开发集的靶心,结果这支箭肯定无法射中测试集的靶心。
下图总结了上面所有内容。
2.2
指标选取
要点 1:单值评价指标有助于比较不同模型的优劣,快速选择最优模型。
大神举了个查准 (precision) 和查全 (recall) 的例子,如下表,A 比 B 全,B 比 A 准,那么该选哪个呢?你会发现当多个指标好坏不一致时,做决定不是那么容易。这时用 F1 分数将两者求调和平均,得知 A 比 B 高,选 A!
我来举个更实际也更接地气 (如果你是 NBA 球迷) 的例子。每年 NBA 会评选 MVP,都会看每个球员的各项统计,比如得分、篮板、助攻等。
光看各项统计很难决定 MVP 给谁,比如哈登得分和抢断最多,勒布朗最均衡,维斯布鲁克篮板助攻最多而且场均三双,如何做决定。用一个单值的效率指标 (Player Efficiency Rating, PER),PER 是 ESPN 专栏作家 John Hollinger 提出来的,计算公式如下
公式很复杂,我们也需要关注细节,只需了解这个 PER 将得分、篮板、助攻、盖帽、抢断和其他很多因素综合起来得到一个单值指标 (single metric)。这样看哈登的效率 29.87 最高,MVP 应该颁给他。
大神和我举的例子都说明了评估多项指标而决定时不容易,用简单平均或者复杂公式得出一个单值指标会有效快速的做出决定。
要点 2:有时把综合所有指标构成单值评价指标很困难,可以把某些性能作为优化指标 (Optimizing Metric) 找最优值;而某些性能作为满意指标 (Satisficing Metric**)满足特定条件即可。**
大神举了个精度和运行时间的例子,如下表,A 最快但精度最低,C 最慢但精度最高,B 则在中间。通常很难给一个函数来综合精度和运行时间,我们可以根据自身需求来选择模型。
如果
- 你 (一般人) 接受一定的运行时间 (100ms 之内) 来最大化精度,选 B
- 你 (土豪) 接受一定的运行时间 (2000ms 之内) 来最大化精度,选 C
- 你 (精度凡人) 接受一定的精度 (89% 以上) 来最小化运行时间,选 A
- 你 (精度狂人) 接受一定的精度 (99% 以上) 来最小化运行时间,选 C
接受的指标称为满意指标 (Satisficing Metric),而最大化或最小化的指标称为优化指标(Optimizing Metric)。
继续刚才 NBA 选 MVP 的例子,有人会说效率高有什么用,带队赢球才是王道。没错,效率再高战绩倒数,你充其量就是个数据刷子 (参考 2010 年森林狼的凯文乐福)。考虑球队战绩后的表格如下,
把战绩当成满意指标,比如
- 所处球队 60 胜以上,效率最高的球员,只有哈登!
- 所处球队 50 胜以上,效率最高的球员,只有哈登!
- 所处球队 40 胜以上,效率最高的球员,是哈登 > 勒布朗 > 维斯布鲁克
- 所处球队 30 胜以上,效率最高的球员,可能还有别人,但是 30 胜能拿 MVP?
综上所述,今年 MVP 非我大火箭的大哈登所属!哇哈哈哈!
大神和我举的例子都说明了如果多项指标没有一个简单的函数来综合,选用满意指标来筛选,再用优化指标来排序。注意,满意指标可能不止一个,但是优化指标一定只有一个!
2.3
迭代实施
要点 1:开始新系统要快速进入迭代过程,先有各种思路,再用代码实现,再做试验看那些思路可行。该迭代过程越快,进度越快。
“想思路– 写代码– 做试验”是一个迭代过程,做试验需要对比哪个模型在开发集和测试集上的表现好,因此快速划分开发集和测试集,快速制定单值指标是非常重要的。
要点 2:当发现原先设定的开发集、测试集或指标没有指向正确的方向,赶快换!
大神给的建议,快速划分开发集和测试集,快速制定指标,赶快开始做项目,不要多想 (overthink),但是有时开发集、测试集和指标可能是不完美的,如果出现以下三种情况,大神建议赶快换它们。
情况一:开发集和测试集用的是网上高清图片,真实环境是手机拍的模糊图片。
解决方案:收集从手机拍的照片放入开发集和测试集。
情况二:模型在开发集的表现比在测试集的表现好,这是过拟合开发集的信号。有句话说得好,当你过度折磨数据,数据会投降。
解决方案:用一个大一点的开发集,或者换一个新的开发集。
情况三:两个猫分类器 A 和 B,精度分别是 97% 和 95%,但是 A 会错将色情图片分类成猫,而 B 不会这样。从进度角度来说,A 模型好,但从用户角度来说,一定是 B 模型好。
解决方案:改变之前单纯使用错误率作为评价标准,例如增加色情图片的权重,增加其被误分类的代价。代价函数改进如下:
当图片 i 是色情图片时,权重 i 放 10,当图片 i 是非色情图片时,权重 i 放 1。
3误差分析深度学习研究人员都愿意编写程序实施想法,而很少愿意手动做误差分析。他们认为这是浪费时间,其实通过误差分析可以权衡具体问题、优先安排项目、指出新的方向,而用在上面的时间可以帮助你节省很多时间和人力。
3.1
人工分析
要点:人工错误分析能够避免花费大量的时间精力去做一些对提高模型性能收效甚微的工作,而专注解决影响模型正确率的主要问题。
对于一个猫分类器模型,我们发现该模型会将一些狗的图片错误分类成猫。在扩大狗的样本之前 (可能花数月),我们可以手动做一下分析,统计一下全部错误样例里面多少个是狗就可以了。
假设猫分类器模型的错误率是 10%,有 100 个误分类数据。
情况一:有 5 个样例是狗,即便它们全部分类正确,错误率也仅仅从 10% 减少到 9.5%,不值得去做。
10% - 5/100 = 9.5%
情况二:有 50 个样例是狗,如果它们全部分类正确,错误率却可以从 10% 减少到 5%,值得去做。
10% - 50/100 = 5%
3.2
并行分析
要点:并行分析统计误差类别,解决占百分比最大的问题。
误差分析还同时评估多个影响模型性能的因素,通过各自在错误样本中所占的比例来判断其重要性。例如,猫分类器模型中,可能有以下改进模型的因素:
- 把狗误以为猫的图片
- 把大型猫科动物 (比如狮子、豹子) 误以为猫的图片
- 模糊的图片
用表格来并行分析误分类图片,以单个错误分类样本为对象,分析每个样本错误分类的原因。
注意每张图片需要改进的因素不止一个,比如图片 3 是雨天拍的狮子,那么“猫科动物”和“模糊”一栏下都打钩了。因此最后一列的百分比加起来并不等于 100%。
通常来说,比例越大,影响越大,越应该花费时间和精力着重解决这一问题。这种误差分析让我们改进模型更加有针对性,从而提高效率。从上例来看,把精力放在改进“猫科动物”和“模糊”类图片比放在“狗”类图片,要明智的多。
3.3
标记修正
要点:在用深度学习时,在训练集上标记如果是随机标错,可忽略,如果是系统标错,要修正。在开发集和测试集上,用并行分析那一套。
监督式学习中,训练样本有时候会出现输出 y 标记错误的情况。下图红框的可爱的白狗狗被人工错误的标记成了猫。
如果这些标记
- 是随机标错 (比如不小心错误,或按错分类键) 的,那么深度学习算法对这种随机误差的鲁棒性是较强的,一般可以忽略无需修复。
- 是系统标错 (比如认为白色可爱的狗就是猫) 的,那么深度学习算法对这种系统误差的鲁棒性是较差的,需要修正标记。
在开发集上,用并行分析那一套,将“错误标记”作为一个可以改进误差的因素。如下图:
情况一:假设开发误差为 10%,即便它们全部分类正确,错误率也仅仅减少0.6%,有 94% 的别的误差更需要先解决。
6% ×10% = 0.6%
(10% - 0.6%) / 10% = 94%
情况二:假设你不停改进模型,直到开发误差为 2%,那么这个 0.6% 就占现在总误差的 30%了,值得投入精力来解决。
0.6% / 2% = 30%
在测试集上用上面同样的方法。大神在他的书里提了两条建议:
- 用同样过程对待开发集和测试集,保证它们里的数据在修正后还是来自同一分布
- 注意那种一开始标记错误的,而且也预测错误的数据。因为错错得对,因此也需要检查这类数据
3.4
大开发集
要点:当开发集大时,分成两个子集,一个用来分析误差,一个用来调参防止过拟合。
如果开发集很大,在分析误差时,可以将其分成两个子集 A 和 B。只看一个子集 A,做误差分析改进错误,因此 A 会慢慢被过拟合,这时用 B 来调超参数。
- 子集 A 称为鹰眼开发集 (Eyeball dev set),你只能用眼睛看这部分的数据来分析误差。
- 子集 B 称为黑箱开发集 (Blackbox dev set),你只能用这部分未知的数据来调参数。
问题一:为什么花功夫分鹰眼开发集和黑箱开发集?
回答:就是怕过拟合整个开发集。
问题二:这两个开发集的数据量应该多少?
回答:根据主要误差率和错分类个数决定。比如误差率 5%,而通常 50 到 100 个错分类数据可以让你很容易识别主要错误来源 (比如模糊,比如大型猫科动物),那么需要的鹰眼开发集大概包含 1,000 (50/5%) 到 2,000 (100/5%) 个数据。对于黑箱开发集,1,000 到 10,000 个数据都是合理的。
大神强调,如果开发集数目不是那么大,鹰眼开发集更重要些,这是不需要黑箱开发集,那么误差分析和调参都在它上面做。
4偏差方差本章介绍的内容流程如下:
- 书中 (理论派) 对偏差方差的严谨定义 (实用性弱)
- 大神 (实用派) 对偏差方差的友好定义 (实用性强)
- 理论派和实用派中的最优误差
- 理论派和实用派中的偏差方差权衡,如何减小偏差和方差
- 从误差点 (单个偏差方差) 到误差线 (学习曲线)
4.1
严谨定义
要点:偏差和方差是误差的两大来源。
从字面上来讲
- 偏差 (bias) 是预测值的期望与真实值之间的差距
- 方差 (variance) 是预测值的离散程度
不明白偏差?想想“认知偏差”的定义,是人们常因自身或情境的原因使得知觉结果出现失真的现象,关键词是失真,也就是人们预测与真实的差距。
不明白方差?想想“统计方差”的定义,是各个数据与其算术平均数的离差平方和的平均数,关键词是离差,也就是预测值的离散程度。
套用上面定义,用一个真实例子(用面积来预测房价的线性回归模型) 来介绍偏差方差,我们需要以下类比:
- 真实值:目标模型 g (未知的最优的)
- 预测值:一套数据集 D 上训练出来的模型 h(D)
要讨论该模型的误差和方差,就要弄清该模型的真实误差,而真实误差是测量模型在所有数据上(训练用的,没见过的)。真实误差是不可能精确计算出的,因为里面涉及到没见过的数据,但是我们可以在不同的数据集上做线性回归得到不同的模型,如下图所示:
继续类比得到
- 预测值的期望:多套数据集 D1, D2,…, Dm上训练出来的模型 h(D1), h(D2) ,…, h(Dm), 再求其平均得到模型 f = ED[h(D)]
- 预测值的离差:每个模型和平均模型的差距 h(D1) - f, h(D2) - f, …, h(Dm) - f
再看偏差 (用平方差距表示) 和方差的数学定义就简单多了
偏差 = (f - g)2
方差 = ED[(h(D) - f)2]
模型误差可分解成偏差和方差(为了简化问题,不考虑数据的噪声),如下图所示:
对着偏差方差的定义,上面的图不能再清楚。更多关于偏差方差的详情可参考模型的评估和选择一贴的 3.9 小节。
现在问题是偏差和方差都不能精确的计算,因为目标函数 g 和数据分布 P(D) 都是未知的,“误差 = 偏差 + 方差” 只是一个美丽的等式,而下节大神会给出能计算的偏差和方差的定义。尽管不能计算,上面等式也不是一无所用,至少在降低模型误差时我们有两个目标:
- 在降低偏差时不要显著增加方差
- 在降低方差时不要显著增加偏差
听起来像废话,做起来不容易。
4.2
大神定义
要点:偏差是模型在训练集上的误差,方差是模型在开发集和训练集上的误差的差异。
大神对偏差方差的定义为:
- 偏差是模型在训练集上的误差
- 方差是模型在开发集和训练集上的误差的差别
咋一看,这是什么定义?所以说我们脑洞不够大,比不了大神。从严谨定义开始
偏差 = (平均模型误差 – 目标模型误差)2
方差 = E[(某个模型误差 – 平均模型误差)2]
和大神定义靠拢需要以下不是很严谨的观点或假设:
- 平均模型是在不同数据集上做平均,现在只有一个训练集 Dtrain,因此平均模型就是 f = h(train),平均模型误差 = 训练误差
- 目标模型就是我们千方百计想要找的模型,找到的话目标模型误差 = 0
- 定义某个模型误差是 f 在开发集 Ddev 上的误差,假设方差就是在该 Ddev 划分时计算出来的
综上
偏差 = (训练误差 – 0)2 = 训练误差2
方差 = (开发误差 – 训练误差)2
将上面方程右边再开方而定义为偏差和方差
偏差 = 训练误差
方差 = 开发误差 – 训练误差
方差开方之后会有正负号,但是开发误差一般都比训练误差大,因为模型是从训练上得出来的,没可能在开发集的表现更好。
废了这么大的劲儿将偏差方差的“严谨定义”和“大神定义”联系起来,为了什么?就为了偏差和方差现在可以用训练误差和开发误差来量化!看下面 4 个情景。
如果你的模型达到情景 4 的表现,那么恭喜你成功了,其他情景的话还需要继续该模型,怎么改进就要看到底是偏差问题还是方差问题?怎么判断就要借助训练误差和开发误差。现在知道大神定义的偏差方差有用了吧。
4.3
最优误差
要点:偏差可分成“不可避免偏差”和“可避免偏差”,前者是客观存在而不可能减小的,努力减小的是后者。
上节说如果找到一个模型就是目标模型的话,那么目标模型误差 = 0,这时
偏差 = 训练误差
但是这种情况是理想化的,我们几乎不可能找到一个误差率为零的模型,换句话说最优误差接近于零但不等于零 (有些模型最优误差还可能很大,比如一个在很嘈杂背景下的一个语音识别器的最优误差高达 14%)。
这个最优误差也是不可避免偏差 (unavoidable bias),顾名思义就是误差无法减小的部分,那么可避免偏差 (avoid bias) 就是误差可以减小的部分。因此偏差又可以继续分解成
偏差 = 不可避免偏差 + 可避免偏差
重新回顾上节情景 3,假设不可避免偏差有以下两种情况:
- 情况 A:不可避免偏差 = 1%
- 情况 B:不可避免偏差 = 14%
这样看,情况 A 还是高偏差高偏差,但情况 B 却是低偏差高偏差。确定最优误差的好处是让我们只关注可避免偏差,而之后需要减小的也是可避免偏差。
4.4
两者权衡
要点:在传统机器学习时代,减小偏差会增大方差,反之亦然。在深度学习时代,在减小可避免偏差时尽量不要显著增大方差,反之亦然。
在传统机器学习时代,偏差和方差是有冲突的,称为偏差方差权衡。如下图:
-
当模型复杂度低时欠拟合,训练数据的扰动不足以是模型产生显著变化,此时偏差是总误差的主要来源。
-
当模型复杂度高时过拟合,数据发生的轻微扰动都会导致模型发生显著变化,此时方差是总误差的主要来源。
减少偏差的方法 (提高模型复杂度) 包括:
- 增多特征
- 减少正则化
减少方差的方法 (降低模型复杂度或者增加数据) 包括:
- 收集更多数据
- 减少特征
- 增加正则化
在深度学习时代,我们有大量的数据和更深的神经网络,很多时候我们减小偏差或方差是不会对另一方产生过多不良影响。我们的目标是
- 减小可避免偏差时不要显著增加方差
- 减小方差时不要显著增加可避免偏差
减少偏差的方法包括:
- 用更深的模型 (增加层数) 或更大的模型 (增加每层的神经元)
- 减少正则化作用 (L2, L1 和 dropout)
- 训练更长时间
- 训练更好的优化算法 (Adam)
- 通过在训练集上做误差分析 (见解读吴恩达新书的全球第一帖(上)第 3 节)
- 寻找更好的神经网络架构
小结一下:
- 方法 1 在减小偏差时很容易增加方差,一般一旦发现方差变大就增加正则化来降低方差。
- 方法 2 在减小偏差时会增大方差,正则化一般不会单独使用。
- 方法 3-6 都是直接减小训练误差,因而会同时减少偏差和方差。注意的是方法 6 更好的神经网络架构通常很难找到。
- 最有效的是方法 1:用更深更大的模型配着正则化。
减少方差的方法包括:
- 收集更多的数据
- 增加正则化作用 (L2, L1 和 dropout)
- 加入提前停止
- 减少特征数量
- 用更浅的模型 (减少层数) 或更小的模型 (减少每层的神经元)
- 通过在训练集上做误差分析
- 寻找更好的神经网络架构
小结一下:
- 方法 1 是最直接的,只要有足够处理大量数据的算力。
- 方法 2 和 3 在减小方差时会增大偏差,一般不会单独使用。
- 方法 4 在减小方差时会增大偏差,在数据很多时并不是很有效。
- 方法 5 大神不推荐,除非算力是最值得顾虑的因素。
- 方法 6 和 7 都是直接减小训练误差,因而会同时减少偏差和方差。注意的是方法 7 更好的神经网络架构通常很难找到。
- 最有效的是方法 1:收集更多数据,唯一需要考虑的因素是算力。
4.5
学习曲线
要点:线永远比点表达的信息更多。
在上一节,我们只在一个点 (固定数目的训练数据) 上比较训练误差和开发误差,进而推断到底该减小偏差或方差。诚然该方法是有效,但是能看出训练误差和开发误差随着训练数据数目的变化趋势不是更好么?如下图所示:
上右图就是学习曲线,它是将训练误差和开放误差作为训练数据数量的函数绘制的图表。直观来讲,随着训练集大小增加
- 开发误差会越来越小,数据越多模型泛化能力越强,因此在开发集表现会越好。
- 训练误差会越来越大,数据少时模型可以记住达到零误差,数据多时喂不进模型了,因为模型复杂度有限因此误差增大。
给定固定的训练集大小,开发误差会比训练误差大,因此蓝线在红线下面。
接下来看看三幅图:
- 高偏差低方差
- 高方差低偏差
- 高偏差高方差
在高偏差低方差情况下,增加训练数据只会
- 让训练误差越来越大,从而偏差越来越大
- 让开发误差越来越小,但小不过训练误差
这时候用更复杂的神经网络才是王道,增加训练数据只会浪费功夫。
在高方差低偏差情况下,增加训练数据
- 虽然会让训练误差越来越大,从而偏差越来越大
- 但是会让开发误差越来越小,希望会越来越靠近训练误差
这时候用更复杂的神经网络没用,因为偏差已经很小,模型不用继续复杂化。
在高偏差高方差情况下,能做的事就多了,比如
- 用更复杂的神经网络,减小偏差
- 增加训练数据,减小方差
- 人工分析误差,减小两者
- 换更好的网络架构,减小两者
学习曲线可以帮助我们快速诊断出问题在哪,再对症下药。深度学习本来就是一半科学一半艺术,通过不断“炼丹”,最终目标就是下图,低偏差低方差。
在两种情况下绘制学习曲线会遇到问题。假设全集有 100 个数据,选取 10 个子集,分别包含 10, 20, 30 到 100 个数据点,在每个子集上训练模型,计算训练误差并画图。
-
问题一:曲线前端 (比如第一个子集) 的误差值会随机振动。
-
问题二:当类别不平衡时,比如正类和反类比例为 80:20。很有可能随机选的 10 个数据点并不能反映全集的类别比,比如这10 个数据点都是正类。
对这两个问题,大神也给了解决方案 (都是在取样上做文章)。
-
方案一:置换挑选 10 个数据点 3-10次,每次计算误差,然后再平均作为最终误差。
-
方案二:选取子集时,尽量使得其类别比例和全集的类别比例一致。
当数据很多时而且类别比较平衡时,可以忽略上述两个问题。
最后当数据很多时,绘制学习曲线会很耗时,因为会选取不同子集来训练模型。大神给的建议是不用等分数据来划分子集,比如有 10K 个数据,划分 2 比划分 1 好,而且也能清晰的看出趋势。
划分 1:1K, 2K, 3K, …, 10K
划分 2:1K, 2K, 4K, 6K, 10K
5性能对比上章最后一节主要讲如何根据学习曲线来减小偏差或方差最终取得低偏差低方差 (低误差),本章来分析如果误差低到逼近人类水平甚至超过人类水平会发生什么。
5.1
人类表现
要点:对于人类擅长的任务,可用人类误差近似不可避免偏差。
人们经常比较机器学习系统表现和人类表现,通常趋势如下图:
从上图可看出三点:
-
开始当模型没有人类水平好时,往人类水平进展的速度是很快的。
-
一旦模型过了人类水平,其精度提升变得很慢了。原因有二:
-
数据是人类标记的
-
错误分析是人类做的
-
最后我们都希望模型能达到理论上最佳水平,但就是无法超越。
第 3 点里的理论上限就是 1 减去贝叶斯最优错误率 (Bayes optimal error rate),姑且定义为贝叶斯水平吧。而贝叶斯最优错误率就是 1.3 小节提到的最优误差 (不可避免偏差),因此
贝叶斯水平 = 1 - 不可避免偏差
人类擅长很多任务,比如图像识别和语音识别这类处理自然数据的任务,人类水平和贝叶斯水平相差不远,通常用人类水平来近似成贝叶斯水平,那么我们有
人类水平 ≈ 贝叶斯水平
人类误差 ≈ 不可避免偏差
假设下面两种分类情况,人类误差分别是 1% 和 7.5%,模型的训练误差是 8%,开发误差是 10%。
很明显:
- 情况 A:可避免偏差 7% > 方差 2%,偏差问题比较严重,应该使用更深的神经网络
- 情况 B:可避免偏差 0.5% < 方差 2%,方差问题比较严重,应该获取更多数据
接下来我们来研究如何定义人类误差,既不可避免偏差。如医学图像分类问题上,假设有下面几种分类的水平:
- 普通人误差:3%
- 普通医生误差:1%
- 专家误差:0.7%
- 专家团队误差:0.5%
问题:人类误差到底是 0.5%, 0.7%, 1% 还是 3%?
答案:看机器学习系统表现而定,见下面三种情况。
情况 1:训练误差 5%,开发误差 6%,方差为 6% - 5% = 1%
不管选哪个作为人类误差,所有结论都是偏差严重,专注于减小偏差。
情况 2:训练误差 1%,开发误差 5%,方差为 5% - 1% = 4%
当训练误差到 1%这么小了,再选普通人 3% 作为人类误差已经无意义了。只有选等于或小于 1% 作为人类误差才能继续改进模型,比如选后三个 1%, 0.7% 和0.5%,得到结论都是方差严重,专注于减小方差。
情况 3:训练误差 0.7%,开发误差 0.8%,方差为 0.8% - 0.7% = 0.1%
当训练误差到 0.7% 时,选 0.7% 或 0.5% 作为人类误差可以得到相反的结论,到底是要减小偏差还是减小方差?模型表现越好时也越难继续优化,因为这时候人类误差是比较模糊难以准确定义的。
这样看来,如果模型超过人类时,继续优化会更加困难!
5.2
超人表现
要点:当机器学习系统表现超过人类表现,贝叶斯误差就很难估计,再从减少偏差或方差方面提升系统性能就很困难。
对于自然感知类问题,机器学习的表现不及人类。但是在很多其它方面,机器学习模型的表现已经超过人类了,包括:产品推荐,物流预测和贷款审批等。注意这些任务的数据都是结构化 (structured) 数据 (两维数据,每一行是一个示范,每一列是一个特征),而不像感知类问题的非结构化 (unstructured) 数据 (一张图片,一段语音等)。
当今,机器在处理结构化数据的表现远远超过了人类表现,此外,机器在某些语音识别和图像识别的任务中也超过了人类,因此想继续提升会非常困难。这也很正常,想想博尔特百米用时从 9.7 秒提升到 9.6 秒远比从 10.1 秒提升到 10 秒困难。
6总结回答本帖要解决的问题:
问:用完机器学习后效果不好怎么办?
答:用正交策略模型在训练集、开发集、测试集和真实环境上的表现,对症下药。
问:在项目之前如何设定有效的目标?
答:
- 数据多时按 98/1/1 来划分训练集、开发集和测试集;
- 快速制定开发集和测试集,保证它们同分布
- 选择单值评估指标 (用函数综合或满意和优化指标)
- 发现以上开发集、测试集和评估指标和项目期望的方向不一致时,赶快换它们
问:如何有效的进行误差分析?
答:
- 手动分析误差,并行找出可改进它的原因,根据其占比分配精力去做
- 根据错误标记的特性,或者占比,来决定修正或忽略
- 对大开发集,将其分成两个子集,一个用来误差分析,一个用来调参
最重要的是在做项目时记住下图:
明晰大神提出的几个定义:
- 不可避免偏差 ≈ 人类误差
- 可避免偏差 = 训练误差 - 不可避免偏差
- 方差 = 开发误差 - 训练误差
用学习曲线来判断误差主要来源是偏差还是方差
- 如果是偏差问题,可以用更大更深神经网络加正则化
- 如果是方差问题,可以增加训练数据
- 如果是两者,可以试着所有方法,能找到更好的网络架构最好
终极目标是让机器学习系统表现逼近人类表现并超越人类,但是进展越来越慢 (分析误差效率越来越低),原因有三:
- 数据要靠人类标记的
- 错误分析是用人类的见解
- 贝叶斯误差定义越来越模糊,因此发现误差来源属于偏差或者方差这件事越来越困难
本文经授权转自微信公众号 王的机器,俩篇合为一篇发出,感谢作者的授权。
更多阅读
狮子心2019-01-10 00:38:56
有个高偏差低方差说错了哦,改成低偏差高方差。总结地方说要降低偏差提高模型复杂度,增加正则项,应该是减少正则项。文章浅显易懂,胜过读10本机器学习。[微笑]赞 2