(3-2)结构化机器学习项目 | 机器学习策略(2)

目录

误差分析

清除错误标记的样本

快速搭建第一个系统

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

数据分布不匹配时的偏差与方差的分析

处理数据分配不匹配问题

迁移学习

多任务学习

端到端的深度学习


误差分析

如果我们希望让学习算法能够胜任人类能做的任务,但学习算法还没有达到人类的表现,那么我们可以人工检查一下算法犯的错误,这样也许可以让我们了解接下来需要对模型的哪些部分做相应调整才能更好地提升分类的精度。如果不加分析去做,可能几个月的努力对于提升精度并没有作用,所以一个好的误差分析的流程就相当重要。

假设我们正在调试猫分类器,然后在开发集上取得了 90%准确率,即 10%错误率,这离我们希望的目标还有很远。如果我们在开发集(测试集)中,获取大约100个错误标记的例子,并统计其中有多少个是狗。假设一种情况是100个错误标记的开发集样本,有5个样例是狗,那么如果我们在狗的问题上花了很多时间,最多错误率也只能从10%下降到 9.5%,那么这种情况下,可能这样耗时的努力方向就不是很值得的一件事情。另外一种假设是100个错误标记的开发集样本,有50多个样例是狗,如果我们真的解决了狗的问题,那么错误率可能就从 10%下降到 5%了,这是一个比较值得的改进方向,可以将模型的精确度提升至95% 。

在进行错误分析时,我们应该在开发集或者测试集找一组错误样本,观察错误标记的样本,看看假阳性(false positives)和假阴性(false negatives),统计属于不同错误类型的错误数量。在这个过程中,我们可能会归纳出新的错误类型,我们就可以在途中新建一个错误类型,对其也进行统计。总而言之,通过统计不同错误标记类型占总数的百分比,可以帮我们发现哪些问题需要优先解决,或者给你构思新优化方向的灵感。

清除错误标记的样本

深度学习算法对训练集中的随机误差具有相当的鲁棒性。只要我们标记出错的例子符合随机误差,例如做标记的人不小心错误或按错分类键,那么像这种随机误差导致的标记错误,一般来说不管这些误差可能也没有问题。所以对于这类误差,我们不需要用大量的时间和精力去做修正,只要数据集足够大,实际误差不会因为这些随机误差有很大的变化。

深度学习算法对随机误差很健壮,但对系统性的错误就没那么健壮了。比如做标记的人一直把如例子中的白色的狗标记成猫,那么最终会导致我们的分类器出现错误。如果我们担心开发集或测试集上标记出错的样本带来的影响,可以在错误分析时,添加一个额外的列用来统计标签 𝑦 = 1错误的样本数。 比如说,在100 个错分样本钟, 对于其中的少数样本,分类器输出和标签不同是因为标签错了,而不是分类器出错。当统计出其他错误类型的百分比后,也统计出了标签错误所占的百分比,这样我们就能得出修正这些标记错误的价值。

如果我们决定要去修正开发集数据,手动重新检查标签,并尝试修正一些标签,需要考虑的额外的方针和原则:

  • 如果修正开发集上的部分数据,那么最好也对测试集做同样的修正,从而确保它们继续来自相同的分布;
  • 同时检验算法判断正确和判断错误的样本;
  • 开发集和测试集来自同一分布非常重要,但如果训练集来自稍微不同的分布,通常这是一件很合理的事情。

快速搭建第一个系统

如果我们正在开发全新的机器学习应用,我们通常应该先快速的建立自己的基本系统,并进行迭代。而不是想的太多,在一开始就建立一个非常复杂,难以入手的系统。

  • 快速设立开发集、测试集和优化指标(确定方向);
  • 快速搭好一个机器学习系统原型,然后进行迭代;
  • 使用偏差方差分析、误差分析来确定下一步优先做什么。

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

深度学习算法对训练数据的胃口很大,如果能够收集到足够多带标签的数据构成训练集, 算法效果回更好,这导致很多团队用尽一切办法收集数据,然后把它们堆到训练集里,让训练的数据量更大,即使有些数据,甚至是大部分数据都来自和开发集、测试集不同的分布。

假设我们在开发一个手机应用,用户会上传他们用手机拍摄的照片,应用会识别用户从应用中上传的图片是不是猫。我们可以从网上获取大量的高清晰的猫的图片去做分类,如200000张,但是只能获取少量利用手机拍摄的不清晰的图片,如10000张。

有一种选择就是将两组数据合并到一起,总共得到21万张图片样本,然后将这些样本随机分配到训练、开发、测试集中。这样的好处在于三个集合中的数据均来自于同一分布;但如果我们观察开发集,可以发现大多数样本都来自网页下载的图片,也就是说我们的大部分精力都用在优化来自网页下载的图片,这其实并不是我们想要的。

我们通常会选择另一条路,用来自网上下载的20万张高清图片作为训练集,当然也可以加上5000张手机非高清图片;而对于开发和测试集都是手机非高清图片。这样的好处在于开发集和测试集全部来自手机图片,这样瞄准的目标就是我们想要处理的目标;但缺点在于训练集和开发、测试集来自不同的分布。从长期来看,这样的分布能够给我们带来更好的系统性能。

数据分布不匹配时的偏差与方差的分析

通过估计学习算法的偏差和方差,可以帮助我们确定接下来应该优先努力的方向。但是当我们的训练集和开发、测试集来自不同的分布时,分析偏差和方差的方式就有一定的不同。

以猫分类器为例,假设贝叶斯错误率为 0%,在样本中,训练集误差为 1%,开发集误差为10%,如果开发集和训练集来自同一分布,我们可以知道模型存在很大的方差问题,它不能很好的从训练集出发泛化,虽然处理训练集很好,但处理开发集就突然间效果很差了。但如果数据来自不同的分布,那么我们就不能下这样的定论了。也许算法在开发集上做得不错,可能是因为训练集很容易识别,但开发集却很难识别。

为了确定模型存在的问题是由于分布不匹配还是方差问题所致,我们可以定义一组训练-开发集,这个新的子集是从训练集的分布里挖出来的,但不会用来训练网络。这样就像开发集和测试集来自同一分布,训练集、训练-开发集也来自同一分布。然后通过Human level、Training set error、Training-dev set error、Dev error、Test error 之间误差的大小,可以分别得知我们的模型,需要依次在可避免偏差、方差、数据分布不匹配、开发集的或拟合程度这些方面进行改进。

处理数据分配不匹配问题

  • 进行人工误差分析,尝试去了解训练集和开发测试集的具体差异;
  • 尝试把训练集变得更像开发集(如人工数据合成),或者收集更多的类似开发集和测试集的数据;

迁移学习

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

假设我们已经训练出一个语音识别系统,现在𝑥是音频,𝑦是听写文本,现在我们想搭建一个“唤醒词”或“触发词”检测系统,我们就可能需要去掉神经网络的最后一层,然后加入新的输出节点,然后把唤醒词检测问题的标签𝑦 喂进去训练。我们可能只需要重新训练网络的新层,也可能需要重新训练神经网络中更多的层,这取决于我们有多少数据。

那么迁移学习什么时候是有意义的呢?需满足以下几种条件:

  • 任务A和任务B有着相同的输入;
  • 任务A所拥有的数据要远远大于任务B(对于更有价值的任务B,任务A所拥有的数据要比B大很多);
  • 任务A的低层特征学习对任务B有一定的帮助。

多任务学习

在迁移学习中,步骤是串行的,将在任务𝐴中学习到的模型迁移到任务𝐵。而在多任务学习中,是同时开始学习,试图让单个神经网络同时做几件事情(多个不同的任务同时使用一个神经网络训练),同时希望各个任务对其他的任务均有一定的帮助。

以自动驾驶为例,我们需要检测的物体很多,如行人、汽车、交通灯等等,所以我们的目标值变成了一种向量的形式(向量中的每一个值代表检测到是否有行人、汽车、停车标志、交通灯等),模型的神经网络结构如下图所示:

该问题的代价函数为:

那么多任务学习什么时候有意义呢?需满足以下三个条件:

  • 训练的一组任务可以共用低层特征;
  • 通常,对于每个任务的数据量具有很大的相似性;
  • 可以训练一个足够大的神经网络并同时做好所有的任务。

端到端的深度学习

以前的一些数据处理系统或者学习系统需要多个阶段的处理,端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络来替代。

以语音识别为例,目标是输入一段音频,然后输出这段音频的文本。传统上,语音识别需要很多阶段的处理。 首先会提取出一些低层次特征,再应用机器学习算法在音频片段中找到音位,然后将音位串在一起构成独立的词,最后将词串起来构成音频片段的听写文本。而端到端深度学习就是训练一个巨大的神经网络,输入一段音频,输出直接是听写文本。在数据集较少的情况下传统的特征提取方式可能会取得好的效果;但如果有大量数据集,端到端的深度学习会发挥巨大的价值。

再以人脸识别门禁为例,我们可以尝试直接学习图像𝑥到人物𝑦身份的函数映射,但事实证明这不是最好的方法。迄今为止最好的方法似乎是一个多步方法,首先,检测出人脸位置,使人脸居中显示,然后再喂到神经网络中学习,识别人脸身份。为什么两步法更好呢?第一,解决的两个问题实际上要简单得多;第二,两个子任务的训练数据都很多。因此,把这个分成两个子问题,比纯粹的端到端深度学习方法会达到更好的表现。不过如果我们有足够多的数据来做端到端学习,也许端到端方法效果更好,但在今天的实践中, 并不是最好的方法。

端到端深度学习优点:

  • 可以直接让数据“说话”;
  • 所需手工设计的组件更少,能简化设计工作流程;

端到端深度学习缺点:

  • 可能需要大量的数据;
  • 排除了可能有用的手工设计组件。

总而言之,端到端深度学习系统是可行的,可以表现得很好,也可以简化系统架构,让我们不需要搭建那么多手工设计的单独组件,但它也不是灵丹妙药,并不是每次都能成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值