深度学习-Course3-Week2机器学习策略(2)
1 误差分析
误差分析是对建立的机器学习模型进行错误分析的过程。通过正确且有针对性地进行误差分析,可以帮助我们理解模型产生错误的原因并提出相应的改进措施。
举个例子来说明,假设我们正在开发一个猫类识别模型,并且已经建立的模型的错误率为10%。我们发现该模型会将一些狗类图片错误地分类成猫。为了提高模型的正确率,一种常规解决办法是扩大狗类的样本,增强模型对狗类(负样本)的训练。
然而,这个过程可能会耗费几个月的时间,并且需要投入大量的成本。因此,我们需要进行误差分析来判断是否值得这么做,即扩大狗类样本、重新训练模型对提高模型准确率的效果有多大。
一种简单的方法是从分类错误的样本中统计狗类样本的数量,并根据其比重来判断问题的重要性。假设狗类样本仅占错误样本的5%,即使我们花费几个月的时间扩大狗类样本,改进后的模型的错误率也只能降到9.5%。与之前的10%相比,并没有得到显著的改善。这种情况下,我们将这种性能限制称为性能上限。
相反,如果错误样本中狗类的比重达到50%,那么改进后的模型的错误率有望降低到5%,改善效果很大。因此,在这种情况下,值得花费更多的时间扩大狗类样本。
误差分析的好处在于,它可以避免我们花费大量的时间和精力去解决对提高模型性能收效甚微的问题,相反,它让我们能够专注于解决影响模型正确率的主要问题。
同时,误差分析还可以评估多个影响模型性能的因素,并通过它们在错误样本中所占的比例来判断它们的重要性。例如,在猫类识别模型中,可能有以下几个影响因素:
- 修正将狗照片错误地识别为猫的问题
- 修正对大型猫类(如狮子、豹子等)的错误识别
- 提高模型对模糊图片的性能
.png)
通常情况下,比例越大,影响越大,我们就应该花费更多的时间和精力来解决这些问题。误差分析让我们能够更加有针对性地改进模型,提高工作效率。
2 数据标签不正确
在监督式学习中,训练样本中的输出(y)有时会出现错误的标注,也就是incorrectly labeled examples。
对于随机性的标注错误(random errors),深度学习算法具有较强的容错性,一般可以忽略不计,因为这些错误在整个训练集中是随机分布的,并不会对模型的性能产生显著影响。
然而,如果出现系统性错误(systematic errors),这将对深度学习算法造成较大影响,并且可能降低模型的性能。
但是,如果dev/test sets中出现了不正确的标签数据,我们该如何处理呢?这个问题可以通过进行误差分析来解决。
我们可以利用它来统计dev sets中所有分类错误的样本中,不正确标记数据(incorrectly labeled data)所占的比例。
根据该比例的大小,我们可以决定是否修正所有不正确标记的数据,或者是否可以忽略它们。举个例子,假设:
整体dev set error: 10%
不正确标记造成的错误: 0.6%
其他原因造成的错误: 9.4%
从上面的数据我们可以看出,不正确标记造成的错误仅占dev set error的6%,而其他类型的错误占了dev set error的94%。因此,在这种情况下,我们可以将不正确标记的数据忽略掉。
如果我们对深度学习算法进行优化后,出现了如下情况:
整体dev set error: 2%
不正确标记造成的错误: 0.6%
其他原因造成的错误: 1.4%
从上面的数据我们可以看出,不正确标记造成的错误仍然占dev set error的30%,而其他类型的错误占了dev set error的70%。
因此,在这种情况下,我们不能忽略不正确标记的数据,需要手动修正它们。
我们知道,dev set的主要作用是用来比较不同算法之间的性能,选择错误率最小的算法模型。
然而,如果dev/test sets中存在不正确标记的数据,当不同算法的错误率非常接近时,我们无法仅仅通过整体dev set error来判断哪个算法模型更好,必须修正不正确标记的数据。
在修正dev/test set数据时,有几条建议:
==对dev和test sets应用相同的处理方法,以确保它们来自同一分布==
考虑检查你的算法正确分类和错误分类的样本
训练集和dev/test数据可能来自稍有不同的分布,需要注意处理。
3 构建模型
对于如何构建一个机器学习应用模型,我们应该先快速构建第一个简单模型,然后再反复迭代优化。
在深度学习领域构建机器学习应用模型时,我们可以按照以下步骤进行:
1. 设置开发/测试集和评估指标
在构建模型之前,我们需要准备好开发集和测试集,并选择合适的评估指标来衡量模型的性能。开发集和测试集的划分是为了能够评估模型在未见过的数据上的表现,并且评估指标应该与我们的应用需求相匹配,例如准确率、召回率等。
2. 快速构建初始系统
接下来,我们需要快速构建一个简单的初始模型。这个初始模型可能并不是最优的,但它可以帮助我们建立一个基准来进行后续的优化。在构建初始模型时,可以使用一些基本的模型结构和算法,并进行简单的训练。
3. 使用偏差/方差分析和错误分析
在构建初始系统之后,我们需要进行进一步的优化。为了确定下一步的优化方向,我们可以使用偏差/方差分析和错误分析的方法进行评估。
偏差/方差分析:偏差是指模型在训练集上的错误率,方差是指模型在测试集上的错误率。通过分析模型的偏差和方差,我们可以了解模型的欠拟合和过拟合情况,进而针对性地进行调整。
错误分析:错误分析是对模型在开发集或测试集上的错误进行详细的分析和定位。通过错误分析,我们可以识别模型常犯的错误类型,并分析其原因,从而引导我们优化模型。
通过以上步骤,我们可以逐步改进我们的模型,不断迭代优化,最终达到更好的性能。
请注意,在进行模型训练和优化时,我们还需要注意训练集和开发/测试集的数据可能来自稍有不同的分布。因此,在进行错误分析时,我们需要注意误差的来源是否与数据分布的偏差有关,进一步确定是否需要进行数据标注的修正或其他调整。
4 训练集和测试集不同分布
在深度学习中,当训练集(train set)和验证/测试集(dev/test set)来自不同的分布时,我们需要采取一些方法来构建准确的机器学习模型。
我们以猫类识别为例,训练集来自网络下载的图片,比较清晰,而验证/测试集来自用户手机拍摄的图片,比较模糊。
_1.png)
训练集的大小为200,000,而验证/测试集的大小为10,000,即训练集远大于验证/测试集。
尽管验证/测试集的质量不高,但最终模型主要应用在对这些模糊照片的识别上。
面对训练集和验证/测试集来自不同分布的情况,有两种解决方法:
第一种方法是将训练集和验证/测试集完全混合,然后随机选择一部分作为训练集,另一部分作为验证/测试集。
比如,混合21万例样本,然后随机选择20.5万例样本作为训练集,2,500例作为验证集,2,500例作为测试集。这种方法的优点是实现训练集和验证/测试集分布一致,但缺点是验证/测试集中网络下载图片所占比例远大于手机拍摄的图片。
第二种方法是将原来的训练集和一部分验证/测试集组合作为训练集,剩下的验证/测试集分别作为验证集和测试集。
比如,20万例网络下载的图片和5,000例手机拍摄的图片组合成训练集,剩下的2,500例手机拍摄的图片作为验证集,2,500例手机拍摄的图片作为测试集。这样可以保证验证集最接近实际应用场景,该方法比较常用且性能表现较好。
需要注意的是,当训练集和验证/测试集来源于不同分布时,无法直接通过相对误差的大小来判断是否出现了variance(方差)问题。我们可以引入一个训练-验证集(train-dev set),该集合与训练集来自相同的分布,但不用于训练模型,而是与验证集一样用于验证。
通过引入训练-验证集,我们有了训练误差、训练-验证误差和验证误差三种误差。其中,训练误差与训练-验证误差的差值反映了variance(方差)问题;训练-验证误差与验证误差的差值反映了数据不匹配问题,即样本分布不一致的问题。
_2.png)
通过以上方法,我们可以比较准确地定位出现的是variance还是数据不匹配问题。
训练集与开发/测试集样本分布不一致,我们可以采取以下两个建议:
进行手动错误分析(manual error analysis)来理解训练集与开发/测试集之间的差异。
使训练数据更加相似,或者收集更多与开发/测试集相似的数据。
为了使训练集与开发/测试集更加相似,我们可以使用人工数据合成的方法来进行处理。例如,考虑一个说话人识别的问题,实际的应用场景(开发/测试集)可能包含背景噪声,而训练集很可能没有背景噪声。
为了解决这个问题,我们可以在训练集上人工添加背景噪声,以合成类似实际场景的声音。通过这样的操作,我们可以让模型在更真实的环境下进行训练,从而获得更准确的结果。
然而,需要注意的是,我们不能简单地给每段语音都添加同一段背景噪声。这样做会导致模型过度适应特定的背景噪声,从而降低模型的效果。因此,在人工数据合成时,我们需要特别注意避免过拟合背景噪声的问题。
5 迁移学习
5.1 什么是迁移学习(Transfer Learning)
迁移学习是深度学习中一种强大的技术,可以将已经训练好的模型的一部分知识(网络结构)直接应用到类似模型中。
例如,我们可以将已经训练好的猫类识别的神经网络模型的一部分网络结构应用到使用X光片预测疾病的模型中。
5.2 迁移学习的原理
迁移学习的原理是基于神经网络浅层部分能够检测出许多图片固有特征,例如图像边缘、曲线等。
对于新的任务,使用之前训练好的神经网络部分可以帮助更快、更准确地提取特征,尤其是针对处理相似类型的数据。
例如,由于图片处理具有相同的特点,第一个训练好的神经网络已经学习如何提取有用的图片特征。
即使即将训练的第二个神经网络样本数量较少,通过复用第一个神经网络的结构和权重系数,仍然可以获得健壮性良好的模型。
如果我们已经有一个训练好的神经网络,用来做图像识别。现在,我们想要构建另外一个通过X光片进行诊断的模型。迁移学习的做法是无需重新构建新的模型,而是利用之前的神经网络模型,只改变样本输入、输出以及输出层的权重系数$W^{[L]},:b^{[L]}$。也就是说对新的样本(X,Y),重新训练输出层权重系数$W^{[L]},b^{[L]}$,而其它层所有的权重系数$W^{[l]},b^{[l]}$保持不变。
_3.png)
迁移学习,重新训练权重系数,如果需要构建新模型的样本数量较少,那么可以像刚才所说的,只训练输出层的权重系数$W^{[L]},b^{[L]}$,保持其它层所有的权重系数$W^{[l]},b^{[l]}$不变。这种做法相对来说比较简单。如果样本数量足够多,那么也可以只保留网络结构,重新训练所有层的权重系数。这种做法使得模型更加精确,因为毕竟样本对模型的影响最大。选择哪种方法通常由数据量决定。
顺便提一下,如果重新训练所有权重系数,初始$W^{[l]},b^{[l]}$由之前的模型训练得到,这一过程称为预训练。之后,不断调试、优化$W^{[l]},b^{[l]}$的过程称为微调。预训练和微调分别对应上图中的黑色箭头和红色箭头。
预训练可以学习许多低层次的特征。低层次特征:低层次特征往往是泛化的、易于表达的,如纹理、颜色、边缘、棱角等等。高层次特征往往是复杂的、难以说明的,比如金色的头发、瓢虫的翅膀、缤纷的花儿等等。
迁移学习可以保留原神经网络的一部分,再添加新的网络层。具体问题,具体分析,可以去掉输出层后再增加额外一些神经层。_4.png)
5.3 迁移学习的应用场景
迁移学习主要适用于以下场景:
任务A和任务B具有相同的输入数据x。例如都是图像,都是语音等
对于任务A,拥有大量的数据,而任务B的数据相对较少。
任务A的底层特征对于任务B的学习具有帮助。
在应用迁移学习时,可以保留原神经网络的一部分结构,并根据具体问题添加新的网络层。具体而言,可以根据需求去除原输出层并增加额外的神经层。
总之,迁移学习可通过重新训练权重系数来应用已有模型,针对不同任务进行任务特定的微调。这样的过程可以通过预训练和微调来实现,其中预训练是利用之前的模型训练得到初始权重系数,而微调是针对新任务不断优化权重系数的过程。
6 多任务学习
多任务学习是指通过一个神经网络模型来同时解决多个任务。与普通的分类问题不同,多任务学习将多个任务融合在一个模型中,可以实现多分类效果。比如在汽车自动驾驶中,我们需要同时检测行人、车辆、交通标志和信号灯。多任务学习就可以将这些任务整合在一个模型中,输出一个多维的向量作为结果
如果有C个,那么输出y的维度是(C,1)。
例如汽车自动驾驶中,需要实现的多任务为行人、车辆、交通标志和信号灯。如果检测出汽车和交通标志,则y为:
$$y=\begin{bmatrix}0\1\1\0\end{bmatrix}$$
多任务学习模型的cost function为:
$\frac1m\sum_{i=1}^m\sum_{j=1}^cL(\hat{y}_j^{(i)},y_j^{(i)})$
其中,j表示任务下标,总有c个任务。对应的loss function为:
$$L(\hat{y}_j^{(i)},y_j^{(i)})=-y_j^{(i)}log\hat{y}_j^{(i)}-(1-y_j^{(i)})log\mathrm{~}(1-\hat{y}_j^{(i)})$$
值得一提的是,多任务学习与Softmax回归的区别在于Softmax回归是单标签的,即输出向量y只有一个元素为1;而多任务学习是多个标签的,即输出向量y可以有多个元素为1。
多任务学习的应用场合主要包括三点:
- 需要训练一组任务,其中共享底层特征会有所好处。
- 通常情况下,每个任务的数据量相似。
- 可以训练足够大的神经网络以在所有任务上取得良好的表现。
多任务学习在实际应用中并不是十分常见,相比之下,迁移学习更常被使用
7 端到端深度学习
端到端深度学习是一种将所有不同阶段的数据处理系统或学习系统模块组合在一起的方法,通过一个单一的神经网络模型来实现所有的功能。该方法将所有模块混合在一起,只关心输入和输出。
以语音识别为例,传统的算法流程和端到端模型的区别如下:_5.png)
如果训练样本足够大,神经网络模型足够复杂,那么端到端模型的性能比传统机器学习分块模型更好。这是因为端到端模型允许神经网络模型内部通过自我训练模型特征和自我调节来增加整体契合度。
端到端深度学习有优点也有缺点:
优点:
- 让数据说话:端到端深度学习方法可以让数据自己发挥作用,减少了手工设计组件的需求。
缺点:
- 可能需要大量的数据:为了获得良好的性能,端到端深度学习模型通常需要大量的训练数据。
- 可能不太可解释和可解释性:与传统的分块模型相比,端到端深度学习模型可能更难解释和解释其内部的工作原理