Deeplearning.ai吴恩达笔记之构建机器学习项目2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35564813/article/details/86477800

Error Analysis

Carrying out error analysis

当我们在训练一个模型的时候,如一个猫和狗分类模型,最终得到了90%的精确度,即有10%的错误率。所以我们需要对模型的一些部分做相应调整,才能更好地提升分类的精度。

如果不加分析去做,可能几个月的努力对于提升精度并没有作用。所以一个好的误差分析的流程就相当重要。

收集错误样例:

在分类错误的样本中,获取大约100个错误标记的例子,并统计其中有多少个是狗。

  • 假设一种情况是100个数据中,有5个样例是狗,那么如果我们对数据集的错误标记做努力去改进模型的精度,那么可以提升的上限就是5%,即仅仅可以达到9.5%的错误率,这有时称为性能上限(ceiling on performance)。 那么这种情况下,可能这样耗时的努力方向就不是很值得的一件事情。
  • 另外一种假设是100个数据中,有50个样例是狗,那么这种情况下,我们去改进数据集的错误标记,就是一个比较值得的改进方向,可以将模型的精确度提升至95%。

这种error analysis虽然简单,但是能够避免花费大量的时间精力去做一些对提高模型性能收效甚微的工作,让我们专注解决影响模型正确率的主要问题,十分必要。

这种error analysis可以同时评估多个影响模型性能的因素,通过各自在错误样本中所占的比例来判断其重要性。例如,猫类识别模型中,可能有以下几个影响因素:

在这里插入图片描述

通过分析错误类型的占比,使我们有一个粗略的了解哪些是我们相对值得去处理的,从而节约时间,提升效率。

Cleaning up incorrectly labeled data

监督式学习中,训练样本有时候会出现输出y标注错误的情况,即incorrectly labeled examples。如果这些label标错的情况是随机性的(random errors),DL算法对其包容性是比较强的,即健壮性好,一般可以直接忽略,无需修复。然而,如果是系统错误(systematic errors),这将对DL算法造成影响,降低模型性能。

刚才说的是训练样本中出现incorrectly labeled data,如果是dev/test sets中出现incorrectly labeled data,该怎么办呢?

方法很简单,利用上节内容介绍的error analysis,统计dev sets中所有分类错误的样本中incorrectly labeled data所占的比例。根据该比例的大小,决定是否需要修正所有incorrectly labeled data,还是可以忽略。

在这里插入图片描述

  • 如果总的错误是10%,因为标签错误导致的错误比例是0.6%,其他原因造成错误的比例是9.4%,那么这种情况下可以忽略incorrectly labeled data。
  • 如果总的错误是2%,因为标签错误导致的错误比例是0.6%,其他原因造成错误的比例是1.4%,那么这种情况下incorrectly labeled data就不好忽略了,需要手动修正。

我们知道,dev set的主要作用是在不同算法之间进行比较,选择错误率最小的算法模型。但是,如果有incorrectly labeled data的存在,当不同算法错误率比较接近的时候,我们无法仅仅根据Overall dev set error准确指出哪个算法模型更好,必须修正incorrectly labeled data。

关于修正incorrect dev/test set data,有几条建议:

  • Apply same process to your dev and test sets to make sure they continue to come from the same distribution
  • Consider examining examples your algorithm got right as well as ones it got wrong
  • Train and dev/test data may now come from slightly different distributions

Build your first system quickly,then iterate

对于如何构建一个机器学习应用模型,Andrew给出的建议是先快速构建第一个简单模型,然后再反复迭代优化。

  • Set up dev/test set and metric
  • Build initial system quickly
  • Use Bias/Variance analysis & Error analysis to prioritize next steps

Mismatched training and dev/test set

Training and testing on different distributions

当train set与dev/test set不来自同一个分布的时候,我们应该如何解决这一问题,构建准确的机器学习模型呢?

以猫类识别为例,train set来自于网络下载(webpages),图片比较清晰;dev/test set来自用户手机拍摄(mobile app),图片比较模糊。假如train set的大小为200000,而dev/test set的大小为10000,显然train set要远远大于dev/test set。

在这里插入图片描述

虽然dev/test set质量不高,但是模型最终主要应用在对这些模糊的照片的处理上。面对train set与dev/test set分布不同的情况,有两种解决方法。

第一种方法是将train set和dev/test set完全混合,然后在随机选择一部分作为train set,另一部分作为dev/test set。例如,混合210000例样本,然后随机选择205000例样本作为train set,2500例作为dev set,2500例作为test set。这种做法的优点是实现train set和dev/test set分布一致,缺点是dev/test set中webpages图片所占的比重比mobile app图片大得多。例如dev set包含2500例样本,大约有2381例来自webpages,只有119例来自mobile app。这样,dev set的算法模型对比验证,仍然主要由webpages决定,实际应用的mobile app图片所占比重很小,达不到验证效果。因此,这种方法并不是很好。

第二种方法是将原来的train set和一部分dev/test set组合当成train set,剩下的dev/test set分别作为dev set和test set。例如,200000例webpages图片和5000例mobile app图片组合成train set,剩下的2500例mobile app图片作为dev set,2500例mobile app图片作为test set。其关键在于dev/test set全部来自于mobile app。这样保证了验证集最接近实际应用场合。这种方法较为常用,而且性能表现比较好。

Bias and Variance with mismatched data distributions

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

例如某个模型human-level error为0%,training error为1%,dev error为10%。根据我们之前的理解,显然该模型出现了variance。但是,training error与dev error之间的差值9%可能来自算法本身(variance),也可能来自于样本分布不同。比如dev set都是很模糊的图片样本,本身就难以识别,跟算法模型关系不大。因此不能简单认为出现了variance。

在可能伴有train set与dev/test set分布不一致的情况下,定位是否出现variance的方法是设置train-dev set。Andrew给train-dev set的定义是:“Same distribution as training set, but not used for training.”也就是说,从原来的train set中分割出一部分作为train-dev set,train-dev set不作为训练模型使用,而是与dev set一样用于验证。

这样,我们就有training error、training-dev error和dev error三种error。其中,training error与training-dev error的差值反映了variance;training-dev error与dev error的差值反映了data mismatch problem,即样本分布不一致。

举例说明,如果training error为1%,training-dev error为9%,dev error为10%,则variance问题比较突出。如果training error为1%,training-dev error为1.5%,dev error为10%,则data mismatch problem比较突出。通过引入train-dev set,能够比较准确地定位出现了variance还是data mismatch。

总结一下human-level error、training error、training-dev error、dev error以及test error之间的差值关系和反映的问题:

在这里插入图片描述

一般情况下,human-level error、training error、training-dev error、dev error以及test error的数值是递增的,但是也会出现dev error和test error下降的情况。这主要可能是因为训练样本比验证/测试样本更加复杂,难以训练。

Addressing data mismatch

如果通过上一节的误差分析,我们可以得知,模型最终在开发和测试集上的误差最终是由于数据分布不匹配而导致。那么这样的情况下如何解决?

  • 进行人工误差分析,尝试去了解训练集和开发测试集的具体差异在哪里。如:噪音等
  • 尝试把训练数据变得更像开发集,或者收集更多的类似开发集和测试集的数据,如增加噪音;

为了让train set与dev/test set类似,我们可以使用人工数据合成的方法(artificial data synthesis)。例如语音识别问题,实际应用场合(dev/test set)是包含背景噪声的,而训练样本train set很可能没有背景噪声。为了让train set与dev/test set分布一致,我们可以在train set上人工添加背景噪声,合成类似实际场景的声音。这样会让模型训练的效果更准确。但是,需要注意的是,我们不能给每段语音都增加同一段背景噪声,这样会出现对背景噪音的过拟合,效果不佳。这就是人工数据合成需要注意的地方。

Learning from multiple tasks

Transfer learning

深度学习非常强大的一个功能之一就是有时候你可以将已经训练好的模型的一部分知识(网络结构)直接应用到另一个类似模型中去。比如我们已经训练好一个猫类识别的神经网络模型,那么我们可以直接把该模型中的一部分网络结构应用到使用X光片预测疾病的模型中去。这种学习方法被称为迁移学习(Transfer Learning)。

在这里插入图片描述

上述即为迁移学习的例子,我们可以去除神经网络的最后一层,然后自己创建新的输出节点或者创建好几层新的神经网络,重新初始化训练新的 W [ L ] , b [ L ] W^{[L]},b^{[L]} ,保持其他层所有的权重系数 W [ l ] , b [ l ] W^{[l]},b^{[l]} 不变,这是针对数据量相对较少的情况。如果样本数量足够多,那么也可以只保留网络结构,重新训练所有层的权重系数。这种做法使得模型更加精确,因为毕竟样本对模型的影响最大。选择哪种方法通常由数据量决定。

顺便提一下,如果重新训练所有权重系数,初始 W [ l ] , b [ l ] W^{[l]}, b^{[l]} 由之前的模型训练得到,这一过程称为pre-training。之后,不断调试、优化 W [ l ] , b [ l ] W^{[l]}, b^{[l]} 的过程称为fine-tuning。

迁移学习之所以能这么做的原因是,神经网络浅层部分能够检测出许多图片固有特征,例如图像边缘、曲线等。使用之前训练好的神经网络部分结果有助于我们更快更准确地提取X光片特征。二者处理的都是图片,而图片处理是有相同的地方,第一个训练好的神经网络已经帮我们实现如何提取图片有用特征了。 因此,即便是即将训练的第二个神经网络样本数目少,仍然可以根据第一个神经网络结构和权重系数得到健壮性好的模型。

总体来说,迁移学习的应用场合主要包括三点:

  • Task A and B have the same input x.
  • You have a lot more data for Task A than Task B.
  • Low level features from A could be helpful for learning B.

Multi-task learning

顾名思义,多任务学习(multi-task learning)就是构建神经网络同时执行多个任务。这跟二元分类或者多元分类都不同,多任务学习类似将多个神经网络融合在一起,用一个网络模型来实现多种分类效果。如果有C个,那么输出y的维度是(C,1)。例如汽车自动驾驶中,需要实现的多任务为行人、车辆、交通标志和信号灯。如果检测出汽车和交通标志,则y为:

y = [ 0 1 1 0 ] y=\begin{bmatrix} ​ 0\\ ​ 1\\ ​ 1\\ ​ 0 ​ \end{bmatrix}

多任务学习模型的cost function为:

1 m i = 1 m j = 1 c L ( y ^ j ( i ) , y j ( i ) ) \frac{1}{m}\sum_{i=1}^m\sum_{j=1}^cL(\hat{y}_j^{(i)},y_j^{(i)})

其中,j表示任务下标,总有c个任务。对应的loss function为:

L ( y ^ j ( i ) , y j ( i ) ) = y j ( i ) l o g y ^ j ( i ) ( 1 y j ( i ) ) l o g ( 1 y ^ j ( i ) ) L(\hat{y}_j^{(i)},y_j^{(i)})=-y_j^{(i)}log\hat{y}_j^{(i)}-(1-y_j^{(i)})log(1-\hat{y}_j^{(i)})

值得一提的是,Multi-task learning与Softmax regression的区别在于Softmax regression是single label的,即输出向量y只有一个元素为1;而Multi-task learning是multiple labels的,即输出向量y可以有多个元素为1。

多任务学习是使用单个神经网络模型来实现多个任务。实际上,也可以分别构建多个神经网络来实现。但是,如果各个任务之间是相似问题(例如都是图片类别检测),则可以使用多任务学习模型。另外,多任务学习中,可能存在训练样本Y某些label空白的情况,这并不影响多任务模型的训练。

总体来说,多任务学习的应用场合主要包括三点:

  • Training on a set of tasks that could benefit from having shared lower-level features.
  • Usually: Amount of data you have for each task is quite similar.
  • Can train a big enough neural network to do well on all the tasks.

##End-to-end deep learning

What is end-to-end deep learning?

端到端(end-to-end)深度学习就是将所有不同阶段的数据处理系统或学习系统模块组合在一起,用一个单一的神经网络模型来实现所有的功能。它将所有模块混合在一起,只关心输入和输出。

以语音识别为例,传统的算法流程和end-to-end模型的区别如下:

在这里插入图片描述

如果训练样本足够大,神经网络模型足够复杂,那么end-to-end模型性能比传统机器学习分块模型更好。实际上,end-to-end让神经网络模型内部去自我训练模型特征,自我调节,增加了模型整体契合度。

Whether to use end-to-end deep learning

在这里插入图片描述

应用端到端学习的 Key question:是否有足够的数据能够直接学习到从x映射到y的足够复杂的函数。

猜你喜欢

转载自blog.csdn.net/qq_35564813/article/details/86477800
今日推荐