【在不同的分布上训练和测试】
假如用户已经标注了10000张猫咪照片(含有猫和不含有猫),另外还有从网上下载的更大量200000张图片,那么如何确定开发集测试集和训练集呢?
从上可以知道这10000张照片比较符合真实的分布,但是如果我们要训练一个深度学习模型,那么我们将那20w张照片加入的话,那么分布将不再一致。但是这会有什么影响呢?
除了讲数据划分为训练集、开发集和测试集以外,还有一种做法:那就是将这21w数据混合在一起,随机打乱,然后进行划分,这样各个集合就满足了同分布的需求了。这里不建议这么做,因为如果这么做了,那么就意味着97%以上的开发测试数据来源于网上,这和实际的分布有差别,所以不建议这么做。下面是关于开发集测试集的建议:
选择开发集和测试集要能反映你将来需要预测的数据
在机器学习初期,我们只有一个数据集,通常都是认为预测数据和当前数据集服从某一分布,所以都是将源数据集切分为训练集、开发集和测试集。但是大数据时代,数据很多,虽然不一定同分布,但是我们还是希望能用它来学习。对于上面的例子,我们可以将5000张图片+20w张网络图片放入到开发集测试集中进行使用,下面将会说为何这么使用。
在很早之前我们有个人脸识别的分类器,然后如果融入这20w数据可能会导致模型效果变差,所以是不建议增加这部分数据的。
但是现在大型神经网络,强大而灵活的算法,已经将风险大大降低了。如果能够构建足够多的隐藏层和神经元,那么将20w数据加入到训练集,对算法性能还是有可能提升的。
这种观察依赖一个事实:即有一些x-y对于这些数据很有效,也就是意味着我们能通过一个模型将这20w数据进行预测得到可靠的标签,即使它不知道图片来源。
额外添加20w数据的影响:
1、提供更多猫咪的样本对模型是有帮助的。
2、这可能使神经网络花费一部分精力学习网络图片的特性,比如高分辨率等,这就会耗费神经网络一部分的表征能力,最终可能影响算法的性能。
其实有一个例子可以解释2的影响。福尔摩斯说,你的大脑就像一个阁楼,它只有有限的空间,每增加一个知识你就会忘记之前知道的东西,所以不要让无用的事实挤掉最后的事实真相。
但是,这里的阁楼你可以认为是无限的,无限的计算和存储,所以有足够的空间来存储。
所以最终决定是否使用,要看你是否有足够大的神经网络,如果有,那么可以不用聚焦数据,直接使用;如果没有,那么还是要聚焦数据进行数据清洗。
【如何决定是否添加不一致数据】
假如你要预测纽约房子的价格,那么除了纽约的数据样本,是否要添加底特律的样本?如果我们的模型只关注纽约房价,那么这里肯定是不把底特律样本加入的。
那么这里纽约底特律房价数据和网络上及移动设备上的猫咪数据有什么不同吗?
主要的不同在这里。网络上下载的数据虽然不同于移动上的,但是它也是图片,要做的事情是里面是否含有猫咪,这里可以做一个x-y的映射,这和本质的目标没有差别,就是寻找图片里面是否含有猫咪,所以增加这部分数据,不会有什么负面影响,除了多一些运算。 然而纽约和底特律房价位置的因素恰恰是我们目标预测的关键因素,那么这个影响就非常的大,所以不能加入。
【给数据增加权重】
我们只有10000标注数据,面对20w的网络数据,如果我们没有足够的计算,那么我们可以降低网络图片的权重。我们在目标函数上对网络数据的损失函数进行降权即可。这样我们就不必要训练那么大的网络。
beta可以设置为1/40
【从训练集泛化到开发集】
如果训练集和开发测试集分布不一样可能就会有如下问题:
1、训练集表现差,这属于训练集高偏差的问题
2、训练集很好,但是测试集很差,这属于高方差的问题
3、它能够泛化到和训练集同分布的数据,但是很难泛化到开发测试集同分布的数据,这是数据不一致的问题
假如猫咪训练结果如下:
1%的训练误差
1.5%的与训练集同分布的未知数据误差
10%的开发集误差
这个结果显然是数据不匹配的问题。
为了诊断1和3影响程度,我们不妨把训练集分为两块,那么就是4个集合:
1、训练集,包含互联网+移动数据,我们并不关心分布
2、训练开发集,与训练集同分布,评估我们的训练集效果
3、开发集,这是与测试集同分布的数据,我们最终关系的移动设备数据
4、测试集,只是与开发集同分布的数据。
有了这4个数据集,那么就可以评估:
训练误差,对训练集进行评估
该算法能够泛化到与训练集同分布的数据的能力,并对训练开发集进行评估
算法实际关心的性能在开发集和测试集上进行评估。
【辨别偏差方差和数据不匹配的问题】
1%训练误差
5%的训练开发误差
5%开发集误差
明显是高方差
10%的训练误差
11%的训练开发误差
12%的开发误差
明显是高偏差
还有就是高方差偏差以及伴随数据不匹配的问题
10%的训练误差
11%的训练开发误差
20%的开发误差
【解决数据不匹配问题】
假如你有一个语音识别系统,在训练和训练开发集上表现很好,但是在开发集上做得很差,这明显是数据不匹配的问题。该怎么做呢?
1、理解训练集和开发集分布的差异
2、寻找更多的样本,以更好的匹配开发集碰到的样本
比如你通过分析误差发现,训练集都是在安静环境下的录音,但是真实场景都是车内有各种噪音的场景,那么这正是数据不匹配的原因。不过如果没有方式获取更多的数据,也就基本没有一条明确的路径来提升性能了。
【人工合成数据】
如果你有安静环境下录音数据,那么还存在一些车内环境的噪杂的录音数据,就可以进行数据合成,生成样本数据。
不过合成也有一些挑战,如果噪音数据只是很少的样本,很少的环境,那么很容易过拟合到这几个环境中。
所以在合成数据的时候,还是要先分析好,会不会导致过拟合到部分场景数据中。
【优化验证测试】
假如要构建一个语音识别系统,系统输入一段音频A,并为每一个可能输出的句子S计算一个打分较ScoreA(S),那么就可以试着计算ScoreA(S)=P(S|A)也就是音频A下,句子是S的概率。
能计算这个以后,我们仍然需要找到一个S使这个概率最大化:
如何计算max呢?NP问题。比如50000个词汇,那么句子的组成方法50000^N(加入这个句子有N个词汇的话),这完全不太可能计算的出来。
所以要选择一个定向搜索的办法,也就是在某些词汇后面跟着的词汇只是一小部分,而不可能是所有的。
比如句子『我爱机器学习』,最后输出『我爱机器人』,这里面有两类问题:
1、搜索算法没有搜索到最终的句子
2、我们计算的最大概率有问题,导致目标句子的概率并不是最大
对于不同的原因优化的方向不一样,但是需要验证到底是哪个原因:
我们可以对以上两个句子计算他们的score得分,看那个更高?
如果『我爱机器学习』分数高,说明我们的概率公式问题不大,而是搜索的问题;反之则是公式的问题。
其实简单形象的说就是召回和排序问题。
【端到端学习的兴起】
假如我们要对一些评论进行正负面进行标注,一般我们会有2步,先解析分词,然后再区分这些词汇的感情色彩是正面还是负面。
而最近流行端到端学习如下:
还有其他端到端的例子:
一般语音识别的流程
端到端
无人车例子:
端到端的优缺点:
先考虑语音识别的流水线:
频谱系数是人工设计的特征, 是人类对音频输入的归纳,简化了输入
音素是语言学家发明的,是说话声音不完备的表示,是对声音很差 近似,因此音素标示会限制算法的性能。
然而这么做也有一些优点:
频谱系数对于处理一些不影响音频内容的属性还是很有效的,比如说音高。
一定程度上,音素也是语音的一种标示方法,可以通过训练提升算法性能。
而对于端到端,缺乏人工的设计。如果训练集很小的话,可能比人工设计表现的更糟糕。
但是如果有足够多的样本数据&足够大的神经网络,那么就一定会得到一个最优的模型,甚至达到最优的错误率。
如果不选择端到端,那么势必会涉及到选择中间流水线的组件。
【流水线组件:数据的可用性】
考虑自动驾驶的例子:
可以通过数据进行车辆和行人的检测,这个还是可以做到的。相反如果是端到端的学习,我们需要一个图像到操纵方向的数据,这个数据的收集是非常困难的。
所以也要根据数据的可用性进行端到端还是流水线的选择。
【直接学习更为丰富的输出】
举个例子:
x下面更多的例子:
这体现了深度学习高速变化的优势,当有正确的输入输出标签对时,就可以进行端到端的学习。即使输出是一个句子、图像、音频。或者其他比一个数字更为丰富的输出。
【组件误差归因】
尝试修改A为完美输出,并运行BC如果最后结果正确,那么就要去优化A;对于B也是一样。
下吗举一个复杂的例子:
A:检测汽车
B:检测行人
C:规划路径
A为完美输入看结果如果好那就优化A;同样B也是;其实对于有向无环图都是通用的。比如这个先B后A也是可以的。
组件和人类水平对比,和之前误差与人类对比很类似。
【有缺陷的流水线】
车辆检测大概是人类级别
行人检测也大概是人类级别
与这两个作为输入,规划路径的输出也应该能够达到人类的水平才对,如果二者差别很大,就意味着这个流水线是有缺陷的,比如需要增加下面的流程:
【结论】
开始组件团队搞事情吧!!!
领取专属 10元无门槛券
私享最新 技术干货