通过估计学习算法的偏差和方差
能帮你确定下一步工作的优先级
但当你的训练集 开发集 测试集 来自不同的分布时
偏差和方差的分析方法也会相应变化
接下来一起看看如何实现
让我们继续使用猫分类器的例子
假设人类在这个问题上有近乎完美的表现
即贝叶斯误差约等于0%
所以进行误差分析时你通常要兼顾
训练集误差和开发集误差
假设在这个例子中训练集误差为1%
开发集误差为10%
如果开发集和训练集数据 来自同一分布
那说明问题是方差过大
代表虽然算法的训练集表现好
但未能较好地泛化(generalize)到开发集 即开发集表现不好
但如果训练集与开发集的数据来自不同分布的话
你就未必能这样肯定地下结论了
具体来说 也许它在开发集的一般表现
只是因为 高分辨率 非常清晰的图片
造成训练集难度较低 但开发集较难
所以也许不是方差的问题 它只是反映了
开发集的图片更难精确地进行区分这个事实
这时误差分析要注意 当你从训练集误差
转移到开发集误差时 有两件事情变了
一 算法看到的数据只有训练集没有开发集
二 开发集和训练集数据分布不同
因为同时存在两个变量 我们很难判断
这9%的误差 有多少是因为
算法未接触开发集 而影响了方差
又有多少是 因为开发集的数据分布不同
所以 为了辨识出这两个影响
如果你对这两种影响完全不了解 别担心
别担心 我们马上就会说到
为了梳理出这两个影响 我们需要新定义一组数据
叫做训练-开发集(training-dev set)
这是一个新的数据子集
我们要让它与训练集拥有同样的数据分布
但你不用直接拿它来训练你的网络
就是这样子
之前我们已经建立了训练集
训练集和测试集 如图所示
开发集和测试集属于同分布
训练集数据属于不同分布
我们要做的是将训练集随机混淆(shuffle)
取出一小块数据作为训练-开发集
如同开发集与测试集分布相同
训练集与训练-开发集也遵循相同分布
区别在于 现在你只需要用着一部分训练集
训练你的网络
你用让你的神经网络
你需要将训练-开发集用于传播算法
要做误差分析
你要做的是对比分类器的误差
训练集误差 训练-开发集误差和开发集误差
假设在这个例子中训练集误差为1%
训练-开发集的误差是9%
开发集误差为10% 和之前一样
我们可以从中看出
从训练数据到训练-开发数据 误差确实上升了很多
训练数据和训练-开发数据的唯一差别在于
神经网络看到了前者
它在明确地在训练集上训练
但并没有在训练-开发集上直接训练
所以这表明你有方差问题
因为训练-开发误差是在
与训练集同分布的数据上测量的
所以可知 虽然你的神经网络在训练集中做得很好
但它在同分布的训练-开发集上一般化并不好
这些数据虽然来自与训练集相同的分布
但因为一般化得不好 神经网络没能见过
所以这个例子实际上是高方差问题
让我们看一个不同的例子
假设训练集误差为1% 训练-开发集误差为1.5%
但是开发集误差为10%
这就是方差偏小的问题
因为从已经见过的训练集数据
到未见过的训练-开发集 误差只增加了一点点
但是到开发集出现了跃增
所以这是数据不匹配的问题
因为你的学习算法没有直接在
训练-开发集或开发集上训练 而两者来自于不同分布
但是无论它在学习什么算法
它在训练-开发集上性能很好但在开发集上却不是这样
所以某种程度上 你的算法并未在你所关心的分布上
训练的很好 所以我们把它叫做失配问题(mismatch problem)
让我们再看几个例子
因为上面已经没位置了 我把这个写在下面一行
训练集误差 训练-开发集误差 开发集误差
假设训练集误差为10%
训练-开发集误差为11% 开发集误差为12%
之前提到的人类水平的
贝叶斯误差为大约0%
如果是这样的表现 其实是偏差问题
即可避免偏差问题 因为性能比人类水平差远了
这确实是个高偏差设置
让我们看看最后一个例子
如果训练集误差是10% 训练-开发集误差为11%
开发集误差是20% 那么看来它存在2个问题
第一 可避免的偏差相当高
因为它甚至在训练集上的表现都不好
人类误差约等于0 但算法在训练集上的误差为10%
虽然方差看上去相当小
但是数据失配程度相当大
所以对于这个例子我会说
偏差或可避免偏差问题以及数据失配问题都很严重
让我们根据这一页的内容
来总结一般原则
要关注的关键数据是人类水平误差
和你的训练集误差
以及训练-开发集误差
虽然它与训练集数据分布相同
但是并没有直接用于训练
根据开发集误差 以及这些误差间的差值
你就能大致了解可避免偏差 方差
以及数据失配的程度
假设人类水平误差为4%
训练集误差为7%
训练-开发集误差为10%
开发集误差为12%
你就能估计可避免偏差
因为你希望你的算法性能在训练集上
能达到或接近于人类水平
这是方差的情况
能将训练集多好地泛化到训练-开发集
这是数据失配的状况
从技术上讲你还可以再加一个
即测试集性能 这里写上test error
你不应该在测试集上做开发 因为你并不想让
算法在测试集上过拟合
但是如果你看看这个差值 就能看出
算法对开发集的过拟合
如果开发集性能和测试集性能差太多
也许你将神经网络调得太偏向(overtune)于开发集了
所以也许你需要找一个更大的开发集
记住 你的开发集和测试集服从相同分布
因为开发集上的表现 要比测试集好太多
所以这个巨大差异的唯一理由是对开发集的过拟合
如果是这样的话 你可能会考虑倒回去
取得更多的开发集数据
我写了这些数字
从上往下数字保持增长
这里有另一个例子 其中数字并非一直增长
也许人类水平性能为4% 训练集误差为7%
训练-开发集误差为10% 但是到了开发集时
你惊讶的发现 开发集的实际误差要小得多
也许都是6%
你看到的是某个语音识别任务的数据
它是这样的效果 即训练集数据甚至
要比开发集和测试集更难学习
所以这两个是训练集分布上的评估
这两个是开发集/测试集分布上的评估
因此 如果有时基于您的应用 开发/测试集分布更容易学习
那么这些数字实际上是会下降的
如果你发现了这样好玩的事
对于这种分析还有一个更通用的公式
让我在下一张幻灯片上快速解释一下
我用语音激活后视镜这个例子
演示一下
实际上 我们写下来的这些数据可以放到一个表中
其中横轴为不同的数据集
例如 你可能有来自常规语音识别任务的数据
你有一堆数据
来自于之前工作过的语音识别任务
也许来自与小型扬声器或者买来的数据
你也有来自后视镜的特定语音数据
记录在车内
所以x轴标记各种数据集
另一个轴标记用于查验数据的
不同方法或算法
首先是人类水平的性能
即在这些数据集上 人类的精确程度是多少
然后是用于神经网络训练的
样例的误差
最后是没有被神经网络训练的
样例的误差
所以上一张幻灯片所说的人类水平
对应于表中的这个位置
它表示人类在这一类数据上的表现
这一部分数据来自于各种语音识别任务
你可以将数以10万计的话语(utterance)放入训练集
上一页的例子中这个值为4%
这个值也许对应训练误差
上一页中对应值为7%
它表示如果你的学习算法看到了这个样例
并用于运行梯度下降法 同时这个样例来自于训练集同分布
或者其他一般语音识别(任务)分布
算法在这个已被训练的样例上的表现如何？
这里是训练-开发集误差
通常要更高一些 它代表这个分布的数据
即一般语音识别分布中 并没有被直接用于训练
的数据上的性能
称作 训练-开发集误差
移到右半边表
这个格子代表开发集误差 也可能是测试集误差
这个例子中对应值为6%
开发集误差和测试集误差技术上来说是两个不同的数值
但是任意其中之一都可以归于这个格子
表示数据来自于后视镜 来自于车辆的真实记录
来自于后视镜应用 但并未被神经网络
用于反向传播训练的样例 这是它的误差
所以我们在上一张ppt中做的分析就是
看这两个 这两个 这两个数据的差
这个差值用于衡量可避免的偏差
这个差值用于衡量方差
这个差值用于衡量数据失配
事实表明剩下的两个表格
也是有用的
如果这个数据是6%
获得这个数据的方法是 邀请一些人为他们的后视镜语音数据
贴标签以衡量人类在这项任务的表现
也许这个数值仍然是6%
然后你要做的是取一些后视镜语音数据
放入训练集中让神经网络学习
然后测量这个数据子集上的误差
如果这是你得到的数据 那么在这个后视镜语音的任务上
你已经得到了人类水平的性能
也许你在这个数据分布上已经做的很好了
当你继续后续的分析时 并不一定总会得到
清晰的前进方向 但是有时它能提供更多的见解
例如 对本例这两个数据的比较可以得出
对人类来说处理后视镜语音数据实际上比
一般语音识别要难 因为人类误差为6%而不是4%
但是这些差异也能帮助你
了解不同程度的偏差和方差以及数据不匹配问题
这个更通用的陈述我曾经用过几次
我还不太习惯？ 但是对很多问题来说
你会发现查验这些项对应的子集
也就是看这个这个这个差值 就足够指出大有希望的方向了
但是有时填充整个表将带来额外的发现
最后 我们之前讨论了很多关于解决偏差的方法
和处理方差的技术
但是如何解决数据失配的问题？
具体来说训练与开发集测试集不同分布的数据
可以为训练提供更多的数据
帮助学习算法获得更好的性能
但是除了偏差和方差问题
现在你又有了新的潜在问题 数据失配
解决数据失配问题又那些好方法？
老实说 实际上并没有很好的
至少是非常系统的处理数据失配的方法
但是有一些事情你可以试试 或者能有帮助
我们下节再讲
这一节我们讲的是使用来自与开发集和测试集
不同分布的训练数据 能提供更多的数据
帮助提高学习算法的性能
但是除了原来仅有的偏差和方差两个潜在问题
你又有了第三个潜在问题 数据失配
那么如果你进行误差分析并得出结论说
数据失配是一个巨大的误差来源 要怎么解决呢？
不幸地 事实上还没有很系统的方法
来解决这个问题 但是还是有一些可能有帮助的事我们可以试试
我们下节将讲到