误差分析
人工检查你的算法犯的错误,也许可以让你了解接下来应该做什么,这个过程称为误差分析
- eg
假设正在调试猫分类器,然后取得了90%准确率,相当于10%的误差,这离希望的目标还很远。看了算法分类错误的例子,注意到算法将一些狗分类成猫。所以这里考虑是否做 一个项目专门处理狗,这个项目可能花几个月时间才能将分类狗的算法做好,在狗图片上犯更少的错误,与其做这个项目花几个月时间而且结果未知。
这里有个误差分析流程,可以让你知道这个方向是否值得努力。
1.收集一下比如100个错误标记的开发集例子,查看开发集里面有多少错误 标记的例子是狗。假设你的100个错误标记例子中只有5%是狗,这意味着100个例子,在典型的100个出错例子中,即使你完全解决了狗的问题,也只能修正这100个错误中的5个;现在假设发生了另外一件事,100个错误标记的开发集例子,实际有50张都是狗,现在花时间解决狗的问题可能效果就很好,这种情况下如果解决了狗的问题,那么你的误差就可能从10%下降到5%了。通过人工查看就可以知道你改进的方向有多少价值。
在做误差分的时候,也可以同时并行评估几个想法:
清楚标注错误数据
如果你发现你的数据有一些标记错误的例子,首先我们来考虑训练集,事实证明深度学习算法对于训练集中的随机误差很鲁棒,只要你标记出错的例子离随机误差不太远。如果误差足够随机,那么放着这些误差不管也没问题,而不要花太多时间修复他们。只要总数据量足够大,实际误差可能不会太高。深度学习算法对随机误差具有鲁棒性,但对系统误差就没有鲁棒性了,所以比如说如果做标记的人一直把白色的狗标记成猫,
那就成问题了,你的分类器就会把所有白色的狗都分类为猫。
快速搭建第一个系统
应该快速建立你的第一个系统原型,然后快速迭代
在不同的划分上进行训练和测试
介绍一些微妙的做法来处理训练集和测试集存在差异的情况。
假设在开发一个手机应用,用户会上传他们用手机拍摄的图片,你想识别用户从应用中上传的图片是不是猫。所以现在有两个数据来源:1.你真正关心的数据分布,用户从应用中上传的图片2.另一个数据来源就是从网页直接下载。如果你的用户数量不是很多,只收集到10000张用户上传的图片,但通过网页下载你也许可以下载超过20万张,而你真正关心的是最终系统处理来自应用程序的图片效果好不好。
1.你可以做的是,将两组数据合并在一起,可以把21万张图片随机分配到训练,开发,测试集中。我们假设你已经确定开发集和测试集各包含2500个样本,所以你的训练集有205000个样本。现在这么设置数据集有一些好处也有一些坏处。
- 好处在于你的训练集、开发集和测试集都来自于同一分布这样更好管理
- 坏处在于,2500测试集只有119张来自于手机上传
2.开发集和测试集都是手机图,训练集为20万张网络图,以及5000张手机图
- 现在的好处就是你瞄准的目标就是你想要的目标
-
坏处就是你的训练集和你的开发集、测试集分布不一致
但第二种划分能给你长期带来更好的系统性能
不同数据分布的偏差和方差
估计学习算法的偏差和方差真的可以帮你确定接下来应该优先做的方向,但是,当你训练集来自和开发集、测试集不同分布时,分析偏差和方差的方式可能就不一样了。
我们继续以猫分类器作为例子。
要进行误差分析,你通常需要看训练集,也要看看开发集误差。
我们要看的关键数据,人类水平误差,训练误差,训练-开发误差,开发集误差,测试集误差。训练-开发集与训练集来自相同数据分布,但没有用作训练。
定义一个新的数据train-dev set 从训练集中抽取数据,和训练集数据来自同一个数据分布,但是不用于训练数据.分别将分类器在训练集/训练-开发集/开发集上运行,获取其准确率信息
假如在训练集上误差为1%,在训练-开发集上误差为9%,在开发集上误差为10%
- 分类器在训练集和训练开发集上误差差距较大,这表明算法没有识别没有看到过的数据,这表明分类器本身方差较大
- 分类器在训练-开发集和开发集上误差差距不大,表明算法误差的差距不是主要由于数据 分布不一样 导致的
假如在训练集上误差为1%,在训练-开发集上误差为1.5%,在开发集上误差为10%
- 分类器在训练集和训练开发集上误差差距较小,这表明分类器本身方差不大
- 分类器在训练-开发集和开发集上误差差距很大,表明算法误差的差距主要由于 数据不匹配 导致的
定位数据不匹配
如果你的训练集与开发集、测试集来自不同数据分布,且误差分析显示你有一个数据不匹配问题,这个问题没有系统的解决方案,但有一些仍可以尝试。
1.尝试弄清楚开发集和训练集到底有什么不同,例如语音识别,你可能会发现很多开发集样本噪音很多,有很多汽车噪音,这是你的开发集和训练集差异
2.或者你可以收集更多类似你的开发集合测试集数据。
所以比如说如果你发现车辆背景噪音是主要误差来源,那么你可以模拟车辆噪声数据。或者你发现很难识别街道号码,也许你可以有意识收集更多人们说数字的音频数据加到你的训练集里。
人工合成数据:可以快速制造更多的训练数据。
人工合成数据有一个潜在问题:
比如说你在安静的背景里录得10000小时音频数据,然后比如说你只录了一小时车辆背景噪音。那么你可以这么做,将这1小时汽车噪音回放10000次并叠加到在安静的背景下录得的10000个小时数据,如果你这么做了,人听起来没有问题,但是有一个风险,有可能你的算法对这1小时汽车噪音过拟合。人工数据合成的挑战在于,人耳是无法分辨的这10000个小时听起来和那一个小时没什么区别,所以最后你可能会制造出这个原始数据很少的,在一个小得多的空间子集合成的训练数据,但你自己没有意识到。
迁移学习
深度学习中,最强大的理念之一就是有的时候神经网络可以从一个任务中习得知识并将这些知识应用到另一个独立的任务中。比如你已经训练好一个神经网络能够识别像猫这样的对象,然后使用那些知识或者部分习得的知识去帮助你更好地阅读X射线扫描图,这就是迁移网络。
假设你已经训练好一个图像识别神经网络,首先用一个神经网络,在(x,y)对上训练,其中x是图像,y是对象的标签.
现在把这个神经网络拿出来,将其适应(迁移)到不同任务中所学到的知识,比如放射科诊断:
- 把神经网络最后的输出层删除
- 进入到最后一层并将其权重删除
- 为最后一层重新赋予随机权重
- 然后将神经网络放在放射诊断数据上训练
经验规则:
- 如果进行迁移学习的数据量比较小,只需要重新训练最后一两层权重,但是如果进行迁移学习的数据量比较大,建议重新训练整个神经网络。
- 预训练(pre-training): 如果重新训练所有神经网络层,那么在图像识别数据的初期训练阶段,我们称这个过程为:预训练
- 微调(fine tuning): 在预训练后的模型上放入迁移学习的数据进行训练,这个过程称为:微调
迁移学习的好处在于,以放射科图像检测的迁移学习为例 在预训练的过程中,我们学到了一些图像识别中低层次特征,很多结构信息,图像形状的信息,点,线,面的特征.-- 边缘检测(detecting edges),曲线检测(的tecting curves),阳性对象检测(detecting positive objects) 应用或迁移到放射科诊断上来.从非常大的图像识别数据库中习得的这些能力,会有助于你的学习算法在放射科诊断做的更好.
例子
假设你已经训练出一个语音识别系统(speech recognition system),现在x是音频(audio)或者音频片段输入(audio snippets),y是听写文本(transcript). 我们要使用这个系统"迁移学习"建立一个"唤醒词"的系统.
- 你可能需要去掉神经网络的最后一层,然后加入新的输出节点.但有时也可以不止加入一个新节点,或者甚至往你的神经网络加入几个新层.然后把唤醒词检测问题的标签"Y"喂进去训练.
- 这取决于你的训练数据的多少,你可能只需要重新训练网络的新层,也许你需要重新训练网络中更多的层.
迁移学习什么时候是有意义的
-
迁移来源问题你有很多数据,但迁移目标问题你没有那么多数据.
-
例如:假如在图像识别任务中你有100W样本,数据量相当多,你可以学习低层次特征,可以在神经网络的前几层学到如何识别很多有用的特征.
- 但是对于"放射科任务",也许你只有100个样本,所以你可以将图像 识别预测的知识迁移到"放射科识别任务"中,即使你的放射科数据很少.
-
例如:在"语音识别"任务中,也许你已经有1W小时数据,训练过你的语言识别系统.所以你已经从这1W小时数据中学到了很多人类声音的特征.
- 但是对于"触发字检测",也许你只有1小时数据,所以这数据太小,不能用来拟合很多参数.
- 所以这种情况下,你需要预先学到很多人类声音的特征,人类语言的组成部分等等知识,可以帮你建立一个很好的唤醒字检测器(wake word detector).即使你的数据集相对较小.
总结为什么要迁移学习:
- 如果你想从任务A迁移一些知识到任务B,当任务A和任务B都有相同的输入X时,迁移学习是有意义的:在第一个例子中,输入X都是图片;在第二个例子中X都是声音音频.
- 当任务A的数据比数据B多得多时,迁移学习意义更大.
所有这些假设的前提都是,你希望提高任务B的性能.因为任务B的每个数据更有价值,对于任务B来说.通常任务A的数据量必须大得多,才有帮助。 - 如果你觉得任务A的低层次特征,可以帮助任务B的学习,那迁移学习更有意义一些
多任务学习
在迁移学习中,你的步骤是串行的,你从任务A里学到知识然后迁移到任务B中.在多任务学习中,你是同时开始学习的,试图让单个神经网络同时做几件事情,然后希望这里的每个任务都能帮到其他所有任务.
无人车例子
假设你正在研发无人驾驶车辆,那么你的无人驾驶车可能需要同时检测不同的物体.(行人,车辆,停车标志,交通灯...)这里我们先检测 这4个。这里将不是一个标签 y(i)而是4个标签。所以y(i)是一个41向量。从整体来看训练集标签。我们将训练集的标签水平堆叠起来,矩阵Y是一个4M的矩阵
需要识别的物体假设即为上述讨论的四个,则最后一层设置4个神经元,一个4维向量,分别表示对"行人,车辆,停车标志,交通灯"的预测.
最后一层第一个神经元就是我们想预测途中有没有行人 ,第二个输出节点预测有没有车等等 。
现在需要定义神经网络的损失函数,对于一个输出y^是一个 4维向量 。
其中多任务学习Loss function 也有相应的变化,对于多任务学习:
其中与之前例子最大的不同之处在于需要对检测的多任务目标进行分别比较并相加∑4j=1。
这与softmax回归的主要区别在于,softmax回归将单个标签分配给单个样本,而这张图可以有很多不同的标签,所以不是说每张图都只是一张行人图片、汽车图片、停车标志图片、或者交通灯图片,多个物体可能出现在同一张图片里。你需要遍历所有的物体类型有没有出现在图中。如果你训练了一个神经网络,需要最小化这个成本函数,你做的就是多任务学习,因为你现在做的是建立单个神经网络,观察每张图然后解决四个问题,系统试图告诉你每张图里面有没有这四个物体。另外你也可以训练四个不同的神经网络,而不是训练一个网络做四件事情,但神经网络一些早期特征在识别不同物体时都会用到,然后你会发现训练一个神经网络做四件事情会比训练四个完全独立的神经网络分别做四件事性能要更好。
什么时候多任务学习有意义?
- 你训练的一组任务可以共用低层次特征.例如对于无人驾驶车的例子,识别的物体都是道路上的标志.
- 每个任务中学习的数据量很相近.假如你要识别100个任务,每个任务大概有1000个样本,所以如果你专注加强单个任务的性能,你只有1000个样本去训练这个任务,这是100项任务之一,但是通过其他99项任务的训练, 这些加起来一共有99000个样本,这可能大幅提升算法性能,可以提供很多知识来增强这个任务的性能
- 如果你训练一个 足够大的神经网络,多任务神经网络和多个不同的单任务神经网络效果基本一致(即单独训练识别行人,单独识别交通标识牌...的神经网络).
- 如果你训练一个 足够大的神经网络,多任务神经网络和多个不同的单任务神经网络效果基本一致(即单独训练识别行人,单独识别交通标识牌...的神经网络).
一般来说, 迁移学习比多任务学习运用更多 ,但是在 计算机视觉-物体检测 中有大量应用到多任务学习,并且比分别训练不同的神经网络检测物体效果更好.
端到端深度学习
以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理. 端到端学习就是忽略中间的过程用单个神经网络代替它.
Speech recognition example
你的目标是输入X,比如说一段音频,目标是将其映射到Y,就是这段音频的听写文本.
- 传统阶段上,语音识别需要很多阶段的处理,首先你要提取一些特征,一些手工设计的音频特征,例如使用MFCC-用来从音频提取一组特定的人工设计的特征,在提取一些低层次的特征之后,你可以使用 机器学习算法 在音频片段中找到音位,音位是声音的基本单元.例如Cat这个词由三个音位构成,算法将Cu-Ah-Tu三个音位提取出来,然后将音位串在一起构成独立的词.然后你将词串起来构成音频片段的听写文本。
- 相比于传统的流水线形式的算法,端到端的深度学习即是你训练一个巨大的神经网络, 输入就是一段音频,输出直接是听写文本 .其直接绕过了传统流水线机器学习系统的很多步骤。
但是需要注意的是,你可能需要大量数据才能让系统表现得更好. 例如当你只有3000h的语音数据时,原先的机器学习系统会表现得更好,但是当你有10000h的语音数据或者是1000000h的语音数据时,端到端方法就开始体现出优势了. 即小规模数据时流水线方式表现更好,但是当大数据集时,端到端的学习效果会更好.
倘若是中等数量级别的数据,我们也可以取中间的方法,绕过特征提取的环节直接输出特征提取得到的音位
Face recognition example
当仔细观察人脸识别系统中的相机所得相片会发现, 人可以从各种角度靠近门禁系统,所以相机得到的照片人所在的位置不固定,而且面部出现的位置和大小也各有差别 ,例如当人比较靠近相机时,脸会比较大,人脸比较远离相机时,脸会比较小.
所以系统识别时,不是直接将相机所得图片喂到神经网络中,而是 一个多步方法,先检测出相片中的人脸,找到人脸位置.然后放大图片并裁剪图片使人脸居中显示,将此图片放到网络中,让网络去学习或者估计人脸的身份。
研究人员发现,这个问题还可以分解为两个更简单的步骤:
- 弄清人脸在哪里
- 看着脸,弄清楚这是谁
对于辨认人脸的步骤,系统已经储存了公司每个员工的照片信息, 我们要做的是将检测到的人脸与数据库中的人脸进行比较
这个例子告诉我们,即使你没有足够的数据来进行端到端学习,但是有足够的数据来进行子任务1和子任务2.将其拆分为两个步骤更好。
Machine translation
传统上,机器翻译系统也有一个很复杂的流水线:英文--得到文本--文本分析--提取特征-...-中文。
现在英文到中文的翻译已经有很多数据对,所以目前端到端的深度学习在机器翻译领域非常好用
Estimating child's age
通过观察一个孩子手部的x光照片,估计一个孩子的年龄.
- 传统上,拍摄x光--分割出每一块骨头--分辨出骨头所在部位--查表看儿童对应段骨头的平均长度--估计儿童的年龄.
但是这个例子还不能使用端到端的方式去训练这个任务,因为我们没法获得足够多的数据去训练这个任务.
是否要使用端到端学习
优点和缺点
image.png优点
- 让数据自己说话
- 如果你有足够多的(x,y)数据,不管从x到y最合适的函数映射是什么,如果你训练一个足够大的神经网络,希望这个神经网络能够自己搞清楚.相比于传统的机器学习方法,更能够捕获数据中的任何统计信息,而不是引入人类的成见.
- 例如举个例子:在语音识别领域,早期的识别系统有音位的概念--就是基本的声音识别单元.NG认为音位是人类语言学家生造出来的,NG认为音位实际是语音学家的幻想.用音位描述也许可行,但是 不要强迫你的学习算法以音位为单位进行思考,如果你让你的学习算法学习它想学习的任意的表示方式而不是使用你的学习算法使用音位作为表示方式,那么整体表现可能会更好.
- 所需手工设计的组件更少
- 能简化你的设计工作流程,你不需要花太多时间去手工设计功能,手工设计这些中间表示方式.
缺点
- 需要大量的数据
- 它排除了可能有用的手工设计组件
- 机器学习研究人员一般都比较鄙视手工设计的东西,但是如果你的数据量不够的话.你的学习算法没办法从很小的训练集数据中获得洞察力,所以手工设计的组件在这种情况下是把人类知识直接注入算法的途径.这有时候并不是一件坏事,有时候非常有效.
- NG认为机器学习系统有两个重要的知识获取来源,一个是数据另一个是人工设计的东西,可能是组件,功能或者其他的东西.
-
当你有成吨的数据时,手工设计的东西就不太重要了,但是你没有太多的数据时,构造一个精心设计的系统实际上可以将人类对这个问题的很多认识直接注入到问题里.
key question
是否使用端到端的算法取决于问题:你是否有大量的的数据能够使系统直接学到从x到y足够复杂的函数.
网友评论