Chinese, Computer Science, Technology
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绘制出来
就应该得到这样的曲线
现在我们来看看
当处于高偏差或者高方差的情况时
这些学习曲线
又会变成什么样子
假如你的假设处于高偏差问题
为了更清楚地解释这个问题
我要用一个简单的例子来说明
也就是用一条直线
来拟合数据的例子
很显然一条直线不能很好地拟合数据
所以最后得到的假设很有可能是这样的
现在我们来想一想
如果我们增大训练集样本容量
会发生什么情况呢
所以现在不像画出的这样
只有这五组样本了
我们有了更多的训练样本
那么如果你用一条直线来拟合
不难发现
还是会得到类似的一条直线假设
我的意思是
刚才的情况用一条直线不能很好地拟合
而现在把样本容量扩大了
这条直线也基本不会变化太大
因为这条直线是对这组数据
最可能也是最接近的拟合
但一条直线再怎么接近
也不可能对这组数据进行很好的拟合
所以 如果你绘出交叉验证集误差
应该是这样子的
最左端表示训练集样本容量很小 比如说只有一组样本
那么表现当然很不好
而随着你增大训练集样本数
当达到某一个容量值的时候
你就会找到那条最有可能
拟合数据的那条直线
并且此时即便
你继续增大训练集的
样本容量
即使你不断增大m的值
你基本上还是会得到的一条差不多的直线
因此 交叉验证集误差
我把它标在这里
或者测试集误差
将会很快变为水平而不再变化
只要训练集样本容量值达到
或超过了那个特定的数值
交叉验证集误差和测试集误差就趋于不变
这样你会得到最能拟合数据的那条直线
那么训练误差又如何呢
同样 训练误差一开始也是很小的
而在高偏差的情形中
你会发现训练集误差
会逐渐增大
一直趋于接近
交叉验证集误差
这是因为你的参数很少
但当m很大的时候 数据太多
此时训练集和交叉验证集的
预测效果将会非常接近
这就是当你的学习算法处于
高偏差情形时
学习曲线的大致走向
最后补充一点
高偏差的情形
反映出的问题是
交叉验证集和训练集
误差都很大
也就是说 你最终会得到一个
值比较大Jcv
和Jtrain
这也得出一个很有意思的结论
那就是
如果一个学习算法
有很大的偏差
那么当我们选用更多的训练样本时
也就是在这幅图中
随着我们增大横坐标
我们发现交叉验证集误差的值
不会表现出明显的下降
实际上是变为水平了
所以如果学习算法
正处于高偏差的情形
那么选用更多的训练集数据
对于改善算法表现无益
正如我们右边的
这两幅图所体现的
这里我们只有五组训练样本
然后我们找到这条直线来拟合
然后我们增加了更多的训练样本
但我们仍然得到几乎一样的
一条直线
因此如果学习算法
处于高偏差时
给我再多的训练数据也于事无补
交叉验证集误差或测试集误差
也不会降低多少
所以 能够看清你的算法正处于
高偏差的情形
是一件很有意义的事情
因为这样可以让你避免
把时间浪费在
想收集更多的训练样本
因为再多的数据也是无意义的
接下来我们再来看看
当学习算法正处于高方差的时候
学习曲线应该是什么样子的
首先我们来看
训练集误差
如果你的训练集样本容量很小
比如像图中所示情形
只有五组训练样本
如果我们用很高阶次的
多项式来拟合
比如这里我用了100次的多项式函数
当然不会有人这么用的 这里只是演示
并且假设我们使用
一个很小的lambda值
可能不等于0
但足够小的lambda
那么很显然 我们会对这组数据
拟合得非常非常好
因此这个假设函数对数据过拟合
所以 如果训练集
样本容量很小时
训练集误差Jtrain
将会很小
随着训练集样本容量的增加
可能这个假设函数仍然会
对数据或多或少
有一点过拟合
但很明显此时要对数据很好地拟合
显得更加困难和吃力了
所以 随着训练集样本容量的增大
我们会发现Jtrain的值
会随之增大
因为当训练样本越多的时候
我们就越难跟训练集数据拟合得很好
但总的来说训练集误差还是很小
交叉验证集误差又如何呢
好的 在高方差的情形中
假设函数对数据过拟合
因此交叉验证集误差
将会一直都很大
即便我们选择一个
比较合适恰当的
训练集样本数
因此交叉验证集误差
画出来差不多是这样的
所以算法处于高方差情形
最明显的一个特点是
在训练集误差
和交叉验证集误差之间
有一段很大的差距
而这个曲线图也反映出
如果我们要考虑增大训练集的样本数
也就是在这幅图中
向右延伸曲线
我们大致可以看出
这两条学习曲线
蓝色和红色的两条曲线
正在相互靠近
因此 如果我们将曲线
向右延伸出去
那么似乎
训练集误差很可能会
逐渐增大
而交叉验证集误差
则会持续下降
当然我们最关心的还是交叉验证集误差
或者测试集误差 对吧
所以从这幅图中
我们基本可以预测
如果继续增大训练样本的数量
将曲线向右延伸
交叉验证集误差将会
逐渐下降
所以 在高方差的情形中
使用更多的训练集数据
对改进算法的表现
事实上是有效果的
这同样也体现出
知道你的算法正处于
高方差的情形
也是非常有意义的
因为它能告诉你
是否有必要花时间
来增加更多的训练集数据
好的 在前一页和这一页幻灯片中
我画出的学习曲线
都是相当理想化的曲线
针对一个实际的学习算法
如果你画出学习曲线的话
你会看到基本类似的结果
就像我在这里画的一样
虽然如此
有时候你也会看到
带有一点噪声或干扰的曲线
但总的来说
像这样画出学习曲线
确实能帮助你
看清你的学习算法
是否处于高偏差 高方差 或二者皆有的情形
所以当我打算
改进一个学习算法
的表现时
我通常会进行的一项工作
就是画出这些学习曲线
一般来讲 这项工作会让你
更轻松地看出偏差或方差的问题
在下一节视频中
我们将介绍如何判断
是否应采取具体的某个行为
来改进学习算法的表现
Sorry, the comment form is closed at this time.