人工检查你的算法犯的错误,也许可以让你了解接下来应该做什么,这个过程称为误差分析
假设正在调试猫分类器,然后取得了90%准确率,相当于10%的误差,这离希望的目标还很远。看了算法分类错误的例子,注意到算法将一些狗分类成猫。所以这里考虑是否做 一个项目专门处理狗,这个项目可能花几个月时间才能将分类狗的算法做好,在狗图片上犯更少的错误,与其做这个项目花几个月时间而且结果未知。 这里有个误差分析流程,可以让你知道这个方向是否值得努力。 1.收集一下比如100个错误标记的开发集例子,查看开发集里面有多少错误 标记的例子是狗。假设你的100个错误标记例子中只有5%是狗,这意味着100个例子,在典型的100个出错例子中,即使你完全解决了狗的问题,也只能修正这100个错误中的5个;现在假设发生了另外一件事,100个错误标记的开发集例子,实际有50张都是狗,现在花时间解决狗的问题可能效果就很好,这种情况下如果解决了狗的问题,那么你的误差就可能从10%下降到5%了。通过人工查看就可以知道你改进的方向有多少价值。
在做误差分的时候,也可以同时并行评估几个想法:
如果你发现你的数据有一些标记错误的例子,首先我们来考虑训练集,事实证明深度学习算法对于训练集中的随机误差很鲁棒,只要你标记出错的例子离随机误差不太远。如果误差足够随机,那么放着这些误差不管也没问题,而不要花太多时间修复他们。只要总数据量足够大,实际误差可能不会太高。深度学习算法对随机误差具有鲁棒性,但对系统误差就没有鲁棒性了,所以比如说如果做标记的人一直把白色的狗标记成猫, 那就成问题了,你的分类器就会把所有白色的狗都分类为猫。
应该快速建立你的第一个系统原型,然后快速迭代
介绍一些微妙的做法来处理训练集和测试集存在差异的情况。 假设在开发一个手机应用,用户会上传他们用手机拍摄的图片,你想识别用户从应用中上传的图片是不是猫。所以现在有两个数据来源:1.你真正关心的数据分布,用户从应用中上传的图片2.另一个数据来源就是从网页直接下载。如果你的用户数量不是很多,只收集到10000张用户上传的图片,但通过网页下载你也许可以下载超过20万张,而你真正关心的是最终系统处理来自应用程序的图片效果好不好。
1.你可以做的是,将两组数据合并在一起,可以把21万张图片随机分配到训练,开发,测试集中。我们假设你已经确定开发集和测试集各包含2500个样本,所以你的训练集有205000个样本。现在这么设置数据集有一些好处也有一些坏处。
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是对象的标签. 现在把这个神经网络拿出来,将其适应(迁移)到不同任务中所学到的知识,比如放射科诊断:
经验规则:
迁移学习的好处在于,以放射科图像检测的迁移学习为例 在预训练的过程中,我们学到了一些图像识别中低层次特征,很多结构信息,图像形状的信息,点,线,面的特征.-- 边缘检测(detecting edges),曲线检测(的tecting curves),阳性对象检测(detecting positive objects) 应用或迁移到放射科诊断上来.从非常大的图像识别数据库中习得的这些能力,会有助于你的学习算法在放射科诊断做的更好.
假设你已经训练出一个语音识别系统(speech recognition system),现在x是音频(audio)或者音频片段输入(audio snippets),y是听写文本(transcript). 我们要使用这个系统"迁移学习"建立一个"唤醒词"的系统.
总结为什么要迁移学习:
在迁移学习中,你的步骤是串行的,你从任务A里学到知识然后迁移到任务B中.在多任务学习中,你是同时开始学习的,试图让单个神经网络同时做几件事情,然后希望这里的每个任务都能帮到其他所有任务.
假设你正在研发无人驾驶车辆,那么你的无人驾驶车可能需要同时检测不同的物体.(行人,车辆,停车标志,交通灯...)这里我们先检测 这4个。这里将不是一个标签 y(i)而是4个标签。所以y(i)是一个41向量。从整体来看训练集标签。我们将训练集的标签水平堆叠起来,矩阵Y是一个4M的矩阵
需要识别的物体假设即为上述讨论的四个,则最后一层设置4个神经元,一个4维向量,分别表示对"行人,车辆,停车标志,交通灯"的预测.
最后一层第一个神经元就是我们想预测途中有没有行人 ,第二个输出节点预测有没有车等等 。 现在需要定义神经网络的损失函数,对于一个输出y^是一个 4维向量 。 其中多任务学习Loss function 也有相应的变化,对于多任务学习:
其中与之前例子最大的不同之处在于需要对检测的多任务目标进行分别比较并相加∑4j=1。 这与softmax回归的主要区别在于,softmax回归将单个标签分配给单个样本,而这张图可以有很多不同的标签,所以不是说每张图都只是一张行人图片、汽车图片、停车标志图片、或者交通灯图片,多个物体可能出现在同一张图片里。你需要遍历所有的物体类型有没有出现在图中。如果你训练了一个神经网络,需要最小化这个成本函数,你做的就是多任务学习,因为你现在做的是建立单个神经网络,观察每张图然后解决四个问题,系统试图告诉你每张图里面有没有这四个物体。另外你也可以训练四个不同的神经网络,而不是训练一个网络做四件事情,但神经网络一些早期特征在识别不同物体时都会用到,然后你会发现训练一个神经网络做四件事情会比训练四个完全独立的神经网络分别做四件事性能要更好。
一般来说, 迁移学习比多任务学习运用更多 ,但是在 计算机视觉-物体检测 中有大量应用到多任务学习,并且比分别训练不同的神经网络检测物体效果更好.
以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理. 端到端学习就是忽略中间的过程用单个神经网络代替它.
你的目标是输入X,比如说一段音频,目标是将其映射到Y,就是这段音频的听写文本.
当仔细观察人脸识别系统中的相机所得相片会发现, 人可以从各种角度靠近门禁系统,所以相机得到的照片人所在的位置不固定,而且面部出现的位置和大小也各有差别 ,例如当人比较靠近相机时,脸会比较大,人脸比较远离相机时,脸会比较小. 所以系统识别时,不是直接将相机所得图片喂到神经网络中,而是 一个多步方法,先检测出相片中的人脸,找到人脸位置.然后放大图片并裁剪图片使人脸居中显示,将此图片放到网络中,让网络去学习或者估计人脸的身份。 研究人员发现,这个问题还可以分解为两个更简单的步骤:
这个例子告诉我们,即使你没有足够的数据来进行端到端学习,但是有足够的数据来进行子任务1和子任务2.将其拆分为两个步骤更好。
传统上,机器翻译系统也有一个很复杂的流水线:英文--得到文本--文本分析--提取特征-...-中文。 现在英文到中文的翻译已经有很多数据对,所以目前端到端的深度学习在机器翻译领域非常好用
通过观察一个孩子手部的x光照片,估计一个孩子的年龄.
但是这个例子还不能使用端到端的方式去训练这个任务,因为我们没法获得足够多的数据去训练这个任务.
image.png
是否使用端到端的算法取决于问题:你是否有大量的的数据能够使系统直接学到从x到y足够复杂的函数.