机器学习策略2

进行误差分析

当你的学习算法的性能达到理想性能的90%时,找不到改进的方法,可以使用人工误差分析的方法来分析学习算法的瓶颈。

假设有一个猫分类器,它的分类精度达到90%了,有10%的误差,可以分析这10%的误差,看看什么产生这10%的误差。分析开发集中被错误标记的样本,发现狗被错误识别为猫。我们可能想新建一个项目,用来识别被错误识别的狗的图片。花费好几个月的时间来实现新的项目是否对猫分类器有大的改进呢?

我们来统计一下开发集中错误识别的样本。如果数量太多,可以选取足够的样本来统计,比如1000个误识别样本中随机抽取500个样本。如果狗被错误识别为猫的样本占5%,改进这个问题,误差只减少了0.5%,这个对改进分类器没有大的裨益。如果狗被错误识别为猫的样本占50%,可以改进这个问题能够大大提高分类器的性能。

从上面的例子可以看出,在进行人工误差分析时,要找到影响学习算法性能的最大的阻碍,并解决它。在进行人工错误分析时,可以做一个表格,统计各个因素对学习算法的影响。比如在分析猫分类器的误差时,制作下面的表格
机器学习策略2
统计错误识别的样本,比如第一个样本是狗,结果被错误识别为猫,在狗这一列做个标记。错误的原因还可能是狮子豹子之类的猫科动物误识别为猫,也可能是图片太模糊了。表格就是统计这些原因出现的次数,并计算占的百分比。在对每个错误识别的样本进行分析时,可以记录其他不在表格中出现的原因,比如图片的环境是在下雨,图片应用了滤镜。当发现某种原因出现次数较多时,可以在表格中添加表示这个原因的一列。最后看看各种原因占的比例,比如图片模糊的原因占61%,把其他猫科动物识别为猫的原因占43%,而其他原因只占很少比例,我们就可以把工作重心放在解决图片模糊和误识别其他猫科动物的问题上。

改正标记错误的数据

数据集中可能有人工错误,比如样本的标签y的值设置错误。在训练集中出现随机错误,y的值是随机错误,对学习算法来说鲁棒性更好。如果是系统错误,y的某个类标记错误,那么学习出来的模型是错误的。

在开发集和测试集中,如果随机错误对评估学习算法的影响不大,可以不用管随机误差。但是如果随机错误严重影响了对学习算法的评估,那么必须纠正随机错误。

举一个例子说明什么时候要改正标记错误的数据。在人工误差分析中,如果分类器的误差为10%,错误标记的样本在识别错误的样本中占6%,那么因为标记错误导致误差占误差的6%10%=0.6%,其他原因占误差的9.4%,这时可以忽略标签错误的数据的影响。如果分类器的误差为2%,因为错误标记导致误差占误差的0.6\%,其他原因占误差的1.4%,这时就需要改正标记错误的数据。

改正标记错误的数据要注意以下问题。首先开发集和测试集的数据要同时改正,确保它们的数据来自同一数据分布。接着考虑标记错误,分类时却分类正确的样本。

快速搭建你的第一个系统,并进行迭代

当你要搭建一个全新的机器学习项目,你应该要快速地搭建第一个系统,并开始迭代。具体地说,首先,设置好开发/测试集和指标。接着快速搭建好原型系统。使用指标来评估原型系统,通过偏差/方差分析和人工分析系统的问题,找到下一步的优化方向。通过不断地优化来完善系统。

在不同的分布上进行训练和测试

我们可能会碰到搜集到的数据来自不同分布的情况。比如为猫分类器搜集的数据来自两个不同的分布,一个来自用户上传的猫的图片,这些图片可能是模糊的,猫在图片中位置不是正中的,一个来自网上的猫的图片,这些图片清晰度高,拍摄角度很好。来自网上的图片有200000张,而来自用户的图片有10000张。这些数据分布不平衡,用户的图片很少,但是猫分类器最终用来对用户上传的图片进行分类。这就有一个难题了,怎么划分这些数据为训练集,开发集和测试集呢?

第一种方法,把所有的数据混合起来,然后用205000张图片作为训练集,开发集和测试集分别使用2500张图片。在开发集和测试集中平均用户上传的图片只占5%,评估得到的结果不能很好地反映分类器对用户上传的图片的分类效果。所以这种方法是不推荐的。

第二种方法是,把来自网上的图片和来自用户上传的图片的一半,即5000张图片作为训练集,剩下的5000张图片划分为开发集和测试集。这样,开发集和测试集评估的就是分类器对用户上传图片的分类性能。

对于一个车载导航产品——语音识别后视镜应用,用户只需要说出唤醒词和目的地址,车载导航就会自动查询导航数据并开始导航。要训练这个产品的语音识别系统,需要许多语音数据。训练集来自其他语音数据,有500000份数据。系统的目标数据——唤醒词语音和地址语音只有20000份数据。和上一个例子类似,可以把目标数据划分为开发集和测试集。如果开发集和测试集需要的数据不用那么多,可以把目标数据的一半划分到训练集,剩下的划分为开发集和测试集。

不匹配数据分布的偏差和方差

当训练集中的数据加入与开发集不同分布的数据,其偏差和方差的分析与普通的分析不同。

例如,如果训练误差和开发误差相差很大,很难确定是因为过拟合问题造成的,还是因为开发集中有很多分类器没有训练过的数据,即数据不匹配造成的。为了解决这个问题,设置一个训练-开发集,它的数据分布与训练集的一样,就是从训练集中划分一部分数据出来作为训练-开发集,但是不用来训练。训练-开发集可以评估分类器对训练集的拟合程度。然后对各种误差进行分析。

假设人类水平误差是0%,训练误差是1%,训练-开发误差是9%,开发误差是10%。训练误差和训练-开发误差相差很大,说明学习算法出现过拟合。如果训练-开发误差变为1.5%,那么训练-开发误差和开发误差相差很大,说明这是数据不匹配造成的。

在误差分析中,假设在训练数据中,估计人类水平的误差是4%,训练误差是7%,训练-开发误差是10%。然后统计在目标数据中的误差,人类水平误差是6%,训练误差是6%(只统计训练集中的目标数据的分类结果),开发/测试误差是6%。这里开发/测试误差反而比训练误差小,可能是因为目标数据更容易分类。不同的人类水平误差说明估计的结果不是很正确。从这些数据来看,虽然训练集的误差较大,但是分类器在目标数据中的分类效果已经和人类水平一样表现好。

数据不匹配

开发集数据和训练集数据不匹配,造成训练-开发误差和开发误差相差很大。目前没有什么系统性的解决方法。通常做法是人工分析开发集数据和训练集数据的差别在哪里,然后减少这些差别。

比如在语音识别的车后镜应用,训练过程出现数据不匹配问题。通过分析发现,开发集的语音有许多开车环境的背景噪音。解决方法是减少开发集和训练的差别,使用人工语音合成的方法,把车噪音与其他语音数据合成新的训练集数据。

人工合成数据的方法需要注意的是,合成的数据不要是所有可能数据的部分子集,会导致分类器在这部分子集中过拟合。比如人工合成车图片,如果只合成几十种车的图片,而世界上有许多类型的车,这几十种车只是其中的一部分。用这几十种车的图片训练分类器,会使这个分类器只认识这几十种车,不认识其他种类的车。

迁移学习

深度学习中,最强大的理念之一就是:有时候,神经网络在一个任务中学习到的知识,可以将这些知识应用到另一个独立的任务中,这叫做迁移学习。

假设你已经训练好一个图像识别神经网络,可以识别猫或狗之类的动物,然后把这个神经网络拿来,把最后一层去掉,换成新的一层,把新的最后一层的参数随机初始化,其他参数不变,然后使用X射线扫描图数据来训练这个新的神经网络,训练得到的神经网络也可以很好地识别X射线扫描图。这个过程如下图所示。
机器学习策略2
为什么可以这样呢?因为动物识别和X射线扫描图识别同样是图像识别,神经网络前面的层都是用来识别图像的边缘特征等基础特征,这些基本特征识别的知识可以共用。

迁移学习一般用于训练数据比较少的情况。比如X射线扫描图只有100张,而图像识别的数据有1000000张,这时就可以使用迁移学习。先用图像识别的数据训练好神经网络,这叫做预训练。接着修改神经网络最后一层或几层,也可以添加多层,只要保持神经网络的前面的层不变,这叫做微调,然后使用目标数据进行训练。这样做,即使目标数据的比较少,训练处理的神经网络表现效果也可以很好。当然,如果X射线扫描图有1000张,而图像识别数据只有100张,那就不要使用迁移学习了,这时候使用迁移学习没有什么意义,但即使用了也没很大的坏处。

那么什么时候使用迁移学习有意义?假设需要把任务A的知识迁移到任务B,那么需要

  • 任务A和任务B要有相同的输入X,比如任务A和任务B的输入都是图片,
  • 任务A的数据比任务B的数据多很多,
  • 任务A的底层特征对任务B来说很有用,这是最重要的一点。

多任务学习

多任务学习就是一个神经网络需要同时处理几个任务。

在自动驾驶系统中,需要对一张图片同时进行一下几个任务,识别图片中是否有行人,是否有车,是否有停止标志,是否有交通信号灯。假设一个样本i中同时有车和停止标志,那么样本的标签是y(i)=[0110]。我们设计的神经网络可以是这样的
机器学习策略2
最后一层分别预测图片是否有行人,是否有车,是否有停止标志,是否有交通信号灯。神经网络的损失函数为

l(y^,y)=j=14l(y^j,yj)

其中
l(y^j,yj)=yjlog(y^j)(1yj)log(1y^j)

在对多任务样本进行标记时,可能只对某些任务进行标记。比如说,图片中有行人和车,就标记图片中有人和车,至于是否有停止标志和交通信号灯,就没有进行标记,得到的标签集如下

Y=[110?0111??1???0?]

计算损失函数时,只需要计算有标签的,没有标签的(写着?的)就不用计算。

什么时候使用多任务学习有意义呢?

  • 任务有可以共享的底层特征有利于同时训练多个任务。
  • 通常每种任务的数据很相似可以使用多任务学习。如果有100个任务,每个任务的数据有1000份。为每个任务单独训练一个神经网络时只有1000份训练数据。使用多任务学习,每个任务可以有100000份数据,更多的数据可以改进学习算法的性能。
  • 多任务中,训练一个足够大的神经网络,可以比训练多个神经网络的表现好。

端到端深度学习

之前有一些学习系统,它们有多个阶段的处理,端到端深度学习就是忽略所有这些阶段,用单个神经网络来代替它。

来看一些例子:语音识别
机器学习策略2
以前的语音识别系统需要多个阶段的处理。首先,把音频数据转换成特征数据,接着使用机器学习来学习发音特征,然后把发音组合识别成单词,最后识别出语音的内容。而端到端深度学习可以直接从音频数据识别内容。

端到端深度学习简化了学习系统的学习阶段,可以方便快速地实现一个学习系统。

虽然出现了端到端深度学习,但是以前的多个阶段的学习系统并不是没有存在的意义。当我们的数据集数据比较少时,比如语音识别的数据只有3000个小时,多个阶段的学习系统的表现效果比端到端深度学习系统要好。如果语音识别的数据有10000-100000个小时,端到端学习系统可以表现得更好。端到端学习只有在训练数据很多的情况下才表现的更好。

端到端深度学习的表现效果不是总能得到很好的结果,有时候把过程分成简单的几步比一步到位的效果更好。比如人脸识别的门禁系统,识别的过程分成两步,首先识别图像中的人脸位置,然后识别人脸的身份,比直接从图像中识别人脸身份的效果要好。

端到端的优点:

  • 让数据说话。让算法自己决定如何去学习,而不是强迫算法按照人类的思维来学习,学习的效果可能更好。
  • 减少人工设计的组件,简化了人工设计的流程。

缺点:

  • 需要大量的数据。
  • 丢掉了有用的人工设计的组件。