不适配的的训练/开发/测试集

第五课:偏差和方差与不适配的数据分布

通过估计学习算法的偏差和方差,能帮你确定下一步工作的优先级。但当你的训练集/测试集/开发集来自不同的分布时,偏差和方差的分析方法也会发生变化。

即如果训练集与开发集来自不同分布的话,就不能简单通过测试集误差和训练集误差来分析是可避免的偏差还是方差问题。
具体来说,也许它在开发集的一般表现,只是因为高分辨率、非常清晰的图片,造成训练集训练难度较低,但开发集比较难。所以也许不是方差的问题, 它只是反映了开发集的图片更难精确区分这一事实。

这时的误差分析要注意:当你从训练集误差转移到开发集误差时,有两件事改变了:
1.算法看到的数据只有训练集没有开发集
2.开发集和训练集数据分布不同

所以这9%的误差有多少是因为算法没接触开发集,而影响了方差,又有多少是因为开发集的数据分布不同。

所以为了辨识出这两种影响:
我们定义一组新的数据:训练-开发集,这是一个新的数据集,我们让它与训练集拥有同样地数据分布,但你不用直接拿它来训练你的网络。

对比与我们之前的数据分布,测试集和开发集来自相同分布,训练集数据来自不同分布,我们要做的是将训练集随机混淆,取出一小块作为训练-开发集。此时训练集和训练-开发集拥有了相同分布。
区别在于,现在你只需要用一部分训练集训练你的网络,你需要将训练-开发集用于传播算法。

要做误差分析:
你要做的是对比分类器的误差:训练集误差、训练-开发集误差和开发集误差。

训练集和训练-开发集的区别是:
神经网络看到了前者,它在明确的训练集上训练,但并没有在训练-开发集上训练,所以这表明你有方差问题,因为训练-开发误差是在与训练集同分布的数据上测量的,所以虽然你的神经网络在训练集上做的很好,但它在同分布的训练-开发集上一般化并不好,所以这个例子是高方差问题。但是如果从训练集到训练-开发集数据误差增长不大,但是到开发集中出现跃增,这就是数据不匹配问题,因为你的算法没有直接在训练-开发集中训练,而两者来自不同分布,但是 无论它在学习什么算法,它在训练-开发集上性能良好但在开发集上却不是这样。所以某种程度上,你的算法并未在你所关心的分布上训练的很好,我们称之为失配问题。

最后一个误差值表明偏差或可避免偏差以及数据失配问题都很严重。

从以上总结出一般原则:

要关注的关键数据是:
人类水平误差
训练误差
训练-开发集误差,它与训练集数据分布相同,但是没有直接用于训练
开发集误差

这些误差之间的差值。

推导出:
可避免偏差
方差
数据失配程度

你可以估计出可避免偏差,因为你希望你的算法性能在训练集上能达到或者接近于人类水平。方差是能将训练集多好地泛化在训练-开发集上,训练-开发集和开发集误差的差距叫做数据失配度。

此外还有一个测试集误差,从测试集误差和开发集误差之间的差值可以得到算法对开发集的过拟合。
如果开发集性能和测试集性能差太多,也许你将神经网络调的太偏向于开发集了,所以也许你需要找一个更大的开发集,记住你的开发集和测试集服从相同分布,因为开发集上的表现,要比测试集好太多,这个巨大差异的唯一理由就是对开发集的过拟合。
这种情况下,可以倒回去取得更多的开发集数据。

对于语音识别任务,它的效果是:训练集数据甚至要比开发集和测试集更难学习,训练集分布上的数据和开发集/测试集分布上的数据,两者的学习容易程度有时会颠倒,即后者的数字比前者下降,这里有一个公式可以对这种好玩的现象进行分析:

实际上我们写下来的数据可以放到一张表中:

最后我们之前讨论过很多关于解决偏差和处理方差的技术,但是如何解决数据失配问题?

具体来说:训练集/开发集测试集不同分布的数据,可以为训练提供更多的数据,帮助学习算法获得更好的性能,但是除了偏差和方差问题,现在你有了新的潜在问题:数据失配。

如何解决数据失配问题?事实上没有系统的处理数据失配的方法,但有一些事情你可以试一试,

总结:这一讲我们讲的是使用来自于开发集和测试集不同分布的数据,能提供更多的数据帮助训练学习算法的性能,但是除了之前说的方差和偏差两个潜在的问题,所以数据失配如果是误差来源,怎么解决?

第六课:解决数据不匹配问题

如果训练集的分布与你的开发集和测试集的分布不同,并且如果误差分析表明出现了数据不匹配问题,你该怎么解决?

人工地分析误差。并且试着去理解训练集与开发集/测试集之间的差异。同时为了避免测试集上的过拟合,技术上对误差分析来说,你的关注点应该只是开发集而不是测试集。

比如车辆语音识别系统中,开发集不同于训练集之间的差异可能是开发集中有嘈杂的车声,鸣笛声。
车辆控制后视镜系统中,经常识别错误街道号码。

当你去识别开发集的本质或者寻找开发集和训练集之间的区别时,你所能做的就是想法设法使训练集和开发集更加相似,或者也可以收集更多与开发集数据较为相似的数据(模拟出车载噪声数据)。

以上不是一个系统化过程,因为不能保证你获得所需的见解以取得进展。但是人为的观察能使数据在我们关心的维度上具有更强的相似性。

因此,如果你的目标是使训练集与开发集更加相似。怎么解决呢?
其中一个方法是人工合成数据。
通过人工合成数据,你可以快速的创建更多的数据。

因此如果你的误差分析显示你应该尝试让你的数据听起来更像是在车里记录的,那么以上就可以让你合理的合成这种类型的数据,提供给你的训练算法。

学习算法有可能对这一小时的汽车噪声造成过度拟合。所以收集一万小时的汽车噪声会让你的算法运行的更好。所以人工数据合成对于人类听觉来说是一个挑战,因为在你的听觉看来这一小时的汽车噪声和千千万万的汽车噪声没有区别。

另一个例子:
合成汽车图像进行计算机自动识别汽车图像,下面三张图人眼看起来觉得没问题,但是很可能会造成一个子集的过拟合。即使这些电子游戏中的图形看起来很现实,对于一个人来说也不能很简单的分辨出来。但实际上,你确实只涵盖了所有汽车的很小一部分。

总结:
总的来说,如果你认为你遇到了数据不匹配的问题,我推荐你做误差分析,或者观察你的开发集,以便试图了解这两种数据分布的不同所在,你可以设法获得更多的看起来更像你的开发集的训练数据,我们讨论的另外一种方法是人工合成数据,而且它确实能起作用,但必须小心并且记住:你是否可能意外的模拟了所有样本的子集中的数据。

如何同时从多种类型的数据中学习?

第七课:转换学习

深度学习中最有力的方法之一就是有时你可以把一个任务中神经网络学习到的东西应用到另一个任务中去。

比如你可以让神经网络学习识别物体,然后用学习到的知识,来帮助你更好地识别X射线的结果,这就是所谓的迁移学习。

迁移的具体做法是:
取出这个神经网络的最后一层,并移除掉这一层以及相关的权重,然后为最后一层神经网络创建一个新的随机初始化的权重,使用新建的这个输出层来进行放射结果的诊断。

所以具体来说:在训练模型的第一阶段,当你在做图像识别任务时,你训练了所有常用的神经网络的参数,所有权值,所有层,然后这个模型现在能够做出对图像识别的预测。训练得出这样一个神经网络之后,要实现迁移学习,你现在需要把数据集X和y设定为放射影像。然后现在,重新在新的数据集上训练这个神经网络,就是新的放射数据集上。

你有几种方法来重新训练这个放射数据的神经网络。
如果你只是一个小的放射数据集,你可以只重新训练最后一层的权值,就是w[l],b[l]和p[l],同时保留其他参数。如果你有足够的数据,你也可以重新训练神经网络的其余所有层,我们的经验是:
如果你有一个小规模的数据集,那么就去重新训练最后一层和输出层的神经网络,或者你也可以训练最后一到两层的神经网络,但是如果你有大量的数据,你或许可以对这个神经网络的所有参数都进行重新训练。

如果你对神经网络的所有参数都进行重新训练,那么这样训练的初始化阶段,有时候我们叫做预训练。原因是你是在使用图像识别的数据来预初始化或者说预训练神经网络的权重。然后如果你在之后对所有的权重进行更新,那么在放射扫描的数据上的训练我们称之为微调。

所以有时候你在深度学习领域听到的预训练和微调等词,就是在迁移学习中表达的含义。

将图像识别的神经网络迁移到对放射性扫描诊断中,之所以这个过程是有用的,是因为从大规模的图像识别数据集中,学习到的边界检测、曲线检测、明暗对象检测等低层次的信息,或许可以帮助你的学习算法更好地进行放射扫描结果的诊断。它会在图像的组织结构和自然特性中学习到很多信息,其中一些信息会非常有帮助。

即在图像识别中学习到的如何识别一张图,如何识别点,线,面等都会帮助你在放射性信息诊断的神经网络中,学习的更快或者减少学习需要的数据。

语音识别系统,输出文本,你想构建一个唤醒词或触发词检测系统。为了实现这种功能,你可以同样去除神经网络的最后一层,然后创建一个新的输出节点,但有时候,另外一个你可以做的事情是,你可以不仅仅去创建一个单一的输出,而是创建好几层新的神经网络来让你的神经网络来给你的语言唤醒检测系统打上对应的y标签。

接下来,根据你拥有的数据集规模,你可能仅对你的神经网络中新建的几层进行训练,或许你也可以重新训练其中更多的几层神经网络。

那么迁移学习什么时候有用呢?当你在你的被迁移的模型中拥有大量的数据,而你在你需要解决的问题上拥有相对较少的数据时,迁移学习是适用的。

所以总结一下:
在这两个例子中,你把一个有大量数据的问题模型,迁移到了一个相对之下仅有很少数据的问题模型中,一个迁移学习不适用的例子是:
上面提到的数据规模被颠倒过来的时候。

再总结一下:
迁移学习什么时候适用呢?
1.如果你尝试从某个任务A中学习到的信息迁移到某个任务B中,那么当任务A和任务B在有相同输入时,迁移学习才能使用。
2.必须在任务A比任务B有更多的数据时,迁移学习才能适用。因为B中的数据更有价值。
3.最后,迁移学习更加适用的场景是当你认为,任务A中的低层次特征会帮助任务B完成目标。

这就是迁移学习:一种你把从一个任务中学习到的信息迁移到另外一个不同的任务中的方式。

还有另外一种从多个任务中学习的版本叫做多任务学习,这是一种当你尝试从多个任务中学习的方式,而不是序列化的先从一个任务学习,然后迁移到另外一个任务的学习。

第八课:多任务学习

迁移过程是有先后顺序的,从任务A中学习,然后将其迁移到任务B,在多任务学习中,你多个任务一起开始,尝试让一个神经网络同时做几件事,然后每个任务将会帮助完成其他任务。

用一个神经网络来预测y。

一个伸进网络以x作为输入和输出为4维的y。
为了训练这个神经网络,你需要定义这个神经网络的损失函数。这里的L就是普通的逻辑斯蒂损失函数。
和softmax回归的区别是:不像softmax回归,它将单个标签分配给单个示例,这一个图像可以有多个标签,即每一张图片是否包含行人/信号灯/汽车/指示牌...
即你不是给图片分配一个标签,你有不同的类别,并且查看该类别是否在该图片中。这种情况下,一张图片可以有多个标签。

当你在多任务学习需要训练神经网络来使损失函数最小,因为你在建立一个单一的神经网络,使得一张图片解决四个问题。它试图告诉你每个图像中的四个对象,后或者你可以做的是训练4个独立的神经网络,而不是训练一个网络做4件事。
但是在不同的输出之间,神经网络前面的特征可以共享,那么你会发现训练一个神经网络做4件事的结果比训练完全独立的4个神经网络的结果要好,这就是多任务学习的力量。

还有一个细节:
到目前为止的算法中,好像每个图像都需要标签,其实在多任务学习中,即使一些图像只标记对象也能正常工作。对于某些缺少标记标签的数据的数据集仍然可以训练你的算法进行同时4个任务,即使有些图像只有一些标志和其他问号或不关心的项。

还有你训练算法的方式,在j从1到4中,即使一些标记缺失,但是对于求和操作,问号只是省略该项求和,即只对有标签的数据求和。

什么时候进行多任务学习有意义呢?

在以下两个条件中适用:
1.你要训练的一系列任务可以共享一些低层次特征,识别道路特征
2.这不是一条硬性规则,所以不总是存在,即每个单项任务的数据量非常相似。
为了增强多任务学习,如果你集中在任一个任务上,其他任务比单一任务合计起来有更多的数据。
3.多任务学习往往更有意义,当你训练一个很大的神经网络来使所有任务都有高准确率,所以另一种多任务学习是为每个任务单独训练一个神经网络。但是如果神经网络不够大,多任务学习与单项训练相比会损害准确率。但如果你训练了一个足够大的神经网络,那多任务学习应该不会或很少影响性能。
与你分别单独训练不同任务相比,它实际上能够提升性能。

总结:
多任务学习要比迁移学习用的少得多,我看过很多迁移学习的应用,你想通过一个小数量的数据来解决问题,你找一个有大量数据的相关问题来学习,然后转移到这个新的问题。
多任务学习用的更少,一般在你有大量任务需要完成,你可以同时训练所有这些任务。
可能一个例子是计算机视觉,在对象检测中,有许多多任务学习的应用,一个神经网络可以同时检测到一大堆对象,这比多个不同的神经网络单独的检测物体好。

总结一下:
总而言之,多任务学习使您能够训练一个神经网络来执行许多任务,这可以比您单独执行任务时提供更好的性能。
现在需要注意的是,在实践中,我发现转移学习比多任务学习更常用。所以如果你想解决一个机器学习问题,但你有一个相对较小的数据集,那么转移学习确实有帮助。
我认为多任务学习的使用频率远低于转移学习。也许唯一的例外是计算机视觉对象检测,我看到很多应用程序训练神经网络来检测许多不同的对象。这比训练单独的神经网络和检测视觉对象更有效。

多任务学习和转移学习都是您工具包中的重要工具。最后,我想继续讨论端到端的深度学习。

第九课:什么是端到端的深度学习?

近期,深度学习最令人兴奋的进展之一就是端到端深度学习的崛起,那么什么是端到端的深度学习呢?

简单来说,我们有一些数据处理系统,或者多个阶段组成的学习系统,端到端的深度学习能做的就是它可以捕获所有的阶段,并且通常可以将其替代为单个神经网络,也就是运行速度更快。

输入音频输入X

MFCC:用于提取一组特定的人工设计的音频特征算法。

提取低级特征后,应用机器学习算法从音频剪辑中查找音素。音素是声音的基本单位。

音素形成单词后串在一起,构成音频剪辑的脚本。

不同于上述由多个阶段组成的途径(管道),端到端的深度学习可以训练一个庞大的神经网络,只需输入音频片段,然后直接输出脚本。

人工智能的一个有趣的社会学效应是:在端到端的深度学习开始更好的工作的同时,有一些研究人员花费了数年的时间设计管道的各个阶段,在他们的职业生涯中都建立了管道的工程特征或者其他管道部件。

而端到端的深度学习只是从最新的训练集数据中,直接学习从x到y的映射,真的绕过了很多的中间步骤,接受这种构建人工智能的替代方法是一个挑战。

结果表明,端到端深度学习的一个挑战是它需要运行大量的数据才能取得很好的效果。
所以当你的数据集很小时,传统的管道方法实际上同样有效,甚至效果更好。

你需要一个大的数据集以便端到端的方法真正的凸显其作用。

如果你有中等量的数据,你可以采用折中的方法:输入音频,绕过这些特征,只学习输出神经网络的音素,然后继续其他阶段。因此这只是端到端学习的一个步骤,而不是彻底的端到端深度学习。

如何构建一个旋转闸门人脸识别系统?

你可以做的就是看看摄像头捕捉的图像,作为图像x,你可以试着学习一个函数,直接建立图像x和个人y的映射,事实证明,这不是最好的方法。

其中一个问题是:人们可以从不同的角度,不同而方式接近闸门,因此这不仅仅是采集原始图像,把它注入神经网络,试图推断一个人的身份。

相反,迄今为止,最好的方法,似乎是一个多步骤的方法。首先,运行一个软件检测人脸,检测到人脸以后,放大这部分,然后进行裁剪,使人脸位于图像中心,然后将其送入神经网络,试着去学习,或者估测这个人的身份。

研究者们发现,比起上一步学到的东西更有效地是把这个问题拆分为两个步骤:

1.首先找到脸
2.判断是谁的脸

第二个任务的效果会更好。

第二步具体是如何工作的呢?
当你训练网络时,输入两个图像,你的网络所做的是告诉你这两个输入的图像是不是同一个人,将员工ID进行比较厚判断是不是公司员工。

为什么第二种方式的效果更好呢?
两个原因:
1.因为这两个子问题每个和原问题相比都简单的多
2.更重要的是,你有很多数据可提供这两个子问题使用

比如第一个子问题:很多图片可以帮助你寻找人脸位置,所以你能够建立一个神经网络很好的处理第一个子问题。
同样地很多数据可以帮助你解决第二个子问题,公司拥有成千上万的人脸照片,识别是否为同一个人的训练也有上亿张图片可供使用。

然而,如果让一个模型同时学习所有步骤,只能获取很少数据(x,y),因为没有足够的数据去解决端到端的学习问题,却有足够的数据去解决子问题,所以在实际应用中,把整个问题分为两个子问题来解决会比完全使用端到端的深度学习方案有更好的性能。

另一个例子:机器翻译:
对于机器翻译来说,你可以获取很多英文和法文对应的文本对,所以端到端的深度学习在机器翻译领域非常有效。

另一个例子:通过查看儿童手掌的X光图片,来估计儿童年纪(评估儿童是否健康成长):
从图片中识别处骨骼,然后基于不同骨骼的长度,和儿童平均骨骼长度进行对比,继而估计儿童年龄。这个两步法效果很不错。
没有足够的数据来支持端到端的训练。

总结:如果端到端的方法可行,而且可以非常有效的简化系统,且不用建立很多手工设计的单个组件。
但是它不是万能的,它不总是工作。

下一节系统的讨论:什么时候采用和不采用端到端的深度学习还有如何把这些复杂的机器学习系统拼凑起来。

第十课:是否使用端到端深度学习?

端到端深度学习的优缺点:
好处:
1.让数据真正的发挥主导作用,不管映射函数,只要你有一个足够大的神经网络,都可以拟合出来。学习到数据内部的统计结构,而不是被迫去反映人的偏见。
2.所需人类动手设计的组件变的更少了,简化你的工作流程。你不需要花大量的时间动手设计特征以及中间的表示形式。

缺点:
1.需要大量的数据。你需要有关输入输出端的所有的(X,Y)数据去训练你的系统。
2.它排除了一些具有潜在用途的手工设计组件。如果你没有足够的数据,那么你的算法就不能洞悉你数据中的规律,如果你的训练集很小,那么手工设计组件的确是一条可行之路。

我认为学习算法有两个主要的知识来源:
一个是数据
另一个是你手工设计的东西(算法组件、特征或者其他东西)

所以当你在构建一个机器学习系统,并考虑是否使用端到端的深度学习时,我认为关键的问题是:
你是否有足够的数据去学习出具有能够反映出x到y所需复杂度的方程,没有关于这个表达的正式的定义,关于所需的复杂度,但是从直观上讲,找到人脸,骨骼勾画不是很难,但是直接通过骨骼退出年龄就比较复杂了。

一个复杂的例子:
自动驾驶:
将汽车前面的图像输入作为x,检测行人或者车辆,然后为你的车辆规划道路,通过俯视图,生成正确的转角来沿路径行驶,正确的加速和刹车指令。

但其实这些不是深度学习实现的,而是运动计划。

当你想用机器学习或深度学习来学习一些单独的组成部分,当应用监督式学习,你应该认真选择一种从X到y的映射类型,根据你的任务是否能得到大量数据。

对于无人驾驶,得到图片,推出驾驶方向。根据数据的可用性,和我们能够使用神经网络学习的东西的类型,这不是一种有希望的方法。

以上就是端到端的深度学习,有些时候它工作的很好,但是你也要注意何时使用。我相信你已经变得更聪明、更具战略性!并能更好的做出正确的优先级决策来进一步帮助你完成你的机器学习项目。

你可能感兴趣的:(不适配的的训练/开发/测试集)