解读吴恩达新书《Machine Learning Yearning》系列(二)-程序员宅基地

0

引言

吴恩达 (之后称大神) 在 2018 年 5 月 23 日北京时间早上 6 点 15 分将《Machine Learning Yearning》一书更新到第 32 章 (总共有 55 章)。

回顾该书要讲的七个要点:

  1. 学习策略 (1 - 4 章)

  2. 目标设定 (5 - 12 章)

  3. 误差分析 (13 - 19 章)

  4. 偏差方差 (20 - 32 章)

  5. 性能对比 (33 - 35 章)

  6. 数据修正 (36 – 43 章)

  7. 端对端学习 (44 - 55 章)

 

上帖已经解读前三个要点,而本帖主要解读第四、五个,即偏差方差和性能对比。虽然大神第 33-35 章还没有出,但我根据他在 Cousera 讲的课内容帮大家提前解读到第 35 章,因为个人认为第四、五个要点联系非常紧。

整篇主要讲实用派 (大神) 如何将理论派 (各种书籍) 的偏差方差概念用在深度学习中,以及如何用学习曲线做合理检验 (sanity check)。

1

偏差方差

本章介绍的内容流程如下:

  1. 书中 (理论派) 对偏差方差的严谨定义 (实用性弱)

  2. 大神 (实用派) 对偏差方差的友好定义 (实用性强)

  3. 理论派和实用派中的最优误差

  4. 理论派和实用派中的偏差方差权衡,如何减小偏差和方差

  5. 从误差点 (单个偏差方差) 到误差线 (学习曲线)

1.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) 都是未知的,“误差 = 偏差 + 方差” 只是一个美丽的等式,而下节大神会给出能计算的偏差和方差的定义。尽管不能计算,上面等式也不是一无所用,至少在降低模型误差时我们有两个目标:

  1. 在降低偏差时不要显著增加方差

  2. 在降低方差时不要显著增加偏差

听起来像废话,做起来不容易。

1.2

大神定义

要点:偏差是模型在训练集上的误差,方差是模型在开发集和训练集上的误差的差异。

大神对偏差方差的定义为:

  • 偏差是模型在训练集上的误差

  • 方差是模型在开发集和训练集上的误差的差别

咋一看,这是什么定义?所以说我们脑洞不够大,比不了大神。从严谨定义开始

    偏差 = (平均模型误差 – 目标模型误差)2

    方差 = E[(某个模型误差 – 平均模型误差)2]

和大神定义靠拢需要以下不是很严谨的观点或假设:

  • 平均模型是在不同数据集上做平均,现在只有一个训练集 Dtrain,因此平均模型就是 f = h(train),平均模型误差 = 训练误差

  • 目标模型就是我们千方百计想要找的模型,找到的话目标模型误差 = 0

  • 定义某个模型误差是 f 在开发集 Ddev 上的误差,假设方差就是在该 Ddev 划分时计算出来的

综上

    偏差 = (训练误差 – 0)2 = 训练误差2

    方差 = (开发误差 – 训练误差)2

将上面方程右边再开方而定义为偏差和方差

    偏差 = 训练误差

    方差 = 开发误差 – 训练误差           

方差开方之后会有正负号,但是开发误差一般都比训练误差,因为模型是从训练上得出来的,没可能在开发集的表现更好。

废了这么大的劲儿将偏差方差的“严谨定义”和“大神定义”联系起来,为了什么?就为了偏差和方差现在可以用训练误差和开发误差来量化!看下面 4 个情景。

如果你的模型达到情景 4 的表现,那么恭喜你成功了,其他情景的话还需要继续该模型,怎么改进就要看到底是偏差问题还是方差问题?怎么判断就要借助训练误差和开发误差。现在知道大神定义的偏差方差有用了吧。

1.3

最优误差

要点:偏差可分成“不可避免偏差”和“可避免偏差”,前者是客观存在而不可能减小的,努力减小的是后者。

上节说如果找到一个模型就是目标模型的话,那么目标模型误差 = 0,这时

    偏差 = 训练误差

但是这种情况是理想化的,我们几乎不可能找到一个误差率为零的模型,换句话说最优误差接近于零但不等于零 (有些模型最优误差还可能很大,比如一个在很嘈杂背景下的一个语音识别器的最优误差高达 14%)。

这个最优误差也是不可避免偏差 (unavoidable bias),顾名思义就是误差无法减小的部分,那么可避免偏差 (avoid bias) 就是误差可以减小的部分。因此偏差又可以继续分解成

    偏差 = 不可避免偏差 + 可避免偏差

重新回顾上节情景 3,假设不可避免偏差有以下两种情况:

  • 情况 A:不可避免偏差 = 1%

  • 情况 B:不可避免偏差 = 14%

这样看,情况 A 还是高偏差高偏差,但情况 B 却是低偏差高偏差。确定最优误差的好处是让我们只关注可避免偏差,而之后需要减小的也是可避免偏差。

1.4

两者权衡

要点:在传统机器学习时代,减小偏差会增大方差,反之亦然。在深度学习时代,在减小可避免偏差时尽量不要显著增大方差,反之亦然。

在传统机器学习时代,偏差和方差是有冲突的,称为偏差方差权衡。如下图:

  • 当模型复杂度低时欠拟合,训练数据的扰动不足以是模型产生显著变化,此时偏差是总误差的主要来源。

  • 当模型复杂度高时过拟合,数据发生的轻微扰动都会导致模型发生显著变化,此时方差是总误差的主要来源。

 

减少偏差的方法 (提高模型复杂度) 包括:

  • 增多特征

  • 减少正则化

减少方差的方法 (降低模型复杂度或者增加数据) 包括:

  • 收集更多数据

  • 减少特征

  • 增加正则化

在深度学习时代,我们有大量的数据和更深的神经网络,很多时候我们减小偏差或方差是不会对另一方产生过多不良影响。我们的目标是

  1. 减小可避免偏差时不要显著增加方差

  2. 减小方差时不要显著增加可避免偏差

减少偏差的方法包括:

  1. 用更深的模型 (增加层数) 或更大的模型 (增加每层的神经元)

  2. 减少正则化作用 (L2, L1 和 dropout)

  3. 训练更长时间

  4. 训练更好的优化算法 (Adam)

  5. 通过在训练集上做误差分析 (见解读吴恩达新书的全球第一帖(上)第 3 节)

  6. 寻找更好的神经网络架构

小结一下:

  • 方法 1 在减小偏差时很容易增加方差,一般一旦发现方差变大就增加正则化来降低方差。

  • 方法 2 在减小偏差时会增大方差,正则化一般不会单独使用。

  • 方法 3-6 都是直接减小训练误差,因而会同时减少偏差和方差。注意的是方法 6 更好的神经网络架构通常很难找到。

  • 最有效的是方法 1:用更深更大的模型配着正则化。

减少方差的方法包括:

  1. 收集更多的数据

  2. 增加正则化作用 (L2, L1 和 dropout)

  3. 加入提前停止

  4. 减少特征数量

  5. 用更浅的模型 (减少层数) 或更小的模型 (减少每层的神经元)

  6. 通过在训练集上做误差分析

  7. 寻找更好的神经网络架构

小结一下:

  • 方法 1 是最直接的,只要有足够处理大量数据的算力。

  • 方法 2 和 3 在减小方差时会增大偏差,一般不会单独使用。

  • 方法 4 在减小方差时会增大偏差,在数据很多时并不是很有效。

  • 方法 5 大神不推荐,除非算力是最值得顾虑的因素。

  • 方法 6 和 7 都是直接减小训练误差,因而会同时减少偏差和方差。注意的是方法 7 更好的神经网络架构通常很难找到。

  • 最有效的是方法 1:收集更多数据,唯一需要考虑的因素是算力。

1.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

2

性能对比

上章最后一节主要讲如何根据学习曲线来减小偏差或方差最终取得低偏差低方差 (低误差),本章来分析如果误差低到逼近人类水平甚至超过人类水平会发生什么。

2.1

人类表现

要点:对于人类擅长的任务,可用人类误差近似不可避免偏差。

人们经常比较机器学习系统表现和人类表现,通常趋势如下图:

从上图可看出三点:

  1. 开始当模型没有人类水平好时,往人类水平进展的速度是很快的。

  2. 一旦模型过了人类水平,其精度提升变得很慢了。原因有二:

    1. 数据是人类标记的

    2. 错误分析是人类做的

  3. 最后我们都希望模型能达到理论上最佳水平,但就是无法超越。

第 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% 作为人类误差可以得到相反的结论,到底是要减小偏差还是减小方差?模型表现越好时也越难继续优化,因为这时候人类误差是比较模糊难以准确定义的。

这样看来,如果模型超过人类时,继续优化会更加困难!

2.2

超人表现

要点:当机器学习系统表现超过人类表现,贝叶斯误差就很难估计,再从减少偏差或方差方面提升系统性能就很困难。

对于自然感知类问题,机器学习的表现不及人类。但是在很多其它方面,机器学习模型的表现已经超过人类了,包括:产品推荐物流预测贷款审批等。注意这些任务的数据都是结构化 (structured) 数据 (两维数据,每一行是一个示范,每一列是一个特征),而不像感知类问题的非结构化 (unstructured) 数据 (一张图片,一段语音等)。

当今,机器在处理结构化数据的表现远远超过了人类表现,此外,机器在某些语音识别和图像识别的任务中也超过了人类,因此想继续提升会非常困难。这也很正常,想想博尔特百米用时从 9.7 秒提升到 9.6 秒远比从 10.1 秒提升到 10 秒困难。

3

总结

明晰大神提出的几个定义:

  • 不可避免偏差 ≈ 人类误差

  • 可避免偏差 = 训练误差 - 不可避免偏差

  • 方差 = 开发误差 - 训练误差

用学习曲线来判断误差主要来源是偏差还是方差

  • 如果是偏差问题,可以用更大更深神经网络加正则化

  • 如果是方差问题,可以增加训练数据

  • 如果是两者,可以试着所有方法,能找到更好的网络架构最好

终极目标是让机器学习系统表现逼近人类表现并超越人类,但是进展越来越慢 (分析误差效率越来越低),原因有三:

  1. 数据要靠人类标记的

  2. 错误分析是用人类的见解

  3. 贝叶斯误差定义越来越模糊,因此发现误差来源属于偏差或者方差这件事越来越困难

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/abcdefg90876/article/details/104305988

智能推荐

centos磁盘分区,格式化,挂载(永久挂载)_centos 永久挂载-程序员宅基地

文章浏览阅读2.8k次。虚拟机,添加新的硬盘进行分区,格式化,挂载的操作_centos 永久挂载

SQL优化-索引 (三)只要建立索引就能显著提高查询速度(转)-程序员宅基地

文章浏览阅读504次。2、只要建立索引就能显著提高查询速度  事实上,我们可以发现上面的例子中,第2、3条语句完全相同,且建立索引的字段也相同;不同的仅是前者在fariqi字段上建立的是非聚合索引,后者在此字段上建立的是聚合索引,但查询速度却有着天壤之别。所以,并非是在任何字段上简单地建立索引就能提高查询速度。  从建表的语句中,我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。在此..._索引对查询效率非常有用,在建表时就应该建好且建完整

前端项目开发流程_前端开发流程sop-程序员宅基地

文章浏览阅读3.2w次,点赞20次,收藏180次。当前分为以下四个阶段第一阶段库/框架选型(暂定react)第二阶段简单构建优化 NPM管理包node+webpack打包第三阶段JS、CSS模块化开发第四阶段组件化开发 开发过程当中注意:前端安全XSS CSRF攻击等 后期文章中将讲述如何_前端开发流程sop

个人云电脑-推荐方案 - Parsec / Fastlink_parsec 局域网-程序员宅基地

文章浏览阅读1w次。个人云电脑-推荐方案 - Parsec / FastlinkParsec安利原文局域网游戏串流:让我们都做一回「云」玩家Parsec 是游戏串流工具中的新秀。与其他不同的是,Parsec 推荐 PC-PC 间云游戏,不论是局域网还是公网通吃,这就是 Parsec 比较厉害的地方。两台设备之间的流量不通过 Parsec 云服务器,而是 Peer to Peer,Parsec 自己宣称自己使用了很多技术来保证玩家的联机体验。但国内的家庭宽带一般都是 NAT 环境(部分运营商可以._parsec 局域网

linux之find命令,Linux基础知识之find命令详解-程序员宅基地

文章浏览阅读148次。在运维人员操作系统时,要接触大量的文件,为了避免忘记文件存放位置的尴尬,就需要我们有一种文件查找工具的帮忙,下面是两个文件查找工具的详解,locate以及find,分别分享给大家。第一款工具: Locatelocate - find files by namelocate的工作依赖于事先构建好的索引库;查找文件时,直接搜索索引库里记载的文件的位置;索引库的构建:系统自动实现(周期性任务);手动更新..._find -name -r

登录模块 用户认证 SpringSecurity +Oauth2+Jwt_spring security 6+oauth2 +jwt+密码认证-程序员宅基地

文章浏览阅读6.7k次,点赞7次,收藏87次。SpringSecurity Oauth2 jwtSpringSecurity Oauth2 jwt1 用户认证分析1.1 单点登录1.2 第三方账号登录2 认证解决方案2.1 单点登录技术方案2.2 第三方登录技术方案2.2.1 Oauth2认证流程2.2.2 Oauth2在项目的应用2.3 Spring security Oauth2认证解决方案3 Jwt令牌回顾3.1 令牌结构3.2 生成私钥公钥3.3 基于私钥生成jwt令牌3.3.1导入认证服务3.3.2 认证服务中创建测试类3.4 基于公_spring security 6+oauth2 +jwt+密码认证

随便推点

Ubuntu 16.04-18.04中安装 WPS Office 2016 for Linux(集合篇含字体解决方法)简单好用-程序员宅基地

文章浏览阅读1.3w次。金山软件办公套件的最新更新 WPS 2016 for Linux,日前发布了几项新功能,性能改进和各种修复。为什么选择WPS办公套件?WPS Office由三个主要组件组成:WPS 文字,WPS 演示和WPS 表格。它看起来非常类似于Microsoft Office! 与Microsoft Office提供的文档格式(包括PPT,DOC,DOCX,XLS和XLSX)完全兼容性。WPS的个人版是供个..._wps office 2016 for linux

python 偏最小二乘回归实现-程序员宅基地

文章浏览阅读8k次,点赞8次,收藏95次。用自己数据实现偏最小二乘回归。用Hitters数据集做演示如何使用自己的数据实现偏最小二乘回归。 此数据集有322个运动员的20个变量的数据, 其中的变量Salary(工资)是我们关心的。数据下载百度网盘链接:https://pan.baidu.com/s/13pb7VN_kTzV0hUEsg-1S1A提取码:3333import pandas as pdimport numpy as npfrom sklearn.cross_decomposition import PLSRegression_python 偏最小二乘回归

Java基础---数据类型、类型转换、字符串 基础-程序员宅基地

文章浏览阅读368次,点赞7次,收藏8次。记住常用的基本数据类型int,double熟悉位数: byte8位,int 32位等等记住特性: long需要加L,flaot需要加F,char必须是单引号且只有一个2.1类型转换数据类型转换, 即 它们之间可以变换.2.1.1默认转换按照数据的表示范围, 小范围向大范围转换,可以默认进行// 类型转换默认进行(小转大)long b = a;2.1.2强制转换通过强制转换,可以将数据转换过去,但是有可能丢失精度口诀: 小转大默认进行,大转小强制进行3.1字符串。

uniapp h5后台地址配置_uniapp配置后台ip-程序员宅基地

文章浏览阅读2.5k次。"h5" : { "sdkConfigs" : { "maps" : {} }, "router" : { "base" : "./" }, "devServer" : { "port" : 8080, "disableHostCheck" : true, "proxy" : { ..._uniapp配置后台ip

centos7日志文件_CentOS7的journalctl日志查看方法-程序员宅基地

文章浏览阅读1k次。1、概述日志管理工具journalctl是centos7上专有的日志管理工具,该工具是从message这个文件里读取信息。Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf。2、查看所有日志(默认情况下 ,只保存本次启动的日志)[root@CEN..._journalctl -b 0

Spring Boot 注入静态成员变量_静态成员变量怎么注入-程序员宅基地

文章浏览阅读535次。前言: 在属性被 static 修饰后,Spring 便不能直接对变量进行直接注入,这是因为被 static 修饰后,会被放到常量池中,而Spring 需要使用set方法进行注入,这是就需要我们手动进行配置注入成员变量第一步:在类上添加@Component注解,让Spring扫描到这个类第二步:为成员变量添加set方法,注意去掉static关键字,否则会导致注入失败第三步:在set方法上添加@Resource注解,告诉Spring自动注入这个方法/** * @author: mi_静态成员变量怎么注入

推荐文章

热门文章

相关标签