训练集:用于训练模型;
验证集(开发集):用于调整模型超参数,验证不同算法、检验哪种算法更有效;
测试集:根据最终的分类器,正确评估分类器的性能。
正交化
正交是一种系统设计属性,它确保修改一条指令或算法的一个组件不会产生或传播副作用到系统的其他组件。独立地验证算法变得更加容易,减少了测试和开发时间。当设计监督学习系统时,这4个假设需要是真实和正交的:
- 系统在训练集上得到的结果不错(可能达到人类水平表现);若表现不好,则需要更大的网络或更好的优化算法。
- 在开发集上也有不错的表现,若在训练集表现良好,但在开发集上表现不好,则需要引入正则化或更大的训练集;
- 在测试集中也有良好的表现,若在开发集上表现良好,但在测试集表现不好,则需要更大的开发集;
- 在实际使用中表现令人满意。若在实际使用中表现不好,需要改变开发集或成本函数。因为根据某个损失函数,在测试集上做得很好,但它无法反映你的算法在现实世界中的表现,这意味着你得开发集分布设置不正确,要么就是损失函数测量指标不对。
如何为问题设置一个单实数评估指标?
查准率P:在被分类器标记为A的样本中,有多少样本的真实类别为A;
查全率R:对于所有A类的样本,有多少被分类器识别出来。
F1得分: ;
满足和优化指标
设最大限度提高准确率,但运行时间必须满足要求。则准确度就是优化指标,运行时间就是满足指标。若有N个指标,可将一个作为优化指标,其余作为满足指标(达到一定阈值)。
训练/开发/测试集的划分
把所有数据(例如不同地区的数据)随机洗牌,放入开发集和测试集,使开发集和测试集来自同一分布。选择能反映你未来获取数据的开发集和测试集。
设立开发集以及评估指标,就真的定义了你要瞄准的目标,而设立训练集的方式会影响你逼近那个目标有多快。
开发集和测试集的大小
当数据较少时,7/3、6/2/2分是合理的。当数据较大时(如百万级别),就应设置为98%是训练集,1%开发集和1%测试集。因为在现代深度学习时代,我们拥有大得多数据集,所以用小于20%比例作为开发集或测试集都是合理的。
建议:1、测试集应足够大地能反映你系统的性能;2、测试集对评估最终的分类器有帮助,其大小可以小于整个数据集的30%;3、开发集应足够大地能评估不同分类器的性能。
只有训练集和开发集但没有测试集这种情况也是可以的,但需要开发集足够大以不至于陷入过拟合。但不建议,因为有了测试集后,你可以用这组不带偏差的数据来测量系统的性能。
何时修改开发/测试集和评估指标
如果你的评估指标无法正确评估好算法的排名,那么就需要花时间定义一个新的评估指标。评估指标的意义在于找出已知的几个分类器,哪个更适合你的应用。
处理机器学习问题时,应该把它切分成独立的步骤:
- 弄清楚如何定义一个指标来衡量你想做的事情的表现;
- 然后我们可以分开考虑如何改善系统在这个指标上的表现;
(以上两步体现正交化,两者独立)
最好不要在没有评估指标和开发集时跑太久,这会减慢你的团队迭代和改善算法的速度。
与人类表现水平对比
机器在超越人类表现后进展会变慢的原因:
- 人类水平在很多任务中已经离贝叶斯最优误差不远;
- 只要机器的表现比人类的表现更差,那么实际上可以使用某些工具来提高性能,一旦超越人类的表现,这些工具就没那么好用了。如1. 从人类中获得标签数据;2. 使用人工误差分析;3. 更好地分析偏差和方差。一旦算法表现优于人类,这三种策略就失效了。
可避免误差
训练误差和贝叶斯最优误差的差值,说明了有一些偏差或误差有一个无法超越的最低水平。
如果想要用人类水平误差替代或者估计贝叶斯误差,应选取最小的那个指标值,如医学影像断症,在一般人群、医生、有经验的医生的不同群体中,误差值不同,一般选取有经验的医生的指标值。
当机器接近人类水平时,合理地估计贝叶斯最优误差很重要。一旦机器超越了人类的水平,就很难判断往什么方向优化。
如何提高你的模型的性能
在监督学习中,有两个基础的假设:
- 你的算法对训练集拟合得很好(可避免偏差很低),否则可训练更大的网络或训练更长的时间;
- 从训练集推广到开发集和测试集也表现很好(方差不太大),否则可引入正则化或收集更多的训练数据。
减少可避免偏差和方差
- 对于减少可避免偏差,可训练更大的网络、训练更长的时间、选择更好的优化算法(加入momentum、RMS prop、Adam)、寻找更好的神经网络架构或者搜索更好的超参数(激活函数、隐藏层层数和神经元个数);
- 对于减少方差,可增加数据量,引入正则化(L2,dropout)、数据增强、改变神经网络架构和超参数等。