吴恩达深度学习课程笔记(三): 结构化机器学习项目1
第一周 机器学习(ML)策略(1)
1.1 为什么要 ML 策略
选择什么样的手段来改进我们的模型性能?
看起来有很多的手段;
但哪一些是有用的,哪一些又是在耗费我们的时间?
这需要一定的经验和策略(来选取合适的手段)。
深度学习的策略和上一代机器学习的策略又有所不同。
1.2 正交化
所谓正交化是说,一个策略只影响一个方面,比如电视的旋钮,旋钮1只管画面高度,旋钮2只管画面宽度,旋钮3 只管梯度校正,旋钮4只管图像左右偏移调整,旋钮5只管图像角度选择,。。。
- 训练集要在代价函数上表现的良好(表现达到能接受的程度:一般是指达到人类的性能):
- 训练更大的网络;
- 更好的优化算法;
- 开发集(Dev set)要在代价函数上表现的良好:
- 正则化;
- 更大的训练集;
- 测试集要在代价函数表现的良好:
- 更大的开发集(因为有可能在开发集上过拟合了);
- 要在现实世界表现良好:
- 改变开发集(在真实世界表现差劲,要么是开发集的数据分布不正确,无法反应真实世界的数据分布,要么是损失函数测量的指标不正确);
- 改变损失函数(cost function);
而早停法,因为会同时影响训练集的拟合和开发集的拟合,所以违背正交化原则(一个方法同时影响两件事情),在使用的时候难以分析,虽然早停法(early stopping)是一个不错的技巧。
在上图的四个阶段(训练集、开发集、测试集、现实世界),在哪个阶段出现问题,就用相应的一个办法或者一组办法(旋钮)去调整该阶段,而不会影响到其他的阶段。 这就是正交化。
那么如何找到模型的性能瓶颈?使用哪一组特定的旋钮来改善特定阶段的性能?
见下文。
1.3 单一数字评估指标
precision(查准率):在模型识别出来的猫中,有多少是真的猫;
recall(查全率):在所有的猫中,系统识别出多少猫;
这两个参数的选择上往往需要折中,希望得到的分类器说某个东西是猫的时候,它有很大的概率就是猫;也希望分类器能将猫里边的大部分识别为猫;
但是如果像下图,模型A的Precision高,模型B的Recall高,怎么选择?
如果再复杂一些,要快速的在十几个分类器中选择一个最好的出来,那么用precision和recall同时选择就很困难。
最好的办法就是用一个单一的数字评估指标去选择。
F1 score就是precision和recall结合在一起的参数。
用开发集(dev set)测量查准率和查全率,以及 F1 score F 1 s c o r e 。
如果有若干算法,同时测量了在多个数据集中的性能,可以使用平均值来决定算法的优劣。
图中,选择平均值最小的算法C。
1.4 满足和优化指标
要把顾及到的所有情况组合成单实数评估指标,有时候很困难。
将指标分为满足指标和优化指标,可以解决该困难。
假设分类器现有两个指标:
那么,运行时间可以作为满足指标,比如小于100ms即可。
准确度为优化指标,即,尽可能的提高该指标。
这样,就可以先筛选达到满足指标的,再从其中选出优化指标最好的一个模型出来。
一般的,如果有N个指标需要考虑,可以选择其中的一个指标作为优化指标,剩下的N-1个都是满足指标。
比如语音助手,关于唤醒词,假设有两个指标,一个是准确度accuracy,另一个是没有说唤醒词但是自动唤醒的误唤醒即false positive。那么可以将accuracy视为优化指标,即唤醒成果的概率越高越好。将false positive 设置为满足指标,满足每24小时内误唤醒次数小于等于1次。
说唤醒词,唤醒: true positive
没说唤醒词,唤醒:false positive
说唤醒词,没唤醒:false negative
没说唤醒词,没唤醒:true negative
1.5 训练 / 开发 / 测试集划分
dev set,即developement set(开发集),即hold out cross validation set(保留交叉验证集)
机器学习的工作流程是:
- 尝试很多思路,用训练集训练不同的模型;
- 使用开发集评估,然后选择一个;
- 不断迭代去改善开发集的性能直到最后,直到得到一个令你满意的损失函数值;
- 用测试集去评估。
开发集和测试集必须服从同一分布。
开发集和测试集必须能够反映你未来会得到的数据,并且必须是认为需要得到好结果的重要数据。
开发集和测试集就是你的团队所要瞄准的目标。
你不能在开发集的时候是一个靶子,到测试集再突然换另外一个。
而且开发集和测试集这个靶子还要能反映真实的靶子(现实世界)。
而设立训练集的方式,则会影响逼近靶子的速度。
1.6 设置——开发集、测试集的大小
在数据量小的前机器学习时代,训练集、开发集、测试集一般是6/2/2这样划分。
但是在大数据时代,数据可能有100万条,那么训练集可以占到98%,开发集和测试集各占1%;即,大量的数据分到训练集,少量数据分到开发集和测试集。
开发集、测试集的大小:
- 只要选择的数据大小能够有足够的置信度来反映模型的性能指标就可以。整个数据集的大小不同,那么开发集、测试集的大小和所占的比例也不相同。
不要测试集的情况:
- 如果不需要对系统性能有置信度很高的评估,那么就可以不设置测试集,仅需要开发集和训练集。也就是有一部分数据拿来训练,有一部分数据拿来调试。
但一般不建议这样做。
单独设置一个测试集,用这组不带偏差的数据来测量系统的性能。是一个好的习惯。
1.7 什么时候该改变开发 / 测试集和指标
猫分类器,指标为识别的错误率。这样算法A的指标更好,但算法A会将色情图片推荐给用户,算法B却不会。
这就是指标无法正确的评估算法的优劣。
应该改变指标or 开发集、测试集。
比如在上面的例子中,改变指标error的定义方式:
旧的指标无法满足要求,那就花费一些时间,定义一个新的指标。
指标的表现良好,但是开发集和测试集是高质量的图像,而现实中用户的图像却很模糊,那么就应该改变开发集和测试集,以让其贴合现实数据。
总之,如果指标 + 开发集/测试集的结果很不错,但是现实世界中模型却玩不转,那就去改变指标 + 开发集/测试集 。
1.8 为什么是和人类水平比较?
模型往往能很快超越人类水平;
但之后增速会大幅减慢;
永远无法超过贝叶斯最优误差(Bayes optimal error或者Bayes error),即理论上可能达到的最优误差。
比如:
语音处理中总是有一些数据是背景嘈杂听不清声音的;
猫分类中总是有一些模糊图片人和机器都无法对其分类。
性能超越人类后为什么会慢下来?
- 在很多任务中,人类水平接近贝叶斯最优误差;
- 在机器水平比人类水平低的时候,可以使用某些工具来提高性能。一旦超越人类水平,这些工具就不好用了。
- 机器比人类差的时候:
- 让人类标记数据;
- 手动误差分析,找到算法的不足之处;
- 更好地分析偏差和方差。
- 机器比人类差的时候:
基于以上原因,所以一般都是和人类水平作比较。
1.9 可避免偏差
在很多任务中,人类水平误差接近于Bayes error。所以用人类水平误差作为对Bayes error的估计。
所以用人类水平误差代替贝叶斯最优误差。
训练集误差和贝叶斯最优误差之间的差值:可避免偏差;
开发集误差和训练集误差之间的差值:方差;
根据可避免偏差和方差的大小来调整:
- 可避免偏差大:
- 增加网络规模;
- 增大训练时间。
- 可避免偏差小但方差大:
- 正则化;
- 增大数据集规模。
1.10 理解人类水平性能
Human-level error as a proxy for Bayes errror.
Human-level error as a proxy for Bayes errror.
用人类水平误差代替贝叶斯最优误差。
但,怎么定义“人类水平”的误差?
比如,放射影像,不同人群的误差不一样。用哪一个来定义“Human-level” error?
Bayes error <= 0.5%,专家团队的error更接近Bayes error,所以选择专家团队。
但是如果我并不期望那么高的性能,比如部署一个能用的系统,或者,发一篇论文,那么或许选择1% error(放射科医生水平)就可以达到目标。
也就是,在定义Human-level error的时候,要弄清目标所在。
- 目标是代替bayes error,选择专家团队水平;
- 目标是证明系统能比得上放射科医生,选择放射科医生水平。
误差分析的例子:
可以看到:
- 在训练集误差或者开发集误差离人类水平误差较远的时候,可以很容易的判断出,是要优化可避免偏差还是方差,而且对人类水平误差的定义可以不那么严苛。
- 在训练集误差和开发集误差接近于甚至是超过人类水平误差的时候,已经很难判断是去优化可避免偏差还是方差。机器学习的性能调优变得困难起来,对人类水平也希望能取尽可能高的那一个。
1.11 超过人类水平
对于监督学习。
在模型超过人类水平以后,对可避免偏差和方差的分析就出现了问题。我们能利用的工具失效。
这时候该怎么办?
答: 大数据。数据量很大的时候,就相对容易得到超越人类水平的系统。
从结构化数据学习的任务(用数据库数据学习:网络广告、物品推荐、物流预测、贷款的还款预测) 相对容易超越人类。
自然感知类的任务(计算机视觉、语音识别、自然语言理解)人类水平接近bayes error,比较难,但是也有很多领域机器已经超过人类。
1.12 提升模型性能
目标:
- 模型很好地拟合训练集; ——低的可避免偏差
- 模型在训练集上的性能能很好的泛化到开发集和测试集。——低的方差(注意遵循正交化原则)
方法:
- 减小可避免偏差:
- 更大的模型;
- 训练更长时间;
- 更好的优化算法;
- 改变模型的结构(或者新的模型结构);
- 超参数搜索;
- 减小方差:
- 更多的数据;
- 正则化(L2、dropout、数据增强)