选择什么样的手段来改进我们的模型性能?
看起来有很多的手段;
但哪一些是有用的,哪一些又是在耗费我们的时间?
这需要一定的经验和策略(来选取合适的手段)。
深度学习的策略和上一代机器学习的策略又有所不同。
所谓正交化是说,一个策略只影响一个方面,比如电视的旋钮,旋钮1只管画面高度,旋钮2只管画面宽度,旋钮3 只管梯度校正,旋钮4只管图像左右偏移调整,旋钮5只管图像角度选择,。。。
而早停法,因为会同时影响训练集的拟合和开发集的拟合,所以违背正交化原则(一个方法同时影响两件事情),在使用的时候难以分析,虽然早停法(early stopping)是一个不错的技巧。
在上图的四个阶段(训练集、开发集、测试集、现实世界),在哪个阶段出现问题,就用相应的一个办法或者一组办法(旋钮)去调整该阶段,而不会影响到其他的阶段。 这就是正交化。
那么如何找到模型的性能瓶颈?使用哪一组特定的旋钮来改善特定阶段的性能?
见下文。
precision(查准率):在模型识别出来的猫中,有多少是真的猫;
recall(查全率):在所有的猫中,系统识别出多少猫;
这两个参数的选择上往往需要折中,希望得到的分类器说某个东西是猫的时候,它有很大的概率就是猫;也希望分类器能将猫里边的大部分识别为猫;
但是如果像下图,模型A的Precision高,模型B的Recall高,怎么选择?
如果再复杂一些,要快速的在十几个分类器中选择一个最好的出来,那么用precision和recall同时选择就很困难。
最好的办法就是用一个单一的数字评估指标去选择。
F1 score就是precision和recall结合在一起的参数。
用开发集(dev set)测量查准率和查全率,以及 F1 score F 1 s c o r e 。
如果有若干算法,同时测量了在多个数据集中的性能,可以使用平均值来决定算法的优劣。
图中,选择平均值最小的算法C。
要把顾及到的所有情况组合成单实数评估指标,有时候很困难。
将指标分为满足指标和优化指标,可以解决该困难。
假设分类器现有两个指标:
那么,运行时间可以作为满足指标,比如小于100ms即可。
准确度为优化指标,即,尽可能的提高该指标。
这样,就可以先筛选达到满足指标的,再从其中选出优化指标最好的一个模型出来。
一般的,如果有N个指标需要考虑,可以选择其中的一个指标作为优化指标,剩下的N-1个都是满足指标。
比如语音助手,关于唤醒词,假设有两个指标,一个是准确度accuracy,另一个是没有说唤醒词但是自动唤醒的误唤醒即false positive。那么可以将accuracy视为优化指标,即唤醒成果的概率越高越好。将false positive 设置为满足指标,满足每24小时内误唤醒次数小于等于1次。
说唤醒词,唤醒: true positive
没说唤醒词,唤醒:false positive
说唤醒词,没唤醒:false negative
没说唤醒词,没唤醒:true negative
dev set,即developement set(开发集),即hold out cross validation set(保留交叉验证集)
机器学习的工作流程是:
开发集和测试集必须服从同一分布。
开发集和测试集必须能够反映你未来会得到的数据,并且必须是认为需要得到好结果的重要数据。
开发集和测试集就是你的团队所要瞄准的目标。
你不能在开发集的时候是一个靶子,到测试集再突然换另外一个。
而且开发集和测试集这个靶子还要能反映真实的靶子(现实世界)。
而设立训练集的方式,则会影响逼近靶子的速度。
在数据量小的前机器学习时代,训练集、开发集、测试集一般是6/2/2这样划分。
但是在大数据时代,数据可能有100万条,那么训练集可以占到98%,开发集和测试集各占1%;即,大量的数据分到训练集,少量数据分到开发集和测试集。
开发集、测试集的大小:
不要测试集的情况:
但一般不建议这样做。
单独设置一个测试集,用这组不带偏差的数据来测量系统的性能。是一个好的习惯。
猫分类器,指标为识别的错误率。这样算法A的指标更好,但算法A会将色情图片推荐给用户,算法B却不会。
这就是指标无法正确的评估算法的优劣。
应该改变指标or 开发集、测试集。
比如在上面的例子中,改变指标error的定义方式:
旧的指标无法满足要求,那就花费一些时间,定义一个新的指标。
指标的表现良好,但是开发集和测试集是高质量的图像,而现实中用户的图像却很模糊,那么就应该改变开发集和测试集,以让其贴合现实数据。
总之,如果指标 + 开发集/测试集的结果很不错,但是现实世界中模型却玩不转,那就去改变指标 + 开发集/测试集 。
模型往往能很快超越人类水平;
但之后增速会大幅减慢;
永远无法超过贝叶斯最优误差(Bayes optimal error或者Bayes error),即理论上可能达到的最优误差。
比如:
语音处理中总是有一些数据是背景嘈杂听不清声音的;
猫分类中总是有一些模糊图片人和机器都无法对其分类。
性能超越人类后为什么会慢下来?
基于以上原因,所以一般都是和人类水平作比较。
在很多任务中,人类水平误差接近于Bayes error。所以用人类水平误差作为对Bayes error的估计。
所以用人类水平误差代替贝叶斯最优误差。
训练集误差和贝叶斯最优误差之间的差值:可避免偏差;
开发集误差和训练集误差之间的差值:方差;
根据可避免偏差和方差的大小来调整:
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,比较难,但是也有很多领域机器已经超过人类。
目标:
方法: