deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II

1. 误差分析(Error analysis)

  误差分析的目的是找到不同误差源的比重,从而指引我们接下来往哪个方向努力改进。NG建议手工统计随机100个错误的误差源,比如对于猫分类器,错误的照片可能是1)狗;2)大型猫科动物;3)图像模糊。那么可以建立下面的表格:

在统计过程中发现新的误差源,则添一列(比如这里的Instagram)。本例的结果是100张错误图像中,Blurry占61%,Great Cats占43%,所以这两个是最主要的误差源,那么可以把团队分两拨,一拨人主攻一个方向。而Dog、Instagram的占比就比较小,在这方面努力的效果就不如Great Cats和Blurry明显。
  

2. Incorrectly labeled examples

  只要总数据集足够大,深度学习算法对于训练集中的随机误差(人工标记错误)非常鲁棒。所以对于训练集中的人工标记错误,可以修改一下,也可以放着不管。但对于系统性误差,就不那么鲁棒了。比如如果做标记得人一直把白色的狗标记成猫,那算法会把所有白色的狗都分类为猫。

  对于验证集/测试集中的错误标记误差(算法的输出其实是正确的,但由于标记的正确答案是错误的,所以判定算法错误),可以在100张错误图像的统计表格中增加一列统计这个误差的百分比:

如果错误标记误差在整体误差中占比比较小(比如例子中的6%),那么应该集中精力解决其他错误源,这种情况下,验证集/测试集中的错误标记误差也不用管。如果错误标记误差占比比较大(比如达到30%),那么就有必要修正一下错误标记。因为验证集的目的是告诉我们哪一种算法更好,如果错误标记误差占比很大,那对于A算法2.1%的错误率和B算法1.9%的错误率,我们就很难评定到底谁好。

  修正错误标记的时候有几个注意点:1)验证集和测试集要同时修正错误标记,目的是保证两者同分布。2)不但要检查由于错误标记而把算法对的结果误判成错的,也要检查把算法错的结果误判为对的。这一条通常不做,因为样本太多不容易做,比如错误率为2%,误判错只需要在2%的样本里查看,而误判对则要在98%的样本里查看。3)由于我们修正了验证集/测试集中的错误标记,对于训练集没有这样做(因为训练集实在太大了),所以会导致训练集和验证集/测试集的分布轻微不同。验证集/测试集同分布非常重要,训练集可以轻微不同。

  NG表示花几十分钟、几个小时手工统计一下100个或者几百个错误样本是非常值得的,这真的可以帮助我们找到需要优先处理的任务。

3. 尽快建立第一个原型系统,然后快速迭代

  NG建议的步骤:1)建立验证集/测试集,以及单一实数评估指标,这一步是设立目标;2)尽快搭一个原型系统(quick and dirty),用训练集训练一下,看效果;3)用偏差/方差分析和误差分析来决定下一步优先努力调整的方向。

  这套方法对于没有先验经验的问题非常适用,不要想太多,一开始就把系统弄得太复杂。对于有很多先验经验的问题,比如人脸识别,那么可以从现有的大量学术文献为基础开始,一开始就搭建比较复杂的系统。

4. 训练集和验证集/测试集不同分布

  由于人们需要喂给深度学习算法大量的训练数据,所以训练集和验证集/测试集分布不同是很正常的。

  比如我们开发一个app识别猫,用户上传的图片是模糊的不专业的,大概2万个样本,这是我们真正关心的数据集,所以验证集/测试集都必须从这个数据集里取。这点样本对于训练神经网络远远不够,所以我们又从网上爬了20万图片过来,这个数据集的分布是和我们真正关心的数据集不同的。可以把20万网络样本作为训练集,1万用户样本作为验证集,1万用户样本作为测试集;或者20万网路样本和1万用户样本合起来作为21万样本的训练集,5000用户样本作为验证集,5000用户样本作为测试集。  

  为了区分泛化误差和由于分布不同而导致的误差,要设立一个新的数据子集:train-dev set(训练验证集),这个数据子集里的数据全部来自训练集。这时候我们的数据集被分为4部分:训练集、训练验证集、验证集、测试集。有5个误差需要比较:

    a)Human level,近似Bayes optimal error;

    b)训练集误差;

    c)训练测试集误差;

    d)验证集误差;

    e)测试集误差。

a和b之间的距离是avoidable bias,描述算法是否欠拟合;b和c之间的是variance,描述算法的泛化能力,是否过拟合;c和d之间是data mismatch,描述训练集和验证集/测试集分布的不同;d和e之间是验证集(或者叫开发集)过拟合的程度,如果这个值很大,那么就需要增加验证集的大小。

  如何缓解训练集和验证集/测试集分布不同带来的data mismatch的问题呢?NG有两个建议:1)人工分析误差,看看到底分布差别在什么地方,比如是不是训练集图片不够模糊;2)尝试让训练集的数据更靠近验证集/测试集,比如把训练集的图片弄模糊一点,或者干脆采集更多类似验证集/测试集的数据用来训练。对于第二个建议,有专门的术语来描述数据合成:Artificial data synthesis,目的就是生成更接近验证集/测试集的训练数据。人工数据合成会有一个潜在的问题:过拟合,这是由于只合成了样本空间的一小部分。

5. 迁移学习(Transfer learning)

  从任务A中学习的知识可以应用到另一个独立的任务B中。一般做法是把A算法的最后的输出层换成重新赋予随机权重的网络(一层或者几层 ,这取决于B的样本的多少),然后让它在任务B上训练。如果B的样本很少,那么可能只需要训练最后一层(或者最后两层)的权重;如果B的样本很多,也可以重新训练所有层的权重,这种情况下,训练A的过程被称为“预训练(pre-training)”,训练B的过程被称为“微调(fine tune)”。两个例子,一是用图像识别的算法迁移学习X射线图像的诊断,二是语音识别的算法迁移学习唤醒词。

  什么情况下迁移学习的效果比较好呢?1)任务A和B有相同的输入,比如都是图像、都是音频等。2)任务A比任务B有大得多的训练集,由于B的每一条数据比A重要得多,所以A的数据量的大得多才有帮助。3)任务A的低层次特征对任务B有帮助,比如一般图像识别算法的低层次特征有助于理解图像,所以可以迁移到识别X射线扫描图的任务中。

   

6. 多任务学习

  迁移学习是串行的训练网络,先A,再B。多任务学习是让单个神经网络同时做几件事情,然后希望每个任务都能帮到其他所有任务。例如在研发无人驾驶车辆,无人车需要同时检测不同的物体:行人、车辆、停车标志、交通灯。这时候对于输入X(i),就不是一个标签,而是四个标签组成的4*1的向量y(i),对于所有样本来说,标签矩阵Y = [y(1), y(2), ... , y(m)],loss funciton是和Y的所有元素相关的量。这和softmax多类别分类的差别在于,softmax是把单个标签分给单个样本,而这里一张图片可以有多个标签。

  什么情况下多任务学习的效果比较好呢?1)多个任务有可以共用的低层次特征;2)不同任务的数据量很接近,这一条是经验,并没有严格论证。3)有能力训练一个足够大的神经网络可以同时做好多个任务,Rich Carona发现相比于训练单任务神经网络,多任务神经网络会降低性能的唯一情况是网络还不够大,只要网络足够大,肯定不会或者很少会降低性能。

  在实践中,多任务学习用的比迁移学习少得多。NG说他看到很多迁移学习的应用(针对数据量少的任务),但很少看到多任务学习的应用。多任务学习的应用主要是计算机视觉中的物体检测。

  

7. 端到端深度学习 

  端到端是指无视中间环节,只关注输入和输出的映射关系。端到端深度学习的挑战之一是需要大量的数据。对于没有大量端到端的数据的应用场合,则往往会把问题拆分成几个小问题,这样做有两个好处,1)子问题更容易解决;2)子问题有大量数据可以训练。比如计算机视觉的门禁系统,会先提取人的脸,再做人脸识别,而不是直接拿原始图片做人脸识别。

  端到端深度学习的优点:

    1)数据说了算。不会引入人为的偏见。

    2)更不需要人工设计组件。

  缺点:

    1)需要大量数据。

    2)也排除了有益的人工设计组件。NG说学习算法有两大知识来源,一是数据,另一个是人工设计的组件。当数据非常多时,人工设计的东西就不太重要了,但是当没有太多数据的时候,构造一个精心设计的系统实际上可以将人类对这个问题的认识直接注入到系统里。

  所以关键中的关键就是是否有足够的数据让系统学习到足够复杂的映射关系。

  

原文地址:https://www.cnblogs.com/zonghaochen/p/7859761.html