吴恩达深度学习课程3《构建机器学习项目》

https://blog.csdn.net/red_stone1/article/details/78519599

1.1 Why ML Strategy

当我们最初得到一个深度神经网络模型时,我们可能希望从很多方面来对它进行优化,例如:

  • 收集更多的数据
  • 收集更多多样化的训练数据
  • 训练久一点
  • 尝试不同的优化算法,如使用Adam取代梯度下降
  • 尝试更大的神经网络
  • 尝试更小的神经网络
  • 尝试dropout正则化
  • 尝试l2正则化
  • 修改网络结构
    • 修改激活函数
    • 改变隐藏层的单元数等等

可选择的方法很多,也很复杂、繁琐。盲目选择、尝试不仅耗费时间而且可能收效甚微。因此,使用快速、有效的策略来优化机器学习模型是非常必要的。

1.2 正交化

搭建机器学习系统的挑战之一,就是可以尝试和改变的东西太多了,有那么的超参数可以调。那怎么效率很高,思路很清晰的来调整,对于要调整什么来达到某个效果非常清楚,这个步骤就是正交化!

机器学习中有许多参数、超参数需要调试。通过每次只调试一个参数,保持其它参数不变,而得到的模型某一性能改变是一种最常用的调参策略,我们称之为正交化方法(Orthogonalization)。

Orthogonalization的核心在于每次调试一个参数只会影响模型的某一个性能。例如老式电视机旋钮,每个旋钮就对应一个功能调整旋钮会调整对应的功能,而不会影响其它功能。也就是说彼此旋钮之间是互不影响的,是正交的,这也是Orthogonalization名称的由来。这种方法能够让我们更快更有效地进行机器学习模型的调试和优化。

对应到机器学习监督式学习模型中,可以大致分成四个独立的“功能”,每个“功能”对应一些可调节的唯一的旋钮。四个“功能”如下:

  • Fit training set well on cost function至少系统在训练集上得到的结果不错
  • Fit dev set well on cost function      在验证集上的表现也不错
  • Fit test set well on cost function      在测试集上的表现也不错
  • Performs well in real world              在现实生活中的使用表现也不错

其中,第一条优化训练集可以通过使用更复杂NN,使用Adam等优化算法来实现;如果训练集表现不好,训练复杂的NN网络,或切换更好的优化算法。

第二条优化验证集可以通过正则化采用更多训练样本来实现;如果验证集拟合很差,尝试正则化和更多的训练样本。

第三条优化测试集可以通过使用更多的验证集样本来实现,因为如果验证集表现不错,而测试集表现不好,说明验证集过拟合了,所以应该回退一步,使用更大的验证集;

第四条提升实际应用模型可以通过更换验证集,使用新的cost function来实现。如果测试集上也表现挺好,但是实际应用不好,说明要回去改变验证集或代价函数。因为如果某个代价函数,系统在测试集上做的很好,但是无法反映算法在现实世界中的表现,这就意味着要么验证集分布设置的不正确,要么代价函数测量的指标不对。

概括来说,每一种“功能”对应不同的调节方法。而这些调节方法(旋钮)只会对应一个“功能”,是正交的。

顺便提一下,early stopping在模型功能调试中并不推荐使用。因为early stopping在提升验证集性能的同时降低了训练集的性能。也就是说early stopping同时影响两个“功能”,不具有独立性、正交性

1.3 单一数字评估指标

构建、优化机器学习模型时,单值评价指标非常必要。有了量化的单值评价指标后,我们就能根据这一指标比较不同超参数对应的模型的优劣,从而选择最优的那个模型。如果你有一个单实数的评价指标,你的进展会快的多,它会快速告诉你,新尝试的手段比之前的手段好还是坏。

比如之前的猫分类的例子,评估你的分类器的一个合理方式是观察他的precision(查准率)和recall查全率(召回率)

举个例子,比如有A和B两个模型,它们的准确率(Precision)和召回率(Recall)分别如下:

这里写图片描述

如果只看Precision的话,B模型更好。如果只看Recall的话,A模型更好。实际应用中,我们通常使用单值评价指标F1 Score来评价模型的好坏。F1 Score综合了Precision和Recall的大小,计算方法如下:

F1=\frac{2PR}{P+R}
然后得到了A和B模型各自的F1 Score:

这里写图片描述

从F1 Score来看,A模型比B模型更好一些。通过引入单值评价指标F1 Score,很方便对不同模型进行比较。

除了F1 Score之外,我们还可以使用平均值作为单值评价指标来对模型进行评估。如下图所示,A, B, C, D, E, F六个模型对不同国家样本的错误率不同,可以计算其平均性能,然后选择平均错误率最小的那个模型(C模型)。

这里写图片描述

1.4 满足和优化指标

有时候,要把所有的性能指标都综合在一起,构成单值评价指标是比较困难的。解决办法是,我们可以把某些性能作为优化指标(Optimizing metic),寻求最优化值;而某些性能作为满意指标(Satisficing metic),只要满足阈值就行了。

举个猫类识别的例子,有A,B,C三个模型,各个模型的Accuracy和Running time如下表中所示:

这里写图片描述

Accuracy和Running time这两个性能不太合适综合成单值评价指标。因此,我们可以将Accuracy作为优化指标(Optimizing metic),将Running time作为满意指标(Satisficing metic)。也就是说,给Running time设定一个阈值,在其满足阈值的情况下,选择Accuracy最大的模型。如果设定Running time必须在100ms以内,那么很明显,模型C不满足阈值条件,首先剔除;模型B相比较模型A而言,Accuracy更高,性能更好。

概括来说,性能指标(Optimizing metic)是需要优化的,越优越好;而满意指标(Satisficing metic)只要满足设定的阈值就好了。

例如关键字唤醒语音设备,会在乎触发字检测系统的准确性,用户说出触发词时,有多大概率可以唤醒你的设备?也要顾及false positive的数量,没有人说触发词时,它被唤醒的概率有多大?这种情况下,组合这两种评估指标的合理方式可能是最大化精确度!让accuracy最大!

所以当某人说出唤醒词时,你的设备被唤醒的概率最大化然后必须满足 24 小时内最多只能有 1 次假阳性,对吧?所以你的设备平均每天只会没有人真的在说话时随机唤醒一次。所以在这种情况下,准确度是优化指标,然后每 24 小时发生一次假阳性是满足指标,你只要每 24 小时最多有一次假阳性就满足了。这个对于我们的场景可以借鉴!!!!

1.5 如何设置训练集、验证集和测试集

Train/dev/test sets如何设置对机器学习的模型训练非常重要,合理设置能够大大提高模型训练效率和模型质量。那么应该如何设置这些数据集,让效率更高呢?

原则上应该尽量保证dev sets和test sets来源于同一分布且都反映了实际样本的情况如果dev sets和test sets不来自同一分布,那么我们从dev sets上选择的“最佳”模型往往不能够在test sets上表现得很好。这就好比我们在dev sets上找到最接近一个靶的靶心的箭,但是我们test sets提供的靶心却远远偏离dev sets上的靶心,结果这支肯定无法射中test sets上的靶心位置。

这里写图片描述

验证集(Hold out cross validation set保留交叉验证集)。

  • 怎么做呢?——建议你将所有数据重新洗牌,放入验证集和测试集,来自同一分布就是讲所有数据混在一起!

  • 建议在设立验证集和测试集时,验证集和测试集要来自同一个分布,不管未来得到怎样的数据,一旦算法的效果不错,要尝试收集类似的数据,并且要将数据随机分配给验证集和测试集。

  • 设立验证集和评估指标,就定了了要瞄准的目标。希望通过设置验证集和测试集服从同一分布,你可以瞄准自己设置的目标。而设立训练集的方式则会影响你逼近那个目标有多快!

1.5节的意义在于:设立了验证集以及评价指标之后,真的就定义了你要瞄准的目标。我们希望通过在同一分布中建立验证集和测试集,你就可以瞄准你所希望的机器学习团队瞄准的目标。而设立训练集的方式则会影响你逼近那个目标有多快!

1.6 验证集和测试集的大小

在之前的课程中我们已经介绍过,当样本数量不多(小于一万)的时候,通常将Train/dev/test sets的比例设为60%/20%/20%,在没有dev sets的情况下,Train/test sets的比例设为70%/30%。当样本数量很大(百万级别)的时候,通常将相应的比例设为98%/1%/1%或者99%/1%。

  • 对于dev sets数量的设置,应该遵循的准则是通过dev sets能够检测不同算法或模型的区别,以便选择出更好的模型
  • 对于test sets数量的设置,应该遵循的准则是通过test sets能够反映出模型在实际中的表现测试集的目的是完成系统开发之后,测试集可以帮你评估投产系统的性能!10K个例子就能够给你足够的置信度来给出性能指标了。

实际应用中,可能只有train/dev sets,而没有test sets。这种情况也是允许的,只要算法模型没有对dev sets过拟合。但是,条件允许的话,最好是有test sets,实现无偏估计

1.7 什么时候该改变验证集/测试集和指标?——什么时候应该更改目标?

算法模型的评价标准有时候需要根据实际情况进行动态调整,目的是让算法模型在实际应用中有更好的效果。可能在项目进行的过程中,你可能意识到目标的位置放错了,靶心的位置放错了,这种情况下,你应该移动你的目标!

比如,你的猫分类器,使用的指标是分类错误率,但是部署算法A,用户会看到更多猫图,但是同时也会给用户推送一些色情图像比如抖音的推荐系统,这是公司和用户都不能接受的!用公司和用户的角度看,B算法虽然拥有更高的错误率,这样分类器得到的猫图像较少,但是它不会推送色情图像,所以从公司和用户的角度,算法B是更好的!

举个猫类识别的例子。初始的评价标准是错误率,算法A错误率为3%,算法B错误率为5%。显然,A更好一些。但是,实际使用时发现算法A会通过一些色情图片,但是B没有出现这种情况。从用户的角度来说,他们可能更倾向选择B模型,虽然B的错误率高一些。这时候,我们就需要改变之前单纯只是使用错误率作为评价标准而考虑新的情况进行改变例如增加色情图片的权重,增加其代价

当这种情况发生时,原来的评价指标无法正确衡量算法之间的优劣排序时,在这种情况下,就应该改变评价指标,或者改变验证集或测试集了。如果你的评价指标无法正确评估好算法的排名,那么就需要花时间重新定义一个新的评价指标。评价指标的意义在于,准确的告诉你已知两个分类器,哪一个更适合你的应用。此时,可以将分类错误率指标写成如下:

用error统计分类错误的样本。这个指标的问题在于,对于色情图片和非色情图片一视同仁。所以为了加大对色情图片的惩罚,修改评价指标的方法如下,加一个权重项,赋予色情图片更大的权重,加大惩罚。

这里是如何定义一个评价指标帮助我们更好的把分类器排序,能够区分两个分类器识别色情图像时的水平,实际上这就是一个正交化的例子。

在处理机器学习的问题时,应该切分成独立的步骤。也就是说,第一步是找靶心,第二步是通过训练,射中靶心。但是在训练的过程中可能会根据实际情况改变算法模型的评价标准,进行动态调整。另外一个需要动态改变评价标准的情况是dev/test sets与实际使用的样本分布不一致。比如猫类识别样本图像分辨率差异。

机器学习任务的两个步骤:

  • 1.如何定义一个指标来衡量你想要的做的事情的表现——设定目标,定义你要瞄准的目标

  • 2.如何改善系统在这个指标上的表现?——调试算法的表现

  • 3.在逼近目标的时候,可以修改目标,引入一些权重。

如何定义代价函数并不重要,关键在于正交化的思路。所以定义指标是第一步,然后是如何优化系统来提高这个指标评分,如改变神经网络要优化的代价函数。

  • 如果你当前的指标和当前用来评估的数据和你真正使用场景的数据关系不大,那么就应该改变指标或者验证集,使得分布一致。
  • 有一个验证集和评价指标可以帮助你更快的决策哪个模型更好,也可加速研发和产品迭代的速度。
  • 所以定义评价指标和验证集是至关重要的第一步!
  • 即使当前无法定义出一个完美的评价指标和验证集,你直接快速设立出来,然后用它来驱动团队的迭代速度。在这之后,如果发现选的不好,有了更好的想法那么可以立即改。建议最好不要在没有评价指标和验证集时跑太久,这样会减慢团队的迭代和算法优化的速度。

1.8 可避免的偏差

实际应用中,要看human-level error,training error和dev error的相对值。例如猫类识别的例子中,如果human-level error为1%,training error为8%,dev error为10%。由于training error与human-level error相差7%,dev error与training error只相差2%,所以目标是尽量在训练过程中减小training error,即减小偏差bias。如果图片很模糊,肉眼也看不太清,human-level error提高到7.5%。这时,由于training error与human-level error只相差0.5%,dev error与training error只相差2%,所以目标是尽量在训练过程中减小dev error,即方差variance。这是相对而言的。

对于物体识别这类CV问题,human-level error是很低的,很接近理想情况下的bayes optimal error。因此,上面例子中的1%和7.5%都可以近似看成是两种情况下对应的bayes optimal error。实际应用中,我们一般会用human-level error代表bayes optimal error。

通常,我们把training error与human-level error之间的差值称为bias,也称作avoidable bias;把dev error与training error之间的差值称为variance。根据bias和variance值的相对大小,可以知道算法模型是否发生了欠拟合或者过拟合。

对于CV类问题,human-level erorr是很低的,所以一般都要降低traing error即偏差,然后降低test error即方差。

1.9 理解人类的表现

我们说过human-level performance能够代表bayes optimal error。但是,human-level performance如何定义呢?举个医学图像识别的例子,不同人群的error有所不同:

  • Typical human : 3% error
  • Typical doctor : 1% error
  • Experienced doctor : 0.7% error
  • Team of experienced doctors : 0.5% error

不同人群他们的错误率不同。一般来说,我们将表现最好的那一组,即Team of experienced doctors作为human-level performance。那么,这个例子中,human-level error就为0.5%。但是实际应用中,不同人可能选择的human-level performance基准是不同的,这会带来一些影响。

假如该模型training error为0.7%,dev error为0.8。如果选择Team of experienced doctors,即human-level error为0.5%,则bias比variance更加突出。如果选择Experienced doctor,即human-level error为0.7%,则variance更加突出。也就是说,选择什么样的human-level error,有时候会影响bias和variance值的相对变化。当然这种情况一般只会在模型表现很好,接近bayes optimal error的时候出现。越接近bayes optimal error,模型越难继续优化,因为这时候的human-level performance可能是比较模糊难以准确定义的

1.12. Improving your model performance

提高机器学习模型性能主要要解决两个问题:avoidable bias和variance。我们之前介绍过,training error与human-level error之间的差值反映的是avoidable bias,dev error与training error之间的差值反映的是variance。

解决avoidable bias的常用方法包括:实现对训练集的拟合很好

  • Train bigger model 尝试更复杂的模型
  • Train longer/better optimization algorithms: momentum, RMSprop, Adam 尝试更好的优化方法
  • NN architecture/hyperparameters search 尝试更好的新的神经网络后者调试更好的超参数

解决variance的常用方法包括:实现模型的泛化能力很好

  • More data 尝试更多的数据去训练,可以更好的推广到系统看不到的验证集数据
  • Regularization: L2, dropout, data augmentation 尝试正则化,或者数据增强
  • NN architecture/hyperparameters search 尝试不同的神经网络和调试更好的参数
     

《构建机器学习项目下》

2.1 进行误差分析

  • 这个过程类似于去找最大的共性问题!找收益最大的共性问题,找优先级最高的问题!——error analysis错误分析
  • 手动去统计Hard example里面的数据,初步分析,可以节省大量的时间,让我们专注解决影响模型效率的主要问题,十分重要!
  • 统计不同错误标记类型占总数的百分比,可以帮你发现哪些问题是需要优先解决的,或者给你构思新优化方向的灵感。

对已经建立的机器学习模型进行错误分析(error analysis)十分必要,而且有针对性地、正确地进行error analysis更加重要

举个例子,猫类识别问题,已经建立的模型的错误率为10%。为了提高正确率,我们发现该模型会将一些狗类图片错误分类成猫。

一种常规解决办法是扩大狗类样本,增强模型对够类(负样本)的训练。但是,这一过程可能会花费几个月的时间,耗费这么大的时间成本到底是否值得呢?也就是说扩大狗类样本,重新训练模型对提高模型准确率到底有多大作用?这时候我们就需要进行error analysis,帮助我们做出判断。

方法很简单,我们可以从分类错误的样本中统计出狗类的样本数量。根据狗类样本所占的比重,判断这一问题的重要性。假如狗类样本所占比重仅为5%,即时我们花费几个月的时间扩大狗类样本,提升模型对其识别率改进后的模型错误率最多只会降低到9.5%。相比之前的10%,并没有显著改善。我们把这种性能限制称为ceiling on performance性能上线。相反,假如错误样本中狗类所占比重为50%,那么改进后的模型错误率有望降低到5%,性能改善很大。因此,值得去花费更多的时间扩大狗类样本

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

手动去看hard example到底是什么样的非常重要,这个简单的人工统计步骤、错误分析,可以节省大量时间,可以迅速决定什么是最重要的,或者最有希望的方向。

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

  • Fix pictures of dogs being recognized as cats
  • Fix great cats(lions, panthers, etc…) being misrecognized
  • Improve performance on blurry images

通常来说,比例越大,影响越大,越应该花费时间和精力着重解决这一问题。这种error analysis让我们改进模型更加有针对性,从而提高效率。

这个就是要对hard example进行手工统计和分析!统计不同错误标记类型占总数的百分比,可以帮你发现哪些问题是需要优先解决的,或者给你构思新优化方向的灵感。

2.2 清除错误标注的数据

  • 如果label标记错误是随机的,则可以忽略。但如果是系统错误,则会降低模型性能!必须要解决。
  • 人工去看100个或几百个样本来统计错误数量,虽然很繁琐,但是Ng经常这么做,这样才能知道机器学习系统所犯的错误,亲自去看看这些数据,尝试和一部分错误做斗争。可能就因为花了这几分钟或者几小时亲自去统计数据,真的可以帮你找到需要优先处理的人物,花时间亲自检查数据非常值得!
  • 你在搭建自己的机器学习系统时要经常去检查错误的数据,然后确定应该优先尝试哪些想法或者哪些方向?

监督式学习中,训练样本有时候会出现输出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,还是可以忽略。举例说明,若:

  • Overall dev set error: 10%
  • Errors due incorrect labels: 0.6%
  • Errors due to other causes: 9.4%

上面数据表明Errors due incorrect labels所占的比例仅为0.6%,占dev set error的6%,而其它类型错误占dev set error的94%。因此,这种情况下,可以忽略incorrectly labeled data。

如果优化DL算法后,出现下面这种情况:

  • Overall dev set error: 2%
  • Errors due incorrect labels: 0.6%
  • Errors due to other causes: 1.4%

上面数据表明Errors due incorrect labels所占的比例依然为0.6%,但是却占dev set error的30%,而其它类型错误占dev set error的70%。因此,这种情况下,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 训练集和验证集可能来自于稍微不同的分布

如果你的训练数据中有些是标记错误的了,有没有必要去修复它们呢?

  • 深度学习对训练集中的随机错误是相当鲁棒的。如果错误足够随机,不需要花太多时间去修复它们。

如果验证集中出现了标记错误,怎么办?

  • 统计验证集中所有分类错误的样本所占的比例,根据该比例的带下,决定是否需要修正所有的错误标记,还是说是可以忽略的。

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

一般来说,几乎所有的机器学习程序可能可以从50个不同的方向进行优化,并且每个方向都是相对合理的可以改善你的系统。但是挑战在于你如何选择一个方向击中精力处理。

  • (1):快速搭好第一个系统,然后开始迭代。即快速设立验证集和测试集还有评价指标,这样就决定了你的目标所在。如果目标定错了,之后改也是可以的。set up dev/test set and metric
  • (2):然后马上搭建一个机器学习系统,找一个训练集训练一下看看效果,开始理解你的算法表现如何,在验证集上,你的评价指标表现如何。然后马上就可以用到偏差方差分析,以及错误分析,来确定下一步优先做什么。错误分析会让你了解到下一步优先做什么。build initial system quickly
  • (3):use Bias/Variance analysis & error analysis to prioritize next steps

2.4 训练集和测试集来自不同的分布

当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这样保证了验证集最接近实际应用场合。这种方法较为常用,而且性能表现比较好。

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

  • 为了确定泛化能力差的原因是否是验证集和训练集分布不一致导致的,将训练集打乱,分出一部分训练集的数据不做训练而做验证,这样就可以反映variance了。

 我们之前介绍过,根据human-level error、training error和dev error的相对值可以判定是否出现了bias或者variance。但是,需要注意的一点是,如果train set和dev/test set来源于不同分布,则无法直接根据相对值大小来判断。例如某个模型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下降的情况。这主要可能是因为训练样本比验证/测试样本更加复杂,难以训练

  • 上述排序的误差数值应该是递增的。验证集和测试集是同分布的,所以验证集好,而测试集很差,很可能是对验证集过拟合了,所以要增加验证集的数据。


2.6 处理数据不匹配的问题

关于如何解决train set与dev/test set样本分布不一致的问题,有两条建议:

  • Carry out manual error analysis to try to understand difference between training dev/test sets 做错误分析,看看训练集和测试集的数据分布到底有什么不同
  • Make training data more similar; or collect more data similar to dev/test sets 是否有办法收集更多看起来像验证集的数据做训练

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

使用人工合成数据时一定要谨慎,有可能从所有可能性的空间中只选了很小一部分去模拟数据。如车的识别,现实世界里的车辆的设计可不止游戏中的20中,如果你用着20辆独特的车合成的照片去训练胸膛,那么你的神经网络可能会过拟合,但人类很难分辨出来。即使这些图像看起来很逼真,你可能真的只用了所有可能出现的车辆的很小的子集。

2.7 迁移学习

神经网络从任务A中学习到的知识可以应用到任务B中。比如只需要将任务A的输出层去掉,然后把进入最后一层的权重去掉,然后赋予随机权重,就可以在任务B的数据上进行训练了。

  • 如果任务B的数据量很小,你可能只需要重新训练最后一层的权重,其他参数保持不变

  • 如果任务B的数据量很大,也许你可以重新训练网络中的所有参数,称为pre-training。fine tuning微调是以后更新所有权重

  • 为什么迁移学习会有用呢?

    • 有很多低层次特征,如边缘检测、曲线检测、positive objects检测,从非常大的图像识别数据库汇总学习到的这些能力可能有助于你的学习算法在你的任务B中做的更好。算法学习到了更多的结构信息,图像形状的信息,其中一些知识可能会很有用,它学会了图像识别,学到了足够的信息,可以了解不同图像的组成部分是怎样的,这些知识可能帮助你的任务B学习的更快,或者需要更少的学习数据

  • 迁移学习什么时候有意义呢?

    • 迁移学习起作用的场合是:任务A中有很多数据,但是任务B中没有那么多的数据。任务A中的数据特别多,假设1百万个样本,那么任务A可以学习低层次特征,可以在神经网络的前面几层学习到很多有用的特征。但是任务B只有几百个样本,数据较少,所以从任务A中学习到的很多知识可以迁移,并去帮助到任务B,即使任务B的数据量很小。

    • 迁移学习适用于从数据量很多的问题迁移到数据量很小的问题上,但是反之则不行!

    • 如果你想从任务A中学习并迁移一些知识到任务B,那么当任务A和B都有同样的输入x时,迁移学习是有意义的。如AB都是图像,或AB都是音频。

    • 当任务A的数据比任务B多得多时,迁移学习意义更大。因为任务A里单个样本的价值并没有任务B单个样本的价值大。

    • 如果你觉得任务A的低层次特征可以帮助任务B的学习,那迁移学习更有意义一些。

2.8 多任务学习

顾名思义,多任务学习(multi-task learning)就是构建神经网络同时执行多个任务,然后希望这里的每个任务都能帮助到其他所有任务

  • 比如你要知道每张图片里面是否有行人、汽车、停车标志或交通灯,多个物体可能同时出现在一张图里。你不只是给图片一个标签,而是要遍历不同类型,然后看每个类型,那类物体有没有出现在图片中。
  • 建立单个神经网络,观察每张图,解决四个问题,系统输出这张图里是否有这四个物体。而不是分别训练4个网络,而是一个网络做4件事情。
  • 为什么可以这么做?
    • 因为神经网络的一些早期特征,在识别不同物体时会用到,然后你发现训练一个神经网络做四件事情会比训练四个完全独立的神经网络分别做四件事情要更好,这就是多任务学习的力量。
  • 这跟二元分类或者多元分类都不同,多任务学习类似将多个神经网络融合在一起,用一个网络模型来实现多种分类效果。如果有C个,那么输出y的维度是(C,1)。例如汽车自动驾驶中,需要实现的多任务为行人、车辆、交通标志和信号灯。

  • 多任务学习什么时候有意义呢?

    • (1)如果你训练的一组任务可以共用低层次特征,比如无人驾驶同时识别交通灯、汽车和行人。这些物体有相似的特征。

    • (2)这个准则没有那么绝对。如果每个任务的数据量都很接近,那么其他任务的数据量会有助于特征的识别,其他任务加起来有比单个任务大得多的数据量。

    • (3)当你可以训练一个足够大的神经网络,同时做好所有的工作。

  • 多任务学习在以下一种情况下会降低性能——就是你的神经网络还不够大。这样多任务学习会比你训练单个神经网络的性能低。

  • 如果你可以训练一个足够大的神经网络,那么多任务学习肯定不会降低性能或很少降低性能。这比单独训练神经网络来单独完成各个任务性能要好的多。

  • 在物体检测等计算机视觉中,一个神经网络尝试检测一大堆物体,比分别训练不同的神经网络检测物体更好。平均来说,迁移学习使用频率比多任务学习的概率要高。

2.9 端到端的深度学习

端到端的深度学习只需要把训练集拿过来,直接学习到了x和y之间的函数映射,直接绕过了其中很多步骤。

端到端的深度学习的挑战之一是:需要大量数据才能让系统表现良好,当你拥有非常大的数据集时,端到端的方法突然开始很厉害了。当数据量较小的时候,传统的流水线方法效果确实不错,通常做的更好。但是大数据集才能让端到端方法真正发挥作用。

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

比如人脸识别:第一步运行一个软件来检测人脸,然后将检测到的人脸的那部分放大,并裁剪图像,使得人脸居中,再喂到神经网络里让网络去学习,或者估计这个人的身份。

把任务分解的话,就会有很多现成的数据可以做,但是想一步到位的话,就比较的困难了。比如(1)人脸识别,如何从一张图中找到人脸,这个已经很成熟了;(2)如何从大头照中确认这个人是否是员工,这个也比较成熟了,有很多数据。但是想一步到位的话,数据就没有了。因为你没有足够多的数据去解决这个端到端的学习问题,但是你有足够多的数据来解决子问题1和子问题2。

  • 端到端的深度学习是可行的,表现可以很好,也可以简化系统架构,不需要搭建那么多手工设计的单独组建。

  • 但也不是什么灵丹妙药

2.10 是否要使用端到端的深度学习

好处:

  • (1)让数据说话,只要有足够多的数据,不管从x到y的函数映射是什么。
  • (2)不需要人工设计中间组件

缺点:

  • (1)需要大量的数据
  • (2)排除了可能有用的人工设计组件,但如果你的数据量不够大,学习算法就没有办法从训练数据中获得洞察力。无法吸引入人工的先验。

当你有大量的数据时,手工设计的东西就不太重要了。但是当你没有太多的数据时,构造一个精心设计的系统,实际上可以将人类对这个问题的很多认知直接注入到问题里,进入算法里应该挺有帮助的。

谈论纯端到端深度学习方法是很激动人心,但是就目前能收集到的数据而言,还有我们今天能够用神经网络学习的数据类型而言,这实际上不是最有希望的方法,或者说这个方法并不是团队想出的最好用的方法。这种纯粹的端到端的深度学习方法,其实前景不如这样更复杂的多步方法,因为目前收集到的数据,还有我们现在训练神经网络的能力是有局限的。

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值