【吴恩达深度学习笔记】3.2机器学习策略Machine Learning strategy
第三门课 结构化机器学习项目(Structuring Machine Learning Projects)
2.1进行误差分析(Carrying out error analysis)
进行错误分析应该找一组错误样本,可能在开发集里或者测试集里,观察错误标记的样本,看看假阳性(false positives)和假阴性(false negatives),统计属于不同错误类型的错误数量。在这个过程中归纳出新的错误类型。通过统计不同错误标记类型占总数的百分比,可以发现哪些问题需要优先解决,或者给你构思新优化方向的灵感。
2.2清除标注错误的数据(Cleaning up Incorrectly labeled data)
深度学习算法对随机误差很健壮(robust),但对系统性的错误就没那么健壮了。如果做标记的人一直把白色的狗标记成猫,那就成问题了。因为你的分类器学习之后,会把所有白色的狗都分类为猫。但随机错误或近似随机错误,对于大多数深度学习算法来说不成问题。
开发集的主要目的是用它来从两个分类器 A A A和 B B B中选择一个。如果要去修正开发集数据,手动重新检查标签,并尝试修正一些标签,还有一些额外的方针和原则需要考虑。开发和测试集必须来自相同的分布。修正训练集中的标签相对没那么重要,你可能决定只修正开发集和测试集中的标签,因为它们通常比训练集小得多。
2.3快速搭建第一个系统并迭代(Build your first system quickly, then iterate)
搭建快速而粗糙(quick and dirty implementation)的实现,然后用它做偏差/方差分析,用它做错误分析,然后用分析结果确定下一步优先要做的方向。
2.4使用来自不同分布的数据进行训练和测试(Training and testing on different distributions)
训练集比如是205,000张图片,训练集是来自网页下载的200,000张图片(清晰),再加上5000张来自手机上传的图片(模糊不易辨别)。开发集和测试集都是手机图,开发集是2500张来自应用的图片,测试集也是2500张来自应用的图片。这样将数据分成训练集、开发集和测试集的好处在于,瞄准的目标就是想要处理的目标,开发集包含的数据全部来自手机上传,这是真正关心的图片分布。缺点在于训练集分布和开发集、测试集分布并不一样。但事实证明,这样把数据分成训练、开发和测试集,在长期能带来更好的系统性能。
2.5数据分布不匹配时偏差与方差的分析(Bias and Variance with mismatched data distributions)
训练集来自和开发集、测试集不同分布时,分析偏差和方差的方式可能不一样。随机打散训练集,然后分出一部分训练集作为训练-开发集(training-dev),不用来训练网络。开发集和测试集来自相同的分布,但训练集来自不同的分布,训练集、训练-开发集也来自同一分布。为了进行误差分析,看看分类器在训练集上的误差,训练-开发集上的误差,还有开发集上的误差。
Training error | Training-dev error | Dev error | Test error | Conclusion |
---|---|---|---|---|
1% | 9% | 10% | \ | 算法存在方差问题,无法泛化推广到来自同一分布但以前没见过的数据中 |
1% | 1.5% | 10% | \ | 数据不匹配的问题,算法擅长处理和你关心的数据不同的分布 |
10% | 11% | 12% | \ | 存在可避免偏差问题,算法做的比人类水平差很多 |
10% | 11% | 20% | \ | 可避免偏差相当高,方差似乎很小,但数据不匹配问题很大 |
2.6处理数据不匹配问题(Addressing data mismatch)
训练集来自和开发测试集不同的分布,如果错误分析显示你有一个数据不匹配的问题该怎么办?如果存在数据不匹配问题建议做错误分析,或者看看训练集,或者看看开发集,找出这两个数据分布有什么不同,然后看看是否有办法收集更多看起来像开发集的数据作训练,即让训练数据更接近开发集。可以利用的其中一种技术是人工合成数据(artificial data synthesis)。人工数据合成有一个潜在问题就是有可能从所有可能性的空间只选了很小一部分去模拟数据,最终会产生过拟合。
AI测试中经常使用“The quick brown fox jumps over the lazy dog”,这个短句包含了从a到z所有字母。
2.7迁移学习(Transfer learning)
深度学习中,最强大的理念之一就是,有时神经网络可以从一个任务中习得知识,并将这些知识应用到另一个独立的任务中,这就是迁移学习。把神经网络最后的输出层拿走(删掉),进入到最后一层的权重也删掉,为最后一层重新赋予随机权重,然后让它在新任务的数据上训练。
如果你重新训练神经网络中的所有参数,在旧任务数据的初期训练阶段,有时称为预训练(pre-training),因为是在用旧任务的数据去预先初始化,或者预训练神经网络的权重。如果更新所有权重,然后在新任务数据上训练,此过程叫微调(fine tuning)。有很多低层次特征,比如边缘检测、曲线检测、阳性对象检测(positive objects),从非常大的图像识别(旧任务)数据库中习得这些能力可能有助于你的学习算法在放射科诊断(新任务)中做得更好,算法学到了很多结构信息,图像形状的信息,其中一些知识可能会很有用,所以学会了图像识别,它就可能学到足够多的信息,可以了解不同图像的组成部分是怎样的,学到线条、点、曲线这些知识,也许对象的一小部分,这些知识有可能帮助放射科诊断网络学习更快一些,或者需要更少的学习数据。
什么时候迁移学习是有意义的?如果你想从任务 A A A学习并迁移一些知识到任务 B B B,那么当任务 A A A和任务 B B B都有同样的输入 x x x时,迁移学习是有意义的。当任务 A A A的数据比任务 B B B多得多时,迁移学习意义更大。
2.8多任务学习(Multi-task learning)
从一个任务中学习,然后尝试迁移到另一个不同任务中。在迁移学习中步骤是串行的,从任务 A A A里学习然后迁移到任务 B B B。从多个任务中学习还有另外一个版本,就是多任务学习,从多个任务中并行学习,而不是串行学习,在训练了一个任务之后试图迁移到另一个任务。例如输入图像 x ( i ) x^{(i)} x(i),输出一个4×1向量 Y Y Y,输出包括四个节点,第一个节点是想预测图中有没有行人,第二个节点预测的是有没有车,第三个节点预测的是有没有停车标志,第四个节点预测的是有没有交通灯,所以 y ^ \hat y y^是四维的。整个训练集的平均损失: L o s s = 1 m ∑ i = 1 m ∑ j = 1 4 L ( y ^ j ( i ) , y j ( i ) ) Loss=\frac{1}{m}\sum ^m_{i=1}\sum^4_{j=1}L(\hat y^{(i)}_j,y^{(i)}_j) Loss=m1i=1∑mj=1∑4L(y^j(i),yj(i))
∑ j = 1 4 L ( y ^ j ( i ) , y j ( i ) ) \sum^4_{j=1}L(\hat y^{(i)}_j,y^{(i)}_j) ∑j=14L(y^j(i),yj(i))这些单个预测的损失,是对四个分量的求和,行人、车、停车标志、交通灯, L L L指logistic损失: 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^{(i)}_j,y^{(i)}_j)=-y^{(i)}_jlog\hat y^{(i)}_j-(1-y^{(i)}_j)log(1-\hat y^{(i)}_j) L(y^j(i),yj(i))=−yj(i)logy^j(i)−(1−yj(i))log(1−y^j(i))
整个训练集的平均损失和之前分类猫的例子主要区别在于,现在要对
j
=
1
j=1
j=1到4求和,这与softmax回归的主要区别在于softmax将单个标签分配给单个样本。这张图可以有很多不同的标签,不是说每张图都只是一张行人图片,汽车图片、停车标志图片或者交通灯图片,多个物体可能同时出现在一张图里。现在做的是建立单个神经网络,观察每张图解决四个问题,系统告诉你每张图里面有没有这四个物体。另外也可以训练四个不同的神经网络,而不是训练一个网络做四件事情。训练一个神经网络做四件事情会比训练四个完全独立的神经网络分别做四件事性能要更好,这就是多任务学习的力量。多任务学习也可以处理图像只有部分物体被标记的情况,没有标记的?求和时忽略此项。
多任务学习什么时候有意义呢?
- 如果训练一组任务,可以共用低层次特征。
- 如果每个任务的数据量很接近,那么可以增强对更小数据集任务的训练。如果想要从多任务学习得到很大性能提升,那么其他任务加起来必须要有比单个任务大得多的数据量。
- 如果可以训练一个足够大的神经网络,同时做好所有的工作,那么多任务学习肯定不会或者很少会降低性能
实际上用迁移学习比多任务学习要更多,这是因为很难找到那么多相似且数据量对等的任务可以用单一神经网络训练。
2.9什么是端到端的深度学习(What is end-to-end deep learning?)
以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它。端到端深度学习的挑战之一是需要大量数据才能让系统表现良好。端到端深度学习系统是可行的,它表现可以很好,也可以简化系统架构,不需要搭建那么多手工设计的单独组件,但它并不是每次都能成功。对于面部识别系统,两步法更好呢,有两个原因。一是每个问题实际上要简单得多。二是两个子任务的训练数据都很多。端到端深度学习在机器翻译领域非常好用,因为在今天可以收集 x − y x-y x−y对的大数据集,就是英文句子和对应的法语翻译。
2.10是否要使用端到端的深度学习(Whether to use end-to-end learning?)
是否应用端到端的深度学习需要确定是否有足够的数据能够直接学到从
x
x
x映射到
y
y
y足够复杂的函数。“必要复杂度(complexity needed)”
错题
A.取大于1000张的清晰图片来组合,这其实也是变相地让神经网络一直训练这1k噪声图,是会增加过拟合的。