深度学习 day11机器学习(ML)策略

01 进行误差分析

人工检查你的算法错误,也许可以让你了解接下来应该做什么,这个过程就叫误差分析


  • 同样是一个猫分类器,但是它的准确度只有90%,它会将一些狗的图片识别成猫,如果花费几个月的时间来开发专门研究狗的项目,那是大可不必,因为可能取不到效果。所以我们推荐使用误差分析:我们自己手动的观察100个错误标记的开发集例子,如果只有其中5个是狗的图片,那么就算把识别狗做的很好,误差也高达9.5%,如果其中有50个是狗的图片,这时我们在对识别狗进行完善就可以将误差减半到5%。

在这里插入图片描述

  • 有时在做误差分析时,也可以同时并行评估几个想法,例如猫分类器:

    1. 改善针对狗图的性能
    2. 解决针对于猫科动物看做成家猫的错误
    3. 提高画质
  • 针对于上面这三个想法我们可以将其记录成下面的表,统计出每个想法占的百分比,在以此判断是否应该提升哪个的性能,提升哪个性能上限比较高。

在这里插入图片描述

  • 总结:进行误差分析应该找一组错误标记的例子,可能在开发集或者测试集里,观察错误标记的例子,看看假阳性和假阴性,统计属于不同错误类型的错误数量,可以帮助你发现哪些问题需要优先处理。

02 清楚标注错误的数据

监督学习问题的数据是由输入x和输出标签y组成,通过发现,得知有些输出标签y是错误的,是否值得花时间去修正这些标签呢?


  • y为1是猫,为0不是猫,这时发现倒数第二个是错误标签,该怎么办?

    1. 如果是训练集,深度学习算法对于训练集中的随机误差是很宽容的,只要这些错误例子离随机误差不太远,误差足够随机,那么放着这些误差不管可能也没问题。只要总数据集足够大,实际误差可能不会太高。
    2. 如果担心开发集和测试集上标记出错的例子带来的影响,一般建议在误差分析的时候,添加一个额外的列来统计标签y错误的例子数。是否值得修正这6%标记出错的例子呢?如果这些错误标签严重影响了你在开发集上评估算法的能力,那么就应该花费时间去修正错误标签,反之不用。
    3. 建议看三个数字来确定是否值得去人工修正标记出错的数据:整体的开发集误差10%;错误标记引起的错误的数量或者百分比0.6%(10%的6%);其他原因导致错误的百分比9.4%(10%-0.6%)。对于左边的错误标签没有严重影响了你在开发集上评估算法的能力,而左边的错误标签严重影响了你在开发集上评估算法的能力。

在这里插入图片描述

在这里插入图片描述

  • 修正的建议:首先无论使用什么修正手段,都要同时作用到开发集和测试集上(开发集和测试集必须来自相同的分布,因为开发集确定了你的目标,当你击中目标后将算法推广到测试集中,这样你的团队才能更高效)来确保他们继续来自同一分布;其次要同时检验算法判断正确和判断错误的例子,如果你只修正算法出错的例子,你对算法的偏差估计可能会变大,修正错误的例子之后,一些改变可能使原本正确的例子也变成错误的了。但是我们通常不会这么做,因为如果你的分类器很准确,那么判断错的次数比判断正确的次数要小得多;如果你进入到一个开发集和测试集去修正部分标签,你不大可能去修正训练集的,因为训练集数据比开发集和测试集多的多,需要花费的时间也就多。

在这里插入图片描述

  • 总结:在构造实际系统时,通常需要更多的人工误差分析和人类见解,我们要看下犯错误的例子,这样可以帮助找到需要优先处理的任务。

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

  • 一般来说,对于几乎所有的机器学习程序,可能会有50个不同的方向可以前进,并且都是相对合理的可以改善系统,但挑战在于你如何选择一个方向集中精力处理。
  • 如果你像搭建一个全新的机器学习程序,建议:首先快速设立开发集和测试集还有指标,决定了你的目标所在,如果错了可以在改,但是一定要设立;然后建议马上搭好一个机器学习系统原型(初始系统的全部意义在于有一个训练过的系统可以让你确定偏差和方差的范围,就知道下一步应该优先做什么,能够进行误差分析),然后找训练集进行训练,看效果。开始理解你的算法表现如何,在开发集测试集你的评估指标上表现如何;当你建立第一个系统后,你就可以马上用到偏差方差分析和误差分析。

在这里插入图片描述

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

  • 如果你有两个数据来源,一个较小,一个较大,那么该怎么分布?
  • 第一条路:我们可以将来自互联网和用户的图片结合到一块,然后随机分配到训练、开发和测试集中,这样三个集的数据都来自同一分布,但是坏处在于,对于2500个开发集数据,其中很多图片都是来自网页下载,并不是真正关心的数据分布,真正要处理的是用户上传的,这样设立开发集导致团队针对不同于你实际关心的数据分布去优化。(不要用)
  • 推荐第二条路:我们训练集是来自互联网的图片,如果需要的话,再加上5000张来自手机上传的图片,对于开发集和测试集都是手机图片,这样的好处在于你现在瞄准的目标就是你想要处理的目标。开发集全部数据都来自用户,可以告诉你的团队这是你真正关心的图片分布,试着搭建一个学习系统,让系统在处理用户图片分布时效果良好。缺点在于你的训练集和开发集、测试集不在一个分布

在这里插入图片描述

  • 以语音激活后视镜为例,对于训练集你可以使用你所拥有的所有语音数据;对于开发集和测试集来说可能要小的多,比如实际上来自语音激活后视镜的数据。按照上面推荐第二条路进行分配。

在这里插入图片描述

05 不匹配数据划分的偏差和方差

当你的训练集和你的开发集、测试集来自不同的分布时,分析偏差和方差的方式可能不一样


  • 训练集误差为1,开发集误差为10。如果训练集和开发集来自同一分布,这就存在很大的方差问题,算法不能很好的从训练集出发泛化;但如果你的训练集和开发集来自不同的分布,这时就不能轻易下结论,可能没有方差问题,只不过反映了开发集包括更难准确分类的图片。
  • 分析的问题在于当你看训练误差再看开发误差有有两件事变了:
    1. 算法只见过训练集数据,没见过开发集数据
    2. 开发集数据来自不同的分布
  • 我们设置一个新的数据子集叫训练-开发集,从训练集的分布里随机打散训练集,但是不会用来训练网络。为了进行误差分析,你应该做的是看看分类器在训练集上的误差1%、训练-开发集上的误差9%还有开发集上的误差10%。而训练集和训练-开发集上的差异在于你的神经网络能看到第一部分数据(红色部分)并在上面做训练,但没有在训练-开发集上直接训练,这就告诉算法存在方差。因为训练集上和训练-开发集来自同一分布的数据测得,所以尽管你的神经网络在训练集中表现良好,但无法泛化到来自相同分布的训练-开发集中;又如这三个误差分别是1%、1.5%、10%,这时方差问题就很小了。因为从训练集到训练-开发集误差只上升了一点点,但转到开发集时误差就大了很多,所以这是数据不匹配问题;又如这三个误差分别是10%、11%、12%,这时就存在偏差问题了;又如这三个误差分别是10%、11%、20%,这就有两个问题了:可避免偏差相当高还有数据不匹配问题很大。

在这里插入图片描述

  • 一般的原则,我们要看的关键数据是人类水平误差、训练集误差、训练开发集误差、开发集误差。如果再加一个测试误差,那么测试误差和开发集误差的间距就是你对开发集过拟合的程度。当然也可能出现右边的情况,是因为开发测试集分布比你应用实际处理的数据要容易得多,那么误差可能真的就下降。

在这里插入图片描述

  • 我们以语音激活后视镜为例子,横轴是不同的数据集,竖轴是我们要标记处理数据不同的方式或算法,最后一行放不开了,所以放到了右边。

在这里插入图片描述

06 定位数据不匹配

  • 如果发现数据不匹配问题,通常会做误差分析。还是以语音激活后视镜为例,可能要听一下来自开发集的样本,尝试弄清楚开发集和训练集到底有什么不同(比如说开发集的噪音很多)。你可以尝试把训练数据变得更像开发集一点,或者也可以收集更多类似开发集和测试集的数据(比如说发现车辆背景噪音是主要的误差来源,那么就有意识的收集这些数据加到训练集中)。

在这里插入图片描述

  • 如果你的目的是把训练数据变得更像开发集一点,可以使用人工合成数据技术,通过人工合成你可以快速制造更多的训练集。但是人工合成有一个潜在的问题,比如说你在安静的环境下录制了1000小时音频,在移动的车上只录制了1一个小时,当你重复的将这1小时的音频叠加到1000小时音频时,可能你的学习算法对这一小时汽车噪声过拟合。人工数据合成的挑战在于人耳对于1000小时听起来和1小时噪音听起来没什么区别,所以最后可能制造出这个原始数据很少的,在一个小得多的空间子集合成的训练数据。

在这里插入图片描述

  • 总结:如果你认为存在数据不匹配问题,建议做误差分析或者看看训练集和开发集,这两个数据分布到底有什么不同,然后尝试收集看起来像开发集数据做训练。当使用人工合成数据一定要谨慎,你有可能从所有可能性的空间只选了很小一部分去模拟数据。

07 迁移学习

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


  • 假设你已经训练好一个图像识别神经网络,然后将这个神经网络拿来让他适应不同的任务(比如放射科诊断),可以做的就是把神经网络最后的输出层和进入到最后一层的权重删掉,然后加上一层或者几层新层,然后为最后一层或几层重新赋予随机权重,然后让它在放射诊断数据上训练。在进行图像识别的训练阶段,可以训练神经网络的所有常用参数、所有权重、所有层,然后就得到了一个能够做图像识别的神经网络,这时要实现迁移学习你要做的就是把数据集换成放射科的(x,y)训练集,而y就是你想要预测的诊断。然后我们随机初始化最后一层的权重w和b。已有语音识别系统神经网络,然后搭建一个触发词(可以唤醒智能设备)的神经网络,过程都同上。
  • 要用新的数据集重新训练神经网络有几种做法:
    1. 如果你有一个小的数据集,就只训练输出层前的最后一层或者最后两层。
    2. 如果你有很多数据集,那么也许你可以重新训练网络中的所有参数。在图像识别数据的初期训练阶段(预训练),你在用图像识别数据预初始化,然后以后更新所有权重,在放射科数据上训练,有时这个过程叫微调。
  • 迁移学习起作用的场合是:迁移来源问题你有很多数据,但迁移目标问题你没有那么多数据。(例如图像识别有一百万样本,可以学习低层次特征,可以在神经网络的前几层学到如何识别有用的特征,放射科数据有一万样本,在已经学习特征的基础上加以训练)数据量反着来的话(例如图像识别有50样本,放射科数据有300样本),就没有太大的意义了。

在这里插入图片描述

  • 假设从任务A学习并迁移一些知识到任务B,那么什么时候迁移学习有意义?
    1. 当任务A和任务B都有同样的输入x(例如A和B输入都为图像)
    2. 当任务A数据比任务B数据多得多的时候
    3. 任务A的低层次特征可以帮助任务B的学习

在这里插入图片描述

08 多任务学习

在迁移学习中,你的步骤是串行的(从A到B);在多任务学习中,你可以同时开始学习,试图让单个神经网络同时做几件事,然后希望每个任务都能帮到其他所有任务


  • 以无人驾驶为例,需要同时识别多个不同的物体,比如行人、车辆、停车标志还有交通灯,以这四个为例设计出Y。

在这里插入图片描述

  • 现在就可以训练一个神经网络来预测这些y值,输入x,输出的是一个四维向量y。要训练这个神经网络,需要定义神经网络的损失函数,和之前分类猫的例子主要区别在于需要对j=1到4求和;这与softmax回归的主要区别在于softmax将单个标签分配给单个样本,而这个例子一张图可以有很多不同标签(行人、车辆、停车标志还有交通灯),所以在该例中你不是只给图片一个标签,而是需要遍历不同类型,然后看看每个类型是否出现在图中。
  • 如果你训练一个神经网络,并试图最小化这个成本函数,你做的就是多任务学习,由于神经网络早期的一些特征,在识别不同物体时都会用到,你发现训练一个神经网络做四件事会比训练四个完全独立的神经网络分别做四件事性能要更好。
  • 多任务学习也可以处理图像只有部分物体被标记的情况(右下角Y的情况,不清楚标记?),你就只对带0和1标签的j值求和,如果有?你就在求和时忽略那个项。

在这里插入图片描述

  • 多任务学习什么时候有意义?当三件事为真时,他就是有意义的:
    1. 如果你训练的一组任务可以共用低层次特征,比如无人驾驶例子,同时识别四个标签,因为这些都是道路上的特征。
    2. 不一定对哈,如果你专注于单项任务,想要从多任务学习得到很大性能提升,那么其他任务加起来必须要有比单个任务大得多的数据量或者每个任务的数据量很接近。
    3. 当你可以训练一个足够大的神经网络,同时做好所有的工作。多任务学习的替代方法是训练四个完全独立的神经网络,一个任务对应一个神经网络,如果神经网络足够大,就不用替代。

在这里插入图片描述

  • 总结:迁移学习用的多

09 什么是端对端的深度学习

深度学习中最令人振奋的最新动态之一就是端对端深度学习的兴起,以前有一些数据处理系统或者学习系统,他们需要多个阶段的处理,那么端对端深度学习就是忽略所有这些不同的阶段,用单个神经网络替代它


  • 以语音识别为例,需要很多阶段的处理,首先会提取一些特征(MFCC用来从音频中提取一组特定的人工设计的特征),提取完低层次的特征后就可以应用机器学习算法在音频片段中找到音位,然后将音位串在一起构成独立的词,然后将这些词串起来构成音频片段的听写文本;端对端深度学习就是训练一个巨大的神经网络,输入一段音频,输出直接是听写文本。
  • 端对端深度学习的挑战之一是你可能需要大量数据才能让系统表现良好。小数据集用传统的比较好(3000h);大的数据集用端对端才好(10000h);数据量适中也可以用中间件方法。

在这里插入图片描述

  • 搭建人脸识别门禁系统:第一件事是看看相机拍到的照片,你可以直接学习图像x到人物y身份的函数映射(这不是最好的方法,因为人可以从很多不同的角度接近门禁);迄今为止最好的方法是多步方法,首先运行一个软件来检查人脸,所以第一个检测器找的是人脸位置,找到后裁剪图像使人脸居中,再喂到神经网络里去学习,将现拍的图片跟已存的图片进行对比。为什么两步法更好呢?一是你解决的两个问题,每个问题实际上要简单得多,二是两个子任务的训练数据都很多

在这里插入图片描述

  • 更多的例子:机器翻译,X扫描

在这里插入图片描述

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

  • 端对端学习的好处:
    1. 只是让数据说话,让你的学习算法学习它想学习的任意表示方法,而不是强迫它使用特定的某种(音位)作为表示方法,其整体表现可能会更好。
    2. 所需手工设计的组件更少,不需要花太多时间去手工设计功能。
  • 端对端学习的缺点:
    1. 要直接学x到y的映射,它可能需要大量的数据。
    2. 排除了可能有用的手工设计组件,当没办法从很小的训练集数据中获得洞察力,这时手工设计组件就可以把人类知识直接注入到算法。
  • 学习算法有两个主要知识来源:如果数据少就需要用组件,如果数据多就可能不需要
    1. 数据
    2. 手工设计的任何东西(也可能强迫学习算法使用特定的某种(音位)作为表示方法)

在这里插入图片描述

  • 决定是否使用端对端的深度学习关键的问题是你有足够的数据能够直接学从x映射到y足够复杂的函数吗?

在这里插入图片描述

  • 总之需要大量数据
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值