您的位置:首页 > 其它

吴恩达《深度学习工程师》Part3.Week2 机器学习策略(二)

2018-02-27 19:51 239 查看
2.1 进行误差分析

如果你构建的神经网络模型不能达到人类的水平,你可以手工查看模型错误的地方,这有助于你确定下一步如何进行改进。

例如在猫的二分类模型中,出现了不少把狗认为是猫的错误判断,那么是不是应该建立一个专门判别狗的模型或者在训练集中增加狗的图片来减少把狗的错判率呢?

可以这样做,找出100个错误判断的训练集,看里面有多少个是狗的图片,如果狗的图片只占5%,那么即使你专门针对狗的分类进行了优化,你的模型的错误率也不会有明显的降低,才降低了5%。但是,如果狗的图片占50%的话,那么你花时间对狗的分类进行优化,是值得的,应为最好的情况下你可以将错误率降低50%。

虽然在机器学习时很鄙视用手工设置规则,但是通过以上的操作,可能只需要几分钟的时间就可以帮你确定下一步的优化策略。

有时候,你可以同时评估好几个改进策略,例如:

1.修正狗被错判为猫的情况;

2.修正其他猫科动物(豹子,狮子等)被错判为猫的情况;

3.修正模糊(如加了滤镜效果)图片被错判为猫的情况。

把这三种情况在错误分类集中所占的比例统计出来,选出占比最高的情况,并对其改进。

2.2 清楚标注错误的数据

有时候你会发现有些数据被错误的标记了,那么有没有必要花时间对这些错误标记的图片进行修正呢?

在训练集中,如果错误的标记是随机性误差的话,例如从事标记工作的人员按错了按键或者看错了,那么对于深度学习模型来说,这种错误影响不大。但是,如果错误的标记是系统性误差,例如从事标记工作的人员一直把狮子标记成猫的话,那么训练出来的深度学习模型将会把狮子判断为猫。

在开发集和测试集中,与2.1节的方法类似,可以把错误标记的例子统计一下,看下错误标记在错误分类集中所占的比例,如果占比很高的话,可以考虑把错误标记的数据进行更正。

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

如果你在搭建的机器学习系统,一个很好的做法是:不要想太多,快速搭建起一个系统,并进行迭代优化。

以语音识别为例,需要考虑的东西很多,比如:噪声,儿童声音,口音等,考虑太多因素会让建模还没开始就很复杂。因此,聪明的做法是找准一个目标,快速搭建起系统,进行偏差\方差分析,进行误差分析,确定出优化的策略,改进,改进再改进。

2.4 在不同的分布上进行训练并测试

深度学习模型对数据的需求量很大,有时候训练和开发、测试集上的数据分布是不同的,这里有一些推荐的做法。

以开发猫的二分类APP为例,你的训练数据大部分是从网上下载的高清图片,而APP的用户上传的则是手机拍摄的像素较低或模糊的图片,这两个数据集分布不同。如果你能获得大量的用户上传的模糊图片的话,当然是最好不过了,但是实际上用户上传的图片是很少的。


图1 训练集和开发集分布不同的情况

可以取出APP中的一半图片(5,000张)加入到训练集中,即训练集中有200,000张高清图片和5,000张模糊图片,把开发集和测试集各放置2500张APP模糊图片,这样就将优化的目标定为用户上传的图片,

2.5 分布不匹配数据的偏差和方差

确定模型的偏差和方差有助于你对模型进行优化,而当训练集和开发集、测试集数据分布不一致时,处理的方法与偏差、方差有所不同。

例如上节讲到的猫的分类器的例子,加入人类判别误差约为0%,你的模型在训练集上误差为1%,而在开发集上误差为10%,那么能不能说你的模型方差较大呢?

这时候要慎重,因为开发集中用到的猫的图片都是模糊的,而训练集中猫的图片都是高清图片,两个集合中的分布不一致,需要考虑分布不同导致的误差。



图2 训练/开发集分布不一致时训练集的重新划分

可以将原来的训练集先随机打乱,再划分为图2所示的trian和trian-dev集,这样trian和trian-dev集的分布是相同的。分别测试train集,trian-dev集,dev集,test集误差。

train error:1%,train-dev error:9%,dev error: 10%的话,说明模型存在较大的方差。

train error:1%,train-dev error:1.5%,dev error: 10%的话,说明模型存在训练/开发集分布不同导致的误差。

train error:10%,train-dev error:11%,dev error: 12%的话,说明模型存在较大的可避免偏差。

train error:10%,train-dev error:11%,dev error: 20%的话,说明模型同时存在较大的可避免偏差和训练/开发集分布不同导致的误差。

2.6 解决数据不匹配

针对上节讲到的训练/开发集数据不匹配导致的误差,没有系统的解决办法,但是可以进行以下的尝试。

1.手工检查训练集和开发/测试集的不同。

2.使训练集的分布变得与开发/测试集相似,或者采集更多的类似开发/测试集的数据。

例如在语音识别后视镜的模型中发现开发集中有很多噪音的数据,你可以通过人工合成含噪音数据来使得训练集和开发/测试集分布相同。但是,人工合成的数据存在一个问题,假如合成的数据来自一个小范围的分布,而你构造出的数据量很大时,可能造成模型对这个小范围分布数据的过拟合问题。

2.7 迁移学习

深度学习中一个重要的理念是你可以将一个模型中学到的知识应用到另外一个领域,比如你构建了一个可以识别猫的神经网络,你可以用这个模型中学到的知识帮助你更好的理解X射线照片,这就是迁移学习。



图3 从识别猫的模型迁移到判断X射线照片的模型

如图3 所示,将构建好的识别猫的模型最后一次删去,新加上一层或几层新层,随机初始化新加层的权重和偏置,将输入和输出替换为X射线照片数据和标签,然后训练新加层的权重和偏置。

如果你的X射线数据很多的话,你也可以重新训练所有的权重和偏置,这时候前期用猫的图片训练的过程叫做“预训练”(pre-training),而后期通过X射线数据进行的权重和偏置的调整叫做“微调”(fine tuning)。

为什么迁移学习能够实现所学知识的迁移呢?因为预训练模型可以学习到一些低层次的特征,如边缘检测、曲线检测等这些知识可以帮助更好的理解所要迁移到的领域的问题。

什么时候迁移学习会起作用呢?

1. 任务A和任务B具有相同的输入;

2. 任务A的数据比任务B的数据多;

3. 从任务A学到的低层次特征有利于任务B的学习。

2.8 多任务学习

迁移学习时串联的,需要先预训练一个模型,然后进行微调。而多任务学习是并联的,可以同时完成多个任务。

以自动驾驶为例,图像识别系统需要同时判断镜头里有没有行人、红绿灯、车辆、停车标志灯。多任务学习将多个任务标签放在最后一层的输出中,来同时判断图片中是否有这几种东西。


图4 多任务学习

多任务学习的代价函数为所有输出标签的logistic loss 之和,能够处理图片中只有部分物体被标记的情况,例如有的图片中只标记了有没有汽车,却忘记标记有没有行人,由于多任务学习代价函数为几个标签的logistic损失函数之和,可以忽略异常值的影响。

什么时候多任务学习会起作用呢?

1.训练一个多任务模型时,可以从其他任务中共享低层特征;

2.通常来说,每个任务的输入数据都是类似的;

3.当模型足够大时,才能实现性能优异的多任务模型。

2.9 什么是端到端的深度学习

在以前的机器学习模型中,可能需要构建几个不同阶段的手工组件,而端到端(end to end)深度学习直接从输入到输出,用一个神经网络模型来实现。

例如,在语音识别的实现模型中



图5 语音识别模型

端到端的深度学习方法可以省去人工特征提取,合成等许多步骤,一步实现想要的功能。但是具体问题要具体分析,这里指的是训练数据量的问题。如果训练数据量很小的话,例如小于3,000小时,可能用人工多步骤的方法效果更好。而当数据量很大时,例如达到100,000小时的话,端对端深度学习模型的效果就会很好。如果数据量介于中间的话,可能用少数几个步骤加上深度学习,如图5中绿色直线所示,分析效果会更好。

类似的例子还有人脸识别系统,摄像头拍摄的图片包含了人的全身像,如果直接拿全身像进行身份验证的话,缺少足够的训练集。而实际上可以分为两个步骤来实现,一是找出人脸所在的位置,二是对人脸图片进行验证。这两个步骤都有很大的数据集可以用来进行训练,因此分步实现的效果更好。

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

端到端学习的优缺点:

优点:1.用数据说话,只需输入(X,y)就可以得到你想要的模型;2.需要很少的手工设置的组件。

缺点:1可能需要大量的数据; 2.可能排除掉一些高效的手工组件。

所以当你考虑是否使用端到段学习的时候,你需要首先考虑你是否有足够多的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐