第3次课结构化机器学习 - week2 机器学习策略(2)

1. 进行误差分析

误差分析的过程,在开发集错分类的样本中随机抽一定数量的样本,观察这些样本错分原因或者类型,这些就是下一步该做的,同时统计这些原因或者类型所占比例,通过这个比例就可以确定这些想法的潜力或者提升上限。

举个例子

对于识别猫的图片,算法的准确率只有90%,也就是误差有10%,这是一个很高的误差,检查了错分类的图片,发现有很多狗的图片,那么可以做接下来的工作:

  1. 搜集更多的狗的图片
  2. 设计处理狗图片的算法

这样子或许可以让猫图片分类器的效果更好。但是设计这个处理狗图片的算法可能需要几个月的时间,但是不知道对结果有没有,或者效果大不大。

  • 误差分析:

手动分析其中随机挑选的100个错分例子,看看里面有多少是因为狗的图片的原因而被错分,如果只有5张,也就是说就算你完全解决了这个狗的问题,也只能把误差减少到9.5%。如果是50张,那就有必要去解决这个问题了。这个比例可以认为是该误差提升的潜力或者上限。

同时评估多个想法

  1. 修复那些被认为是猫的狗的图片
  2. 修复那些像猫,比如说豹等被认为是猫的图片
  3. 模糊的图片提升准确率

在如下的一张表中进行统计:

Image Dogs Great Cat Blurry picutre comments
1 Keji Dog
2
% of total 8% 43% 61%

在查图的过程中发现了其他类型的误差也可以加入这个表格。

2. 清除标记错误的数据

深度学习算法对训练集的随机误差很稳定,所以有个别人工分类错的标签不影响结果。但是对系统误差不稳定,比如一直把白色狗图片都标记成猫。

可以在上一节的表格中加上一列属性,用来标识那些错误标签的图片。如果这些错误没有影响到算法,那就不需要去处理,否则需要处理掉。

举个例子

对于如下两种情况:

情况A 情况B
开发集误差 10% 2%
错分类误差 0.6% 0.6%
其他误差 9.4% 1.4%

对于情况A,由于手工标记错误的原因错误占比少,而情况B则很多,对于算法整体评估标准有严重影响,所以对于B需要修正数据集,手动重新检查标签,并尝试修复一些标签。

修改标签需要遵循的原则

  1. 为了确保开发集和测试集的分布保持一致,需要同时对这两个集进行修复标签操作
  2. 考虑对分错的和分对的标签都需要进行检查处理,数据很多,所以在必要的时候做
  3. 学习算法很稳定,训练集和开发集测试集的分布有些小差别是可以接受的

2,3两条在后面会详细介绍。

3. 快速建立你的系统并迭代

  • 原则:上手一个新领域,尽快建立一个可运行的模型,这样会比较有目标。

步骤:

  1. 设立开发集、测试集和评价指标
  2. 建立一个初始的模型
  3. 分析偏差方差和误差分析

如果是领域资深或者该领域有成熟的参考文献,那么不需要如上,直接上手复杂的算法也可以了。

4. 在不同的划分上进行训练并测试

处理训练集和测试集存在差异的情况。

情况描述:猫图片分类问题,有200000张图片来自网上,专业拍摄的图片,10000张来自用户的模糊图像,构造训练集、开发集和测试集?

  1. 把两个来源的图片混在一起,随机抽取构造训练集205000张,开发集2500,测试集2500。优点:训练集开发集和测试集都来自同一分布,好管理;坏处:开发集和测试集得到的结果不是你最初的目的 - 分类普通用户的猫图片。不推荐这种做法。
  2. 测试集是来自网上的200000图片加上用户的5000,开发集是用户的2500张,测试集是用户的2500张。好处:目标一致,就是要分类用户的猫图片;坏处:训练集和开发集、测试集的分布不一致。

5. 不匹配数据的偏差和方差

计算偏差和方差可以为接下来的步骤有所帮助,但是对于训练集开发集和测试集分布不一致的时候,计算的方式会不一样。

举个例子

猫分类器。

训练误差为1%,开发集误差为10%。

  1. 由于算法只见过训练集的数据,没见过开发集的数据,泛化能力差,导致了方差大。
  2. 由于训练集和开发集的分布不一致,即数据不匹配问题。

分割一个新的数据集,叫做训练-开发集,该集是从训练集中分割出来的,和训练集的分布保持一致。

在前面的例子中,如果训练-开发集的误差为9%,那么可以认为是第一个原因,也就是泛化能力差导致了方差大;否则则是第二个原因,数据不匹配问题。

关于4个集的误差和偏差方差等的对应关系

误差类型 对应名词
人类表现水平
可避免偏差
训练集误差
方差
训练-开发集误差
数据不匹配
开发集误差
对开发集的过拟合程度
测试集误差

更通用的表格

以后视镜导航开启的语音识别为例,用一般的语音和后视镜导航的语音来构建模型

一般的语音识别 后视镜导航语音
人类表现水平 4% 6%
可避免偏差
训练过的数据的误差(一般是训练集误差) 7% 6%
方差
没有训练过的数据的误差(一般是开发集或者测试集) 10% 6%
这一行的差值的误差是由数据不匹配导致的

6. 处理数据不匹配

  1. 尝试人工分析训练集和开发集/测试集之间的区别
    • 比如上例中开发集中多了汽车的噪声,特有的街道号码等
  2. 让测试集的分布向开发集靠拢,或者在训练集中加入一些开发集/测试集类似的数据
    • 比如在测试集的声音中加入汽车的噪声,或者在测试集中加入一些带有数字的语音样本

测试集的原始声音+汽车噪声=新的测试集声音

如果只用少量的汽车噪声来进行合成,那么就有对这个噪声过拟合的风险。

打个比方,汽车游戏中有20辆车,但是不同的造型可以截出很多的图像,人眼看起来很多,但是如果用这个图像做训练去识别其他车,那么开发集中的其他车辆都是训练集没有遇到过的,在一个很大的可能性空间中挑很少的一部分去训练,所以效果会很差,过拟合很严重。

7. 迁移学习(transfer learning)

神经网络可以把从一个任务中学到的知识应用到另一个独立的任务中,例如训练了一个分类猫的图像,从中学到的知识能够对X射线扫描有帮助。

比如有了一个训练好的图像识别的深度神经网络(预训练),现在要去做X射线诊断的任务。那么只需要替换掉输出层,然后初始化L层到输出层或者最后两层的权重偏置(微调),如果数据少的话,就只训练这一层的权重偏置,如果数据多的话可以训练整个网络的权重偏置。

迁移学习的原因:有很多低层次的特征,比如说边缘检测、曲线检测、阳性对象检测,从非常大的图像识别数据库中习得这些能力,可能有助于学习算法在放射科诊断的学习。算法学到了很多结构信息、图像形状的信息,其中的一些知识可能会有用,可以学习的更快或者需要的数据更少。

也可以在后面多加几层,重新训练的层数也可以多加几层。

什么时候用迁移学习

任务A迁移到任务B

  1. 任务A和B有相同的输入
  2. 任务A有比任务B大的多的数据集
  3. 任务A的低层次特征提取对任务B会有帮助

8. 多任务学习

让一个网络同时学习很多的任务,希望训练出来的网络能对这些任务都有帮助。

具体操作

主要体现在网络的输出层,比如说对于无人驾驶的例子,需要检测图像中是否出现了人行道、信号灯、人、指示牌,那么输出层就是一个4*1的向量。
成本函数的计算(使用逻辑回归的损失函数):

Loss=1mi=1mj=14L(y^(i)j,y(i)j)L(y^(i)j,y(i)j)=y(i)jlogy^(i)j(1y(i)j)log(1y^(i)j)

和Softmax不同,多任务学习可以有多个值为1。

  • 多任务学习可能比单个任务学习的效果要好
  • 一个图有4个标签,即使有一些图没有全部标记出来,也就是说有些图里有行人,但是标签没有写1,也可以用来训练

什么时候用迁移学习

  1. 需要训练的任务可以通过共享低层次的特征来得到更好的学习
  2. 每个任务的的数据是一样的
  3. 可以训练一个大规模的网络来做所有的任务,网络规模太小会导致性能比单独的网络差

9. 什么是端对端的深度学习

以语音识别为例,传统的语音识别过程如下:

audio/x –> | MFCC | features–> | IML | Phonemes–> words–> transcript/y

但是对于深度学习来说:
audio/x–>transcript/y

在只有3000h语音的时候,传统的方法可能要比深度学习要少,但是随着数据规模的增大,深度学习的效果会比传统的方法要好。

同时也可以结合这两种方法,先提取一些特征,然后再输入网络。

比如说人脸识别的门禁,首先用传统的方法识别出人脸,然后裁剪出一个人脸居中的图片,接着把这样图片和员工人脸库中的图片进行比对。

两步法人脸识别门禁效果好的原因:

  1. 把问题分成两个,每个问题的难度都降低了很多
  2. 两个子任务的训练数据都很多,从图像中框出人脸,人脸比对这两个子问题的训练数据有很多

举个例子

机器翻译,对于传统的方法来说,需要从输入的英文经过文本提取等一系列操作翻译成需要的语言,但是对于深度学习来说,只需要输入和输出就可以了。因为这样的一对数据很多,所以最后的性能好。

用x光片来估计小孩的年龄,直接估计数据少,用传统的方法,即先检测骨头,然后通过骨头来估计年龄。

10. 是否要使用端对端深度学习

优点:

  1. 让数据说话,用网络自己去构造特征去识别,而不是通过手动主观的方式人为设定特征
  2. 减少了手工设计特征的工作量

缺点:

  1. 需要大量的数据,(x,y)类型的数据
  2. 排除了潜在的有用的手工组件

什么时候使用端对端深度学习?

最关键的问题,是否有足够的数据来学习我们需要的映射。

举个例子

自动驾驶,从雷达激光的图像中,用深度学习获取是否有车、人行道等,然后用自动决策(而不是深度学习)来进行路径规划,最后用控制算法(又不是深度学习)来进行车辆的控制。

  • 所以要仔细确认深度学习需要学习的x到y的映射,取决于可以收集的数据

猜你喜欢

转载自blog.csdn.net/Asun0204/article/details/78159688
今日推荐