1.机器学习策略
如何改善模型的性能?
- 收集更多数据
- 收集更多不同的训练集
- 训练的时间更久一点
- 尝试不同的优化算法,如Adam优化算法
- 尝试规模更大或更小的神经网络
- 尝试dropout
- 尝试L2正则化
- 修改网络架构,例如修改激活函数、改变隐藏单元数目等
2.正交化
搭建机器学习系统的挑战之一是你可以尝试和改变的东西太多了。
那些效率很高的机器学习专家有一个特点是他们很清楚的知道要调整什么,来达到某个效果。
机器学习中有许多参数、超参数需要调试。通过每次只调试一个参数,保持其它参数不变,而得到的模型某一性能改变是一种最常用的调参策略,我们称之为正交化方法(Orthogonalizatiion)。
Orthogonalization的核心在于每次调试一个参数只会影响模型的某一个性能。这种方法能够让我们更快更有效的进行机器学习模型的调试和优化。
1.首先确保在训练集上有不错的表现(训练更大的网络,Adam优化)
2.在开发集上有不错的表现(增大训练集、正则化)
3.在测试集上有不错的表现(更大的开发集)
4.在现实中表现好(改变开发集或cost函数)
(括号中表示如表现不好的话,可以采取的方法)
定位出模型的性能瓶颈出现在哪一步,然后用对应的方法来改善。
3.单一数字评估指标
有一个单一数字评估指标可以提高你决策的效率。
4.满足和优化指标
有时把多个指标综合在一起变成单一数字评估指标是比较困难的。
我们可以把某些指标作为优化指标,某些指标作为满足指标。
优化指标是需要优化的,寻找最优值;满足指标只要达到某个阈值,而不关心在阈值内的大小。
5.训练/开发/测试集划分
训练/开发/测试集如何设置对机器学习的模型训练非常重要,合理设置能够大大提高模型训练效率和模型质量。
尽量保证开发集和测试集来自同一分布,并都反映了实际样本的情况。
如果开发集和测试集不来自同一分布,那么我们从开发集上选择的最佳模型往往不能够在测试集上表现得很好。
6.开发集和测试集的大小
在早期机器学习,样本数量不多的情况下(少于1万),通常将训练集/开发集/测试集划分为60%/20%/20%,如果没有开发集,则划分为70%/30%。
在现代机器学习中,我们习惯操作规模大的数据集,比如你有100万个训练样本,那么划分为98%/1%/1%更合理。
对于开发集数量的设置,应该遵循的准则是通过开发集能够检测不同算法或模型的区别,以便选择出更好的模型。
对于测试集数量的设置,应该遵循的准则是通过测试集能够反映出模型在实际中的表现。
7.什么时候该改变开发/测试集和指标
算法模型的评价标准有时候需要根据实际情况进行动态调整,目的是让算法模型在实际应用中有更好的效果。
机器学习可分为两个过程:
- 定义正确的评估指标来更好的给分类器的好坏进行排序
- 优化评估指标
但是在训练的过程中可能会根据实际情况改变算法模型的评价标准,进行动态调整。
另外一个需要动态改变评价标准的情况是开发/测试集与实际使用的样本分布不一致。
比如你的开发/测试集都是很清晰的专业图片,而应用最终上线是针对不专业的图片(模糊,角度不好等),那么就要更改开发/测试集,加入不专业图片作为训练数据。
8. 人类的表现水准
机器学习的表现通常会与人类表现作比较。
机器学习模型经过训练会不断接近人类表现甚至超过它。但是,超过人类表现之后,准确性会上升得比较缓慢,最终不断接近理想的最优情况,我们称之为贝叶斯最优误差。理论上任何模型都不能超过它,贝叶斯最优误差代表了最佳表现。
9.可避免偏差
实际应用中,要看人类水平误差,训练集误差和开发集误差的相对值。
例如猫类识别的例子中,如果人类水平误差为1%,训练集误差为8%,开发集误差为10%。由于训练集误差与人类水平误差相差7%,开发集误差与训练集误差只相差2%,所以目标是尽量在训练过程中减小训练集误差,即减小偏差。如果图片很模糊,肉眼也看不太清,人类水平误差提高到了7.5%。这时,由于训练集误差与人类水平误差只相差0.5%,开发集误差与训练集误差只相差2%,所以目标是尽量在训练过程中减小开发集误差,即减小方差。
对于物体识别这类CV问题,人类水平误差是很低的,很接近理想情况下的贝叶斯最优误差。因此,上面例子中的1%和7.5%都可以近似看成是两种情况下对应的贝叶斯最优误差。实际应用中,我们一般会用人类水平误差代表贝叶斯最优误差。
通常,我们把训练集误差与人类水平误差之间的差值称为偏差,也称作可避免偏差;把开发集误差与训练集误差之间的差值称为方差。根据偏差和方差值的相对大小,可以知道算法模型是否发生了欠拟合或者过拟合。
假设针对两个问题分别具有相同的训练集误差和开发集误差,如下所示:
对于左边的问题,人类的误差为1%,对于右边的问题,人类的误差为7.5%。
左边的例子:8%与1%差距较大
主要着手减少偏差,即减少训练集误差和人类水平误差之间的差距,来提高模型性能。
右边的例子:8%与7.5%接近
主要着手减少方差,即减少开发集误差和训练集误差之间的差距,来提高模型性能
10.改善模型
改进偏差:
- 更大规模的模型
- 训练更久、迭代次数更多
- 更好的优化算法(如Momentum、RMSprop、Adam)
- 更好的神经网络结构
- 更好的超参数
- 改变激活函数、网络层数、隐藏单元数
- 其他模型(循环NN,卷积NN)
改进方差:
- 收集更多的数据去训练
- 正则化(L2正则、dropout正则、数据增强)
- 更好的神经网络结构
- 更好的超参数