吴恩达深度学习课程第三课笔记——结构化机器学习项目

文章目录

  • 第三门课 结构化机器学习项目(Structuring Machine Learning Projects)
    • 第一周 机器学习(ML)策略(1)(ML strategy(1))
      • 1.1 为什么是 ML 策略?(Why ML Strategy?)
      • 1.2 正交化(Orthogonalization)
      • 1.3 单一数字评估指标(Single number evaluation metric)
      • 1.4 满足指标和优化指标(Satisficing and optimizing metrics)
      • 1.5 训练 / 开发 / 测试集划分(Train/dev/test distributions)
      • 1.6 开发集和测试集的大小(Size of dev and test sets)
      • 1.7 什么时候该改变开发 / 测试集和指标?(When to change dev/test sets and metrics)
      • 1.8 为什么是人的表现?(Why human-level performance?)
      • 1.9 可避免偏差(Avoidable bias)
      • 1.10 理解人的表现(Understanding human-level performance)
      • 1.11 超过人的表现(Surpassing human- level performance)
      • 1.12 改善你的模型的表现(Improving your model performance)
    • 第二周:机器学习策略(2)(ML Strategy (2))
      • 2.1 进行误差分析(Carrying out error analysis)
      • 2.2 清除标注错误的数据(Cleaning up Incorrectly labeled data)
      • 2.3 快速搭建你的第一个系统,并进行迭代(Build your first system quickly, then iterate)
      • 2.4 使用来自不同分布的数据,进行训练和测试(Training and testing on different distributions)
      • 2.5 数据分布不匹配时,偏差与方差的分析(Bias and Variance with mismatched data distributions)
      • 2.6 处理数据不匹配问题(Addressing data mismatch)
      • 2.7 迁移学习(Transfer learning)
      • 2.8 多任务学习(Multi-task learning)
      • 2.9 什么是端到端的深度学习?(What is end-to-end deep learning?)
      • 2.10 是否要使用端到端的深度学习?(Whether to use end-to-end learning?)

第三门课 结构化机器学习项目(Structuring Machine Learning Projects)

第一周 机器学习(ML)策略(1)(ML strategy(1))

1.1 为什么是 ML 策略?(Why ML Strategy?)

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

Collect more data

Collect more diverse training set

Train algorithm longer with gradient descent

Try Adam instead of gradient descent

Try bigger network

Try smaller network

Try dropout

Add L2 regularization

Network architecture: Activation functions, #hidden units…

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

1.2 正交化(Orthogonalization)

控制变量法,让自己的优化有迹可循,多变量变化就不知道是哪个起作用了。

机器学习中有许多参数、超参数需要调试。通过每次只调试一个参数,保持其它参数不变,而得到的模型某一性能改变是一种最常用的调参策略,我们称之为正交化方法(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 等优化算法来实现;第二条优化验证集可以通过正则化,采用更多训练样本来实现;第三条优化测试集可以通过使用更多的验证集样本来实现;第四条提升实际应用模型可以通过更换验证集,使用新的 cost function 来实现。概括来说,每一种 “功能” 对应不同的调节方法。而这些调节方法(旋钮)只会对应一个 “功能”,是正交的。

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

1.3 单一数字评估指标(Single number evaluation metric)

构建、优化机器学习模型时,单值评价指标非常必要。有了量化的单值评价指标后,我们就能根据这一指标比较不同超参数对应的模型的优劣,从而选择最优的那个模型。

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

分类器效果

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

参考链接

True Positive (真正,TP):将正类预测为正类数

True Negative (真负,TN):将负类预测为负类数

False Positive (假正,FP):将负类预测为正类数误报 (Type I error)

False Negative (假负,FN):将正类预测为负类数→漏报 (Type II error)
P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP

R e c a l l = T P T P + F N Recall=\frac{TP}{TP+FN} Recall=TP+FNTP

F 1 = 2 P R P + R F1=\frac{2PR}{P+R} F1=P+R2PR

然后得到了 A 和 B 模型各自的 F1 Score:

F1 Score

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

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

平均值评估

1.4 满足指标和优化指标(Satisficing and optimizing metrics)

有时候,要把所有的性能指标都综合在一起,构成单值评价指标是比较困难的。解决办法是,我们可以把某些性能作为优化指标(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)只要满足设定的阈值就好了。

1.5 训练 / 开发 / 测试集划分(Train/dev/test distributions)

Train/dev/test sets 如何设置对机器学习的模型训练非常重要,合理设置能够大大提高模型训练效率和模型质量。

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

学习的靶心和目标的靶心偏离

1.6 开发集和测试集的大小(Size of dev and test sets)

在之前的课程中我们已经介绍过,当样本数量不多(小于一万)的时候,通常将 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 能够反映出模型在实际中的表现

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

1.7 什么时候该改变开发 / 测试集和指标?(When to change dev/test sets and metrics)

算法模型的评价标准有时候需要根据实际情况进行动态调整,目的是让算法模型在实际应用中有更好的效果。

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

原来的 cost function:
J = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) J=\frac1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)}) J=m1i=1mL(y^(i),y(i))
更改评价标准后的 cost function:
J = 1 w ( i ) ∑ i = 1 m w ( i ) L ( y ^ ( i ) , y ( i ) ) J=\frac{1}{w^{(i)}}\sum_{i=1}^mw^{(i)}L(\hat y^{(i)},y^{(i)}) J=w(i)1i=1mw(i)L(y^(i),y(i))

w ( i ) = { 1 , x ( i )   i s   n o n − p o r n 10 , x ( i )   i s   p o r n w^{(i)}=\begin{cases} 1, & x^{(i)}\ is\ non-porn\\ 10, & x^{(i)}\ is\ porn \end{cases} w(i)={ 1,10,x(i) is nonpornx(i) is porn

概括来说,机器学习可分为两个过程:

  • Define a metric to evaluate classifiers
  • How to do well on this metric

也就是说,第一步是找靶心,第二步是通过训练,射中靶心。但是在训练的过程中可能会根据实际情况改变算法模型的评价标准,进行动态调整。

另外一个需要动态改变评价标准的情况是 dev/test sets 与实际使用的样本分布不一致。比如猫类识别样本图像分辨率差异。

训练验证集和显示测试集分布不同

1.8 为什么是人的表现?(Why human-level performance?)

机器学习模型的表现通常会跟人类水平表现作比较,如下图所示:

机器表现与人类水平

图中,横坐标是训练时间,纵坐标是准确性。机器学习模型经过训练会不断接近 human-level performance 甚至超过它。但是,超过 human-level performance 之后,准确性会上升得比较缓慢,最终不断接近理想的最优情况,我们称之为 bayes optimal error。理论上任何模型都不能超过它,bayes optimal error 代表了最佳表现。

机器学习的进展往往相当快,直到你超越人类的表现之前一直很快,当你超越人类的表现时,有时进展会变慢,主要由两个原因:

  1. 人类水平在很多任务中离贝叶斯最优错误率已经不远了,当你超越人类的表现之后也许没有太多的空间继续改善了。
  2. 只要你的表现比人类的表现更差,那么实际上可以使用某些工具来提高性能。一旦你超越了人类的表现,这些工具就没那么好用了。(人工标注、人工错误率分析、更好地理解偏差/方差)

1.9 可避免偏差(Avoidable bias)

实际应用中,要看 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 值的相对大小,选择接下来优化的方向是 bias 还是 variance

1.10 理解人的表现(Understanding human-level performance)

我们说过 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.11 超过人的表现(Surpassing human- level performance)

对于自然感知类问题,例如视觉、听觉等,机器学习的表现不及人类。但是在很多其它方面,机器学习模型的表现已经超过人类了,包括:

  • Online advertising
  • Product recommendations
  • Logistics(predicting transit time)
  • Loan approvals

实际上,机器学习模型超过 human-level performance 是比较困难的。但是只要提供足够多的样本数据,训练复杂的神经网络,模型预测准确性会大大提高,很有可能接近甚至超过 human-level performance。值得一提的是当算法模型的表现超过 human-level performance 时,很难再通过人的直觉来解决如何继续提高算法模型性能的问题。因为不知道真正的 bayes optimal error 是多少,也就不知道该优化 bias 还是 variance。

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)(ML Strategy (2))

2.1 进行误差分析(Carrying out error analysis)

类似混淆矩阵的思想,快速分析误差的原因并进行针对性的优化

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

举个例子,猫类识别问题,已经建立的模型的错误率为 10%。为了提高正确率,我们发现该模型会将一些狗类图片错误分类成猫。一种常规解决办法是扩大狗类样本,增强模型对够类(负样本)的训练。但是,这一过程可能会花费几个月的时间,耗费这么大的时间成本到底是否值得呢?也就是说扩大狗类样本,重新训练模型,对提高模型准确率到底有多大作用?这时候我们就需要进行 error analysis,帮助我们做出判断。

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

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

这种 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 让我们改进模型更加有针对性,从而提高效率。

2.2 清除标注错误的数据(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,还是可以忽略。举例说明,若:

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 快速搭建你的第一个系统,并进行迭代(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

我鼓励你们搭建快速而粗糙的实现,然后用它做偏差 / 方差分析,用它做错误分析,然后用分析结果确定下一步优先要做的 方向。

2.4 使用来自不同分布的数据,进行训练和测试(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 分布不同的情况,有两种解决方法。

  1. 完全混合,随机分配。不符合现实情况,效果不好

第一种方法是将 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 图片所占比重很小,达不到验证效果。因此,这种方法并不是很好。

  1. dev/test set 分一部分给 train set,dev/test set 剩下的作为 dev/test set

第二种方法是将原来的 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 数据分布不匹配时,偏差与方差的分析(Bias and Variance with mismatched data distributions)

数据分布不匹配时分布也可能是影响模型效果,不能确定是否是 variance 的问题。分布不匹配时再分出 train-dev set,同分布下看训练集的 variance 问题。training-dev error 与 dev error 的差值看 data mismatch 问题。

我们之前介绍过,根据 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,即样本分布不一致。

总结一下 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 处理数据不匹配问题(Addressing data mismatch)

手动分析理解训练接和验证集/测试集分布的不同;增加验证集/测试集分布的数据给训练集

人工数据合成有一个问题在于只用一个小的数据集去合成大的数据集(人类无法辨别)是否会让模型对小数据集过拟合?

关于如何解决 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 上人工添加背景噪声,合成类似实际场景的声音。这样会让模型训练的效果更准确。但是,需要注意的是,我们不能给每段语音都增加同一段背景噪声,这样会出现对背景噪音的过拟合,效果不佳。这就是人工数据合成需要注意的地方。

2.7 迁移学习(Transfer learning)

相同类型输入下,目标数据比较少时,可以用数据多的模型进行修改弥补数据不足难以很好地提取特征的问题。应用场合的三点:相同输入、量级碾压、特征相同(相似)

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

如果我们已经有一个训练好的神经网络,用来做图像识别。现在,我们想要构建另外一个通过 X 光片进行诊断的模型。迁移学习的做法是无需重新构建新的模型,而是利用之前的神经网络模型,只改变样本输入、输出以及输出层的权重系数 W [ L ] ,   b [ L ] W^{[L]},\ b^{[L]} W[L], b[L]。也就是说对新的样本 (X,Y),重新训练输出层权重系数 W [ L ] ,   b [ L ] W^{[L]},\ b^{[L]} W[L], b[L],而其它层所有的权重系数 W [ l ] ,   b [ l ] W^{[l]},\ b^{[l]} W[l], b[l] 保持不变。

迁移学习示例

迁移学习,重新训练权重系数,如果需要构建新模型的样本数量较少,那么可以像刚才所说的,只训练输出层的权重系数 W [ L ] ,   b [ L ] W^{[L]},\ b^{[L]} W[L], b[L],保持其它层所有的权重系数 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]} W[l], b[l] 的过程称为 fine-tuning。pre-training 和 fine-tuning 分别对应上图中的黑色箭头和红色箭头。

pre-training 和 fine-tuning

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

  • 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.(图像检测中边缘检测、语音识别中声波频率)

2.8 多任务学习(Multi-task learning)

多任务学习是使用单个神经网络模型来实现多个任务(如图片识别),使用频率不如迁移学习。

顾名思义,多任务学习(multi-task learning)就是构建神经网络同时执行多个任务。这跟二元分类或者多元分类都不同,多任务学习类似将多个神经网络融合在一起,用一个网络模型来实现多种分类效果。如果有 C 个,那么输出 y 的维度是 (C,1)。例如汽车自动驾驶中,需要实现的多任务为行人、车辆、交通标志和信号灯。如果检测出汽车和交通标志,则 y 为:
y = [ 0 1 1 0 ] y= \left[ \begin{matrix} 0\\ 1\\ 1\\ 0 \end{matrix} \right] y=0110
多任务学习模型的 cost function 为:
1 m ∑ i = 1 m ∑ j = 1 c L ( y ^ j ( i ) , y j ( i ) ) \frac1m\sum_{i=1}^m\sum_{j=1}^cL(\hat y_j^{(i)},y_j^{(i)}) m1i=1mj=1cL(y^j(i),yj(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)}) L(y^j(i),yj(i))=yj(i)log y^j(i)(1yj(i))log (1y^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.

顺便提一下,迁移学习和多任务学习在实际应用中,迁移学习使用得更多一些。

2.9 什么是端到端的深度学习?(What is end-to-end deep learning?)

有些场景端到端学习可以得到很好的效果,省略手工设计,但是有的场景因为数据不够多,还是需要 multi-step 的过程来过渡(或者效果已经很好了)

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

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

端到端学习

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

2.10 是否要使用端到端的深度学习?(Whether to use end-to-end learning?)

手工设计是一把双刃剑,可能对模型效果有提升也可能让机器学习无用的特征。有大量数据时可以考虑端到端,但是数据量少的时候(比如比赛)特征工程还是很重要的。

end-to-end 深度学习有优点也有缺点。

优点:

  • Let the data speak
  • Less hand-designing of components needed

缺点:

  • May need large amount of data
  • Excludes potentially useful hand-designed

参考链接

b 站视频

中文笔记

红色石头笔记

你可能感兴趣的:(nlp,深度学习,吴恩达学习笔记,神经网络,深度学习)