Deeplearning.ai学习笔记-结构化机器学习项目
前言
这次学习的主题是深度学习,学习的第一门课程就是吴恩达的Deeplearning.ai项目课程。此系列笔记也是根据该深度学习课程整理而成。
该系列笔记是该课程中重点知识的罗列和自己的一些理解,可供正在学习此课程的同学作为参考,也是方便自己日后复习使用。
学习本课程需要有一点python基础、懂得Numpy库的基础使用,有高中的数学基础、懂得一点点矩阵、向量知识大致就可以了。这些知识可以到吴恩达的机器学习课程学习。
关于本篇笔记:这篇笔记是深度学习课程中第三课《结构化机器学习项目》的笔记,主要是在做项目时的策略总结。这一篇是整个课程的亮点部分,也是吴恩达教授在自己做项目时的经验总结,受益匪浅!
项目策略
在整个深度学习训练过程中,为了提高精确度、拟合程度,要不断的调参、更改一些算法或者增加数据等等,有许许多多的路径可以走,但是如何知道应该选择什么路径是有效的呢?
正交化
正交化就是将深度学习的整个过程的所有需要解决的问题独立开来。针对于某个方面的问题有相应的解决方法,尽量不要用一个方法去尝试解决多个方面的问题。
如上图,主要有四个方面的问题:拟合训练集、拟合验证集、拟合测试集、在实际使用预测中能够很好的泛化
最好的是一个个的解决问题,先拟合训练集,然后做其他的……如果用early stopping之类的同时影响两个问题的方法就不是很好。
指标
dev set和指标很重要,先确定下来后再根据实际情况不断修改,让他们更加符合实际应用时的场景。
单一数字评估指标
查准率decision:就是精确度。例子:猫分类器判断一些图是猫,在这些图中真的是猫的图的比例就是查准率。
查全率recall:例子:在所有猫的图片中猫分类器正确判断出来了多少
在有多个算法、模型时,需要判断哪个更好,就需要一个指标来衡量,建议不要用多个指标,这样很难迅速判断。
最好的方法是将几个学习模型的指标取平均,得出一个单一的评估指标用于以后的衡量。
其中有一个比较好的就是F1:F1是查准率和查全率的调和平均数
单一指标的设定不仅仅只是一个简单的量或者平均值,可以是复杂的加权结果,取决于实际应用的需要。
优化指标、满足指标
如果有几个指标不能很好的融合成单一指标,可以用优化指标、满足指标的方法。
假设有k个指标,就指定k-1个为满足指标,意思是只要这些指标达到一个阈值就行了,不需要特别好;1个作为优化指标,意思是这个指标是我关注的重点指标,这个指标越高越好。
训练集、验证集、测试集
数据的划分一般有两种:
较细致的一种是训练集、验证集和测试集;还有一种划分是训练集、测试集。
划分的目的都是为了得到精确度最高、泛化能力最佳的模型。
训练集(Training set)
通过设置不同的超参,不同的模型,利用训练集大量训练从而得到几个比较好的模型。
验证集(Development set)
作用是用来瞄准设定的预期目标,不断向预期的目标靠近,如果dev数据与实际应用数据差距较大,则瞄准的目标就出现了偏移,做的都是无用功。
测试集(Test set)
通过训练集和验证集得出最优模型后,用测试集进一步验证所得的模型。目的是进一步确定该模型是否有较强的泛化能力。
要使验证集、测试集与以后的预测的目标来自同一分布。
而训练集因为需要大量的数据所以不一定要求绝对来自同一分布。
dev set 和test set的数据要来自同一分布,不能让这两类数据分别从不同的地方取。并且最好的是能够取一些实际预测时的数据分别放入dev set和test set
三个集如果都能和实际应用时的数据来自同一分布自然是最好。如果没有这么多的数据,一定要保证验证集和测试集与实际应用的数据来自同一分布。因为训练集需要大量数据,可以适当用一些有较多数据的其他分布。
训练集、验证集、测试集大小:
偏差与方差问题
在训练模型之后,想要提升指标就需要进行分析是否出现了偏差、方差问题。对于不同的问题要找出相应的解决方案。
贝叶斯最佳误差
贝叶斯最佳误差:最优误差。计算机所能达到的最优水平,一般与人类水平相似。
注意:训练集的准确度不是要非常好,因为有贝叶斯误差,所以达到一定的理想水平就可以了。
关注贝叶斯误差和人类误差是为了实时的判断目前是需要降低方差还是降低偏差
解决偏差方差方法
当训练集来自不同分布
当出现之前说的训练集与验证集和测试集来自不同分布的情况,如果迭代后的结果发现方差过大,原因有二:
- 过拟合
- 来自不同分布
解决方法:
首先:将一部分train set和dev set组成新的train-dev set,对这个新数据的结果进行分析:
train-dev set大部分数据属于train set,和train set是同分布,此时, train set 与 training-dev set之间的误差称为方差, training-dev set与 dev set之间称为 数据不匹配 data mismatch
, dev error 与 test error 称为验证集的过拟合程度 degree of overfitting to dev set
然后:根据结果得出是因为方差、偏差、还是数据不匹配(不同分布);如果是数据不匹配,解决方法一般是:
- 进行误差分析,分析dev set和train set,找出两个分布差异的原因
- 尝试找一些与dev set相似的数据,也可以采取人工数据合成的方法
误差分析
对dev set进行误差分析,取出一些错误的例子,人工统计分析不能拟合的原因。根据分析出来的几个问题选择重点问题寻找方法解决。
如猫分类器的模型,分析出也许有很大比例的误差都是因为猫狗识别错误,就要特别针对猫狗识别来处理;如果大多数误差都是因为图片模糊,则要特别针对图像清晰度处理。
人工统计分析很重要,有必要花这个时间!!!
如下图:
错误标签
对于训练集,如果只是偶然的随机错误,一般不值得花费时间去修改。
对于测试集和验证集,和误差分析一起统计,根据比例大小决定是否需要修正。
如果确定要修正,建议:
- 一定要同时修改测试集和验证集
- 同时统计模型判断错的和没有判断出来的
总结:做项目建议
快速搭建一个系统:
- 快速找好训练集、验证集、测试集,设定好指标。尽快建立一个学习模型(输出层、代价函数不能忘)进行迭代(宁可之后再修改)。
- 再进行偏差方差分析、误差分析,找出重点问题具体分析解决,在解决的过程中注意要正交化(这才是重点)
注:不要刚开始想把系统建的多完美,多复杂A quick and dirty system is good enough.
多种学习方式的策略
迁移学习
迁移学习主要使用于原对象有很多数据而迁移的对象没有大量数据的情况
步骤一般是:
- 首先可以仅仅改变一下神经网络的输出层或者最后几层
原因:因为对于迁移学习来说,迁移对象两者之间是有关联的。正好神经网络的前几层是低层次的学习。比如猫狗识别与放射诊断的低层特征是相似的, 都是边缘检测、线条的特征等等, 这就是两个学习任务共同的知识。在迁移学习中就可以省略这些层数的重新训练。 - 如果训练结果不好,可以逐渐训练前面的层数
train set 和 dev set来自不同分布在某种程度上就是一种迁移学习的影子。
例如猫分类器模型中,如果因为用户的低分辨率的图片数据较少,网络上的高分辨率的图片数据很多。低分辨率的图片其实是我们的理想数据,但是因为没有这么多数据,所以拿高分辨率的图片作为训练数据。某种程度上就可以理解为迁移学习,只不过这两者的关系极其紧密。
多任务学习
用单个神经网络训练多个问题(问题之间有关联),比如在一张图中同时识别车、行人、交通牌……
多任务学习的要求是:
- 几个问题的低层次内容必须是一致的
- 每个问题都必须有大量的数据
- 深度学习模型要足够的大
如果模型足够大,一般多任务学习会比分开单独的学习模型效果更好。
设置代价函数
多任务学习和迁移学习有点类似。但是最明显的区别是迁移学习的对象一个数据很多,另一个数据较少;而多任务学习要求每个问题的数据都很多。这就使得迁移学习的使用频率更高。
端到端的学习
端到端的学习简化了学习系统,直接输入值,然后就输出值。
多步骤的学习可以相对需要较少的数据去训练
优点:简化了学习系统,省略了中间件。让模型自己去寻找解决方案,在某些问题上能够学习的比人设置的中间件更好。
缺点:
- 要求有大量的数据来训练
- 忽略了一些精心设计的非常好的中间件
在决定是否使用端到端时要考虑几个点:
- 数据是否足够多
- 问题的复杂度(用端到端是否可行)