进行误差分析
假设你训练出的猫分类器在开发集上取得了90%的准确率即误差为10%,这离你的目标还有一段距离,当你分析开发集上出错的例子中,你发现算法将一些狗的图片判别为猫的图片
当我们在训练一个模型的时候,如一个猫和狗分类模型,最终得到了 90% 的精确度,即有 10% 的错误率。所以我们需要对模型的一些部分做相应调整,才能更好地提升分类的精度。如果不加分析去做,可能几个月的努力对于提升精度并没有作用。所以一个好的误差分析的流程就相当重要。
纠正错误标记的数据
假如在训练集中一只狗的照片被错误地标记为猫的图片,如下图所示:那么我们是否值得花时间去修正这些样本?首先,我们来考虑训练集,事实证明,深度学习算法对于训练集中的随机错误具有鲁棒性(robust)。只要你的标记出错的样本足够随机,那么放着这些错误不管可能也没问题,而不要花太多时间修复它们,但是修正这些标签也没有什么坏处。需要注意的是,深度学习对于系统性的错误没有那么鲁棒,比如说,如果做标记的人一直把白色的狗标记成猫,那就成问题了。
如果标记错误的数据出现在了验证集或者测试集呢?这种情况下我们可以进行误差分析,统计在识别错误的验证集或者测试集中是因为标记出错的样本占多大比率,再判断是否值得花时间去纠正这些标签。
当我们决定需要对验证集或者测试集的数据进行修正时,我们需要遵循以下原则:
- 在验证集和测试集上使用同样的纠正手段确保验证集和测试集来自同一分布;
- 同时检查判断正确和判断错误的例子;
- 训练集数据的分布不必和验证集和测试集完全相同,可以不修正训练集;
快速搭建你的第一个系统,然后迭代
当我们正在开发全新的机器学习应用,我们应该尽快建立第一个系统原型,然后快速迭代,大致的步骤是:
1).设置好验证集和测试集以及评测指标;
2).快速的构建一个原型机;
3).使用偏差/方差分析和误差分析,指引下一步优化方向;
在分布不同的数据集上进行训练和测试
在深度学习时代,越来越多的团队用来自和验证集、测试集分布不同的数据来训练,我们可以采用一些方法来处理训练集和测试集存在差异的情况。还是以猫分类器为例,假如我们在网页上搜集了200000张猫的图片,这些图片一般很清晰,取景专业,另外,我们还收集了用户上传的10000张猫的图片,这些图片看起来很业余而且模糊,这时,我们应该如何划分数据集呢?
考虑到我们的模型最终的目的是识别这些由用户上传的低质量的图片,所以,我们可以按照Option 2的方法来划分数据集,即将200000张网页图片+5000张用户上传图片组成训练集,将2500张用户上传图片作为验证集,将2500张用户上传图片作为测试集,这样便能保证我们的验证集和测试集更符合实际使用场景。
数据分布不匹配时的偏差和方差
之前,我们通过比较人类水平误差、训练集误差、验证集误差和测试集误差之间的差值来进行偏差或方差分析,但是当训练集和验证集测试集的数据来自不同分布的时候,我们不能按照以前的方法进行分析,为了解决这个问题,我们可以重新定义一个训练-验证集,训练-验证集和训练集来自于同一分布:解决数据不匹配问题
解决数据不匹配问题的方法主要有:
1).人工地进行误差分析,尝试着找到训练集和验证/测试集之间的区别;
2).让训练集更像验证/测试集,或者收集更多类似于验证/测试集的数据;
为了使训练集更像验证/测试集,我们可以使用一种称为人工合成数据(Artificial data synthesis)的技术。以语音识别系统为例,假如我们的语音识别经常需要在充满车辆噪音的情况下进行,而我们的音频训练数据都是清晰没有噪音的数据,因此,我们可以给这些音频人为加入车辆噪音合成新的数据,需要注意的是,我们不能给每段音频都加入同一段车辆噪声背景,这样可能会使算法对车辆噪声背景过拟合。另外,当我们使用人工数据合成时,一定要谨慎,因为你有可能从所有可能性的空间只选了很小一部分去模拟数据。
迁移学习
在深度学习中,最强大的理念之一就是,有的时候神经网络可以从一个任务中习得知识,并将这些知识应用到另一个独立的任务中。例如,也许你已经训练好一个神经网络,能够识别像猫这样的对象,然后使用这些知识,或者部分习得的知识去帮助你更好地阅读X射线扫描图,这就是所谓的迁移学习。
假如,我们训练好了一个图像识别神经网络,用来识别猫、狗等小动物,如下图所示:我们可以拿这个训练好的神经网络进行迁移学习,比如,迁移到放射科诊断阅读X射线扫描图,我们可以将这个神经网络的输出层直接删除,包括最后一层的权重,然后为最后一层重新赋予随机权重,然后让它在放射诊断数据上训练。
迁移学习有多种方式,关键在于数据量的大小,如果你的放射科数据集很小,你可能只需要重新训练最后一层的权重,保持其他参数不变。如果你有足够多的数据,你可以重新训练神经网络中的所有层。如果重新训练神经网络中的所有参数,我们称之前的训练过程为预训练,迁移训练中参数的更新可以称之为微调。
迁移学习在以下条件下才具有意义(从任务A迁移到任务B):
- 任务A和B有相同类型的输入,比如都是图像或者都是音频;
- 任务A的数据比任务B多得多;
- 任务A的低层特征对任务B有帮助;
多任务学习(Multi-task learning)
多任务学习是让单个神经网络同时学习多个任务,以无人驾驶汽车为例,我们需要构建一个神经网络识别起床采用图像中的行人、车辆、交通标志和交通信号灯,如下图所示多任务学习与softmax回归的区别在于,softmax回归将单个标签分配给单个样本,而多任务学习中单个样本可以对应多个标签。
当满足以下条件时,多任务学习才变得有意义:
训练一组可以共用低维特征的任务,对于无人驾驶的例子,同时识别交通灯、汽车和行人是有道理的,这些物体有相似的特征;
对于每个任务,它们的数据都很相似;
可以训练一个足够大的神经网络使得所以任务都能够完成得很好;
端到端的深度学习
以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理,就像流水线一样。那么端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它。举个例子,以语音识别为例,你的输入是一段音频,输出是这段音频的听写文本。传统上,语音识别需要很多阶段的处理,首先你会提取一些手工设计的音频特征,比如利用MFCC算法从音频中提取一组特定的人工设计的特征,在提取出一些低层次特征之后,你可以应用机器学习算法在音频片段中找到音位,音位是声音的基本单位,比如说Cat这个词是三个音位Cu-、Ah-和Tu-构成的,算法就把这三个音位提取出来,然后你将音位串在一起构成独立的词,然后你将词串起来构成音频片段的听写文本。与这种流水线相比,端到端的深度学习需要训练一个巨大的神经网络,它的输入是一段音频 ,输出直接是文本。当你的数据集不是很大时,传统的流水线效果可能更好,当你的数据集很大时,端到端的深度学习效果可能更好。