目录
1)Why ML Strategy
2)Orthogonalization
3)Single number evaluation metric
4)Satisficing and optimizing metrics
5)训练/开发/测试集划分(Train/dev/test distributions)
6)Size of dev and test sets
7)When to change dev/test sets and metrics
8)Why human-level performance?
9)Avoidable bias
10)Understanding human-level performance
11)Surpassing human-level performance
12)Improving your model performance
以下笔记是吴恩达老师深度学习课程第三门课第一周的的学习笔记:ML Strategy。笔记参考了黄海广博士的内容,在此表示感谢。
1)Why ML Strategy
假设你正在调试你的猫分类器,经过一段时间的调整,你的系统达到了90%的准确率,但你还是认为你的应用程序不够好,此时我们想对它进行改善,那么我们可以怎么做呢:
- Collect more data
- Collect more diverse training set
- Train algorithm longer with gradient descent
- Try Adam instead of gradient descent
- Try bigger network
- Try smaller network
- Try dropout
- Add L2 regularization
- Network architecture: Activation functions, #hidden units…
这么多可选择的方法,那么我们应该如何选择呢?
2)Orthogonalization
机器学习系统中有许多参数、超参数需要调试。每次只调试一个参数、而保持其它参数不变的方法称为正交化方法。对应到机器学习监督学习模型中,可以按照以下四个步骤进行调试:
Fit training set well on cost function(可以通过使用更大的NN或Adam等优化算法来实现)
Fit dev set well on cost function(通过正则化或收集更多训练样本来实现)
Fit test set well on cost function(使用更多开发集来实现)
Performs well in real world(改变开发集或损失函数)
顺便提一下,early stopping在模型调试中并不推荐使用。因为early stopping在提升开发集性能的同时也会降低训练集的性能。
3)Single number evaluation metric
应用机器学习是一个非常经验性的过程,我们通常有一个想法,编程序,跑实验,看看效果如何,然后使用这些实验结果来改善你的想法,然后继续走这个循环,不断改进你的算法
比如说对于你的猫分类器,之前你搭建了某个分类器,通过改变超参数,还有改变训练集等手段,你现在训练出来了一个新的分类器B,所以评估你的分类器的一个合理方式是观察它的查准率(precision)和查全率(recall)。
但使用查准率和查全率作为评估指标的时候,有个问题,如果分类器A在查全率上表现更好,分类器B在查准率上表现更好,就很难判断哪个分类器更好。此时需要找到一个新的评估指标,能够结合查准率和查全率。
在机器学习文献中,结合查准率和查全率的标准方法是所谓的分数,分数的细节并不重要。但非正式的,你可以认为这是查准率和查全率的平均值。正式来看,分数的定义是这个公式:
但在这个例子中,可以马上看出,分类器的分数更高。假设分数是结合查准率和查全率的合理方式,可以快速选出分类器A,淘汰分类器B。
除了F1 Score之外,我们还可以使用平均值作为单值评价指标来对模型进行评估。如下图所示,A, B, C, D, E, F六个模型对不同国家样本的错误率不同,可以计算其平均性能,然后选择平均错误率最小的那个模型(C模型)
4)Satisficing and optimizing metrics
要把顾及到的所有事情组合成单实数评估指标有时并不容易,在那些情况里,有时候设立满足和优化指标是很重要的。
假设你已经决定你很看重猫分类器的分类准确度,这可以是分数或者用其他衡量准确度的指标。但除了准确度之外,我们还需要考虑运行时间,就是需要多长时间来分类一张图。分类器需要80毫秒,需要95毫秒,需要1500毫秒,就是说需要1.5秒来分类图像。
Accuracy和Running time不太容易综合成单一评价指标。因此,可以将Accuracy作为优化指标(Optimizing metic),将Running time作为满足指标(Satisficing metic)。也就是说,给Running time设定一个阈值,在其满足阈值的情况下,选择Accuracy最高的模型。
概括来说,性能指标(Optimizing metic)是需要优化的,越优越好;而满足指标(Satisficing metic)只要满足设定的阈值就好了。
5)训练/开发/测试集划分(Train/dev/test distributions)
设立训练集,开发集和测试集的方式大大影响了你或者你的团队在建立机器学习应用方面取得进展的速度。同样的团队,即使是大公司里的团队,在设立这些数据集的方式,真的会让团队的进展变慢而不是加快,我们看看应该如何设立这些数据集,让你的团队效率最大化。
举个例子,你要开发一个猫分类器,然后你在这些区域里运营,美国、英国、其他欧洲国家,南美洲、印度、中国,其他亚洲国家和澳大利亚,那么你应该如何设立开发集和测试集呢?
在左边的例子中,设立开发集和测试集时存在一个问题,当在测试集上测试系统时,来自这四个国家或者说下面这四个地区的数据(即测试集数据)和开发集里的数据可能差异很大,在测试集上的表现却不佳。
所以,为了避免这种情况,我建议的是你将所有数据随机洗牌,放入开发集和测试集,所以开发集和测试集都有来自八个地区的数据,并且开发集和测试集都来自同一分布。
6)Size of dev and test sets
当样本数量不多(小于一万)的时候,通常将Train/dev/test sets的比例设为60%/20%/20%,在没有dev sets的情况下,Train/test sets的比例设为70%/30%。当样本数量很大(百万级别)的时候,通常将相应的比例设为98%/1%/1%或者99%/1%。
对于dev sets数量的设置,应该遵循的准则是通过dev sets能够检测不同算法或模型的区别,以便选择出更好的模型。
对于test sets数量的设置,应该遵循的准则是通过test sets能够反映出模型在实际中的表现。
7)When to change dev/test sets and metrics
来看一个例子,假设你在构建一个猫分类器,试图找到很多猫的照片,向你的爱猫人士用户展示,你决定使用的指标是分类错误率。所以算法A和B分别有3%错误率和5%错误率,所以算法A似乎做得更好。
但实际情况可能如下:算法A由于某些原因,把很多色情图像分类成猫了。会给用户推送一些色情图像,这是完全不能接受的。相比之下,算法B有5%的错误率,虽然分类器就得到较少正确的图像,但它不会推送色情图像。用户的角度来说,他们可能更倾向选择B模型,虽然B的错误率高一些。这时候,我们就需要改变之前单纯只是使用错误率作为评价标准,而考虑新的情况进行改变。例如增加色情图片的权重,增加其代价。
更改后的损失函数:
再看一个例子,假设你的两个猫分类器A和B,分别有用开发集评估得到3%的错误率和5%的错误率。或者甚至用在网上下载的图片构成的测试集上,这些是高质量,取景框很专业的图像。但也许你在部署算法产品时,你发现算法B看起来表现更好,即使它在开发集上表现不错,你发现你一直在用从网上下载的高质量图片训练,但当你部署到手机应用时,算法作用到用户上传的图片时,那些图片取景不专业。此时就要更改开发集。
8)Why human-level performance?
机器学习模型的表现通常会跟人类水平表现作比较,如下图所示:
图中,横坐标是训练时间,纵坐标是准确性。机器学习模型经过训练会不断接近human-level performance甚至超过它。但是,超过human-level performance之后,准确性会上升得比较缓慢,最终不断接近理想的最优情况,我们称之为bayes optimal error。理论上任何模型都不能超过它,bayes optimal error代表了最佳表现。
9)Avoidable bias
我们经常使用猫分类器来做例子,比如人类具有近乎完美的准确度,所以人类水平的错误是1%。在这种情况下,如果您的学习算法达到8%的训练错误率和10%的开发错误率,那么你也许想在训练集上得到更好的结果。事实上,你的算法在训练集上的表现和人类水平的表现有很大差距的话,说明你的算法对训练集的拟合并不好。所以从减少偏差和方差的工具这个角度看,在这种情况下,我会把重点放在减少偏差上。你需要做的是,比如说训练更大的神经网络,或者跑久一点梯度下降,就试试能不能在训练集上做得更好。
但现在我们看看同样的训练错误率和开发错误率,假设人类的表现不是1%,我们就把它抄写过来。但你知道,在不同的应用或者说用在不同的数据集上,假设人类水平错误实际上是7.5%,也许你的数据集中的图像非常模糊,即使人类都无法判断这张照片中有没有猫。这个例子可能稍微更复杂一些,因为人类其实很擅长看照片,分辨出照片里有没有猫。但就为了举这个例子,比如说你的数据集中的图像非常模糊,分辨率很低,即使人类错误率也达到7.5%。在这种情况下,即使你的训练错误率和开发错误率和其他例子里一样,你就知道,也许你的系统在训练集上的表现还好,它只是比人类的表现差一点点。在第二个例子中,你可能希望专注减少这个分量,减少学习算法的方差,也许你可以试试正则化,让你的开发错误率更接近你的训练错误率。
在这里注意是判断,我们是过拟合还是欠拟合了。
10)Understanding human-level performance
我们一般用人类水平误差(Human-level Error)来代表贝叶斯最优误差(bayes optimal error)。对于不同领域的例子,不同人群由于其经验水平不一,错误率也不同。一般来说,我们将表现最好的作为人类水平误差。但是实际应用中,不同人选择人类水平误差的基准是不同的,这会带来一定的影响。
举个医学图像识别的例子,不同人群的error有所不同:
- Typical human : 3% error
- Typical doctor : 1% error
- Experienced doctor : 0.7% error
- Team of experienced doctors : 0.5% error,
如果某模型在训练集上的错误率为 0.7%,验证集的错误率为 0.8%。如果选择的人类水平误差为 0.5%,那么偏差(bias)比方差(variance)更加突出;而如果选择的人类水平误差为 0.7%,则方差更加突出。也就是说,根据人类水平误差的不同选择,我们可能因此选择不同的优化操作。
这种问题只会发生在模型表现很好,接近人类水平误差的时候才会出现。人类水平误差给了我们一种估计贝叶斯误差的方式,而不是像之前一样将训练的错误率直接对着 0% 的方向进行优化。
当机器学习模型的表现超过了人类水平误差时,很难再通过人的直觉去判断模型还能够往什么方向优化以提高性能。
11)Surpassing human-level performance
对于感知类问题,例如视觉、听觉等,机器学习的表现还不及人类。但是在很多其它方面,机器学习模型的表现已经超过人类,包括:
- Online advertising
- Product recommendations
- Logistics(predicting transit time)
- Loan approvals
实际上,机器学习模型超过human-level performance是比较困难的。但是只要提供足够多的样本数据,训练复杂的神经网络,模型预测准确性会大大提高,很有可能接近甚至超过human-level performance。值得一提的是当算法模型的表现超过human-level performance时,很难再通过人的直觉来解决如何继续提高算法模型性能的问题。
12)Improving your model performance
想让一个监督学习算法达到使用程度,应该做到以下两点:
-
算法对训练集的拟合很好,可以看作可避免偏差很低;
-
推广到验证集和测试集效果也很好,即方差不是很大