Machine Learning Chinese NLP :::: Learning Curves - Chad Salinas ::: Data Scientist
Use Slidify to create motion charts to share with the world on rPubs Chad Salinas or GitHub.
Slidify, rPubs Chad Salinas, Motion Charts, Hans Rosling
1304
post-template-default,single,single-post,postid-1304,single-format-standard,qode-listing-1.0.1,qode-social-login-1.0,qode-news-1.0,qode-quick-links-1.0,qode-restaurant-1.0,ajax_fade,page_not_loaded,,qode-title-hidden,qode_grid_1300,qode-theme-ver-12.0.1,qode-theme-bridge,bridge,wpb-js-composer js-comp-ver-5.4.2,vc_responsive
a

Machine Learning Chinese NLP :::: Learning Curves

Learning Curves

本节课我们介绍学习曲线

绘制学习曲线非常有用
也许你想检查你的学习算法
运行是否一切正常
或者你希望改进算法的表现或效果

那么学习曲线
就是一种很好的工具
我经常使用学习曲线
来判断某一个学习算法
是否处于偏差 方差问题 或是二者皆有

下面我们就来介绍学习曲线
为了绘制一条学习曲线
我通常先绘制出Jtrain
也就是训练集数据的

平均误差平方和
或者Jcv 也即交叉验证集数据的
平均误差平方和
我要将其绘制成一个
关于参数m的函数
也就是一个关于训练集
样本总数的函数
所以m一般都是一个常数 比如m等于100
表示100组训练样本
但我要自己取一些m的值
也就是说我要自行对m的取值
做一点限制
比如说我取10 20或者
30 40组训练集
然后绘出训练集误差
以及交叉验证集误差
好的 那么我们来看看
这条曲线绘制出来是什么样子
假设我只有一组训练样本
也即m=1
正如第一幅图中所示
并且假设使用二次函数来拟合模型

那么由于我只有一个训练样本
拟合的结果很明显会很好
是吧 用二次函数来拟合
对这一个训练样本拟合
其误差一定为0
如果有两组训练样本 二次函数也能很好地拟合

即使是使用正则化
拟合的结果也会很好
而如果不使用正则化的话
那么拟合效果绝对棒极了
如果我用三组训练样本的话
好吧 看起来依然能很好地
用二次函数拟合
也就是说 当m等于1 m=2 或m=3时

对训练集数据进行预测
得到的训练集误差
都将等于0
这里假设我不使用正则化
当然如果使用正则化
那么误差就稍大于0
顺便提醒一下
如果我的训练集样本很大
而我要人为地限制训练集
样本的容量
比如说这里
我将m值设为3
然后我仅用这三组样本进行训练
然后对应到这个图中
我只看对这三组训练样本
进行预测得到的训练误差
也是和我模型拟合的三组样本

所以即使我有100组训练样本
而我还是想绘制
当m等于3时的训练误差

那么我要关注的仍然是
对这三组训练样本进行预测的误差
同样 这三组样本也是我们用来拟合模型的三组样本

所有其他的样本
我都在训练过程中选择性忽略了
好的 总结一下
我们现在已经看到
当训练样本容量m很小的时候
训练误差也会很小
因为很显然
如果我们训练集很小
那么很容易就能把
训练集拟合到很好
甚至拟合得天衣无缝
现在我们来看
当m等于4的时候
好吧 二次函数似乎也能
对数据拟合得很好
那我们再看
当m等于5的情况
这时候再用二次函数来拟合
好像效果有下降但还是差强人意

而当我的训练集越来越大的时候
你不难发现 要保证使用二次函数
的拟合效果依然很好
就显得越来越困难了
因此 事实上随着训练集容量的增大
我们不难发现
我们的平均训练误差
是逐渐增大的
因此如果你画出这条曲线
你就会发现
训练集误差 也就是
对假设进行预测的误差平均值
随着m的增大而增大
再重复一遍对这一问题的理解
当训练样本很少的时候
对每一个训练样本
都能很容易地拟合到很好
所以训练误差将会很小
而反过来
当m的值逐渐增大
那么想对每一个训练样本都拟合到很好
就显得愈发的困难了
因此训练集误差就会越来越大
那么交叉验证集误差的情况如何呢
好的 交叉验证集误差
是对完全陌生的交叉验证集数据
进行预测得到的误差
那么我们知道
当训练集很小的时候
泛化程度不会很好
意思是不能很好地适应新样本
因此这个假设
就不是一个理想的假设
只有当我使用
一个更大的训练集时
我才有可能
得到一个能够更好拟合数据的
可能的假设
因此 你的验证集误差和
测试集误差
都会随着训练集样本容量m的增加
而减小 因为你使用的数据越多
你越能获得更好地泛化表现
或者说对新样本的适应能力更强
因此 数据越多 越能拟合出合适的假设
所以 如果你把Jtrain和Jcv绘制出来
就应该得到这样的曲线
现在我们来看看
当处于高偏差或者高方差的情况时
这些学习曲线
又会变成什么样子
假如你的假设处于高偏差问题
为了更清楚地解释这个问题
我要用一个简单的例子来说明
也就是用一条直线
来拟合数据的例子
很显然一条直线不能很好地拟合数据

所以最后得到的假设很有可能是这样的

现在我们来想一想
如果我们增大训练集样本容量
会发生什么情况呢
所以现在不像画出的这样
只有这五组样本了
我们有了更多的训练样本

那么如果你用一条直线来拟合
不难发现
还是会得到类似的一条直线假设
我的意思是
刚才的情况用一条直线不能很好地拟合
而现在把样本容量扩大了
这条直线也基本不会变化太大
因为这条直线是对这组数据
最可能也是最接近的拟合
但一条直线再怎么接近
也不可能对这组数据进行很好的拟合
所以 如果你绘出交叉验证集误差

应该是这样子的
Chad Salinas working on Plotly

Chad Salinas working on analytics project.

Chad Salinas late nighter
最左端表示训练集样本容量很小 比如说只有一组样本
那么表现当然很不好
而随着你增大训练集样本数
当达到某一个容量值的时候
你就会找到那条最有可能
拟合数据的那条直线
并且此时即便
你继续增大训练集的
样本容量
即使你不断增大m的值
你基本上还是会得到的一条差不多的直线
因此 交叉验证集误差
我把它标在这里
或者测试集误差
将会很快变为水平而不再变化
只要训练集样本容量值达到
或超过了那个特定的数值
交叉验证集误差和测试集误差就趋于不变
这样你会得到最能拟合数据的那条直线
那么训练误差又如何呢
同样 训练误差一开始也是很小的

而在高偏差的情形中
你会发现训练集误差
会逐渐增大
一直趋于接近
交叉验证集误差
这是因为你的参数很少
但当m很大的时候 数据太多
此时训练集和交叉验证集的
预测效果将会非常接近

这就是当你的学习算法处于
高偏差情形时
学习曲线的大致走向

最后补充一点
高偏差的情形
反映出的问题是
交叉验证集和训练集
误差都很大
也就是说 你最终会得到一个
值比较大Jcv
和Jtrain

这也得出一个很有意思的结论
那就是
如果一个学习算法
有很大的偏差
那么当我们选用更多的训练样本时
也就是在这幅图中
随着我们增大横坐标
我们发现交叉验证集误差的值
不会表现出明显的下降
实际上是变为水平了
所以如果学习算法
正处于高偏差的情形

那么选用更多的训练集数据
对于改善算法表现无益
正如我们右边的
这两幅图所体现的
这里我们只有五组训练样本
然后我们找到这条直线来拟合
然后我们增加了更多的训练样本
但我们仍然得到几乎一样的
一条直线
因此如果学习算法
处于高偏差时
给我再多的训练数据也于事无补
交叉验证集误差或测试集误差
也不会降低多少
所以 能够看清你的算法正处于
高偏差的情形
是一件很有意义的事情
因为这样可以让你避免
把时间浪费在
想收集更多的训练样本
因为再多的数据也是无意义的
接下来我们再来看看
当学习算法正处于高方差的时候
学习曲线应该是什么样子的

首先我们来看
训练集误差
如果你的训练集样本容量很小
比如像图中所示情形
只有五组训练样本
如果我们用很高阶次的
多项式来拟合

比如这里我用了100次的多项式函数
当然不会有人这么用的 这里只是演示

并且假设我们使用
一个很小的lambda值
可能不等于0
但足够小的lambda
那么很显然 我们会对这组数据
拟合得非常非常好
因此这个假设函数对数据过拟合
所以 如果训练集
样本容量很小时
训练集误差Jtrain
将会很小

随着训练集样本容量的增加
可能这个假设函数仍然会
对数据或多或少
有一点过拟合
但很明显此时要对数据很好地拟合
显得更加困难和吃力了
所以 随着训练集样本容量的增大
我们会发现Jtrain的值
会随之增大
因为当训练样本越多的时候
我们就越难跟训练集数据拟合得很好
但总的来说训练集误差还是很小
交叉验证集误差又如何呢
好的 在高方差的情形中
假设函数对数据过拟合
因此交叉验证集误差
将会一直都很大
即便我们选择一个
比较合适恰当的
训练集样本数
因此交叉验证集误差
画出来差不多是这样的
所以算法处于高方差情形
最明显的一个特点是

在训练集误差
和交叉验证集误差之间
有一段很大的差距

而这个曲线图也反映出
如果我们要考虑增大训练集的样本数
也就是在这幅图中
向右延伸曲线
我们大致可以看出
这两条学习曲线
蓝色和红色的两条曲线
正在相互靠近
因此 如果我们将曲线
向右延伸出去
那么似乎
训练集误差很可能会
逐渐增大
而交叉验证集误差

则会持续下降
当然我们最关心的还是交叉验证集误差
或者测试集误差 对吧
所以从这幅图中
我们基本可以预测
如果继续增大训练样本的数量
将曲线向右延伸
交叉验证集误差将会
逐渐下降
所以 在高方差的情形中
使用更多的训练集数据
对改进算法的表现
事实上是有效果的
这同样也体现出
知道你的算法正处于
高方差的情形
也是非常有意义的
因为它能告诉你
是否有必要花时间
来增加更多的训练集数据

好的 在前一页和这一页幻灯片中
我画出的学习曲线
都是相当理想化的曲线
针对一个实际的学习算法
如果你画出学习曲线的话
你会看到基本类似的结果
就像我在这里画的一样
虽然如此
有时候你也会看到
带有一点噪声或干扰的曲线
但总的来说
像这样画出学习曲线
确实能帮助你
看清你的学习算法
是否处于高偏差 高方差 或二者皆有的情形
所以当我打算
改进一个学习算法
的表现时
我通常会进行的一项工作
就是画出这些学习曲线
一般来讲 这项工作会让你
更轻松地看出偏差或方差的问题

在下一节视频中
我们将介绍如何判断
是否应采取具体的某个行为
来改进学习算法的表现

Let the dataset change your mindset

– Hans Rosling
No Comments

Sorry, the comment form is closed at this time.