深度学习中的【误差分析】及【模型性能改善】
1、前言
学完吴恩达老师的深度学习后,对深度学习也有有了较为基础而全面的认识,但是还是没有形成肌肉记忆,有些时候反应不过来,索性开一个专题将自己不太熟悉的部分重新再梳理一遍。整理一些比较容易搞混的地方的,如有疏漏或者错误也欢迎大家批评指正,我们的目标是一起学习进步。
- 在训练模型时,如何对训练误差和测试误差进行分析?又该如何改善呢?本文章将产生误差的情形进行分类,并给出对应的解决措施。
- 这一节和吴恩达老师课程中讲的“误差分析”那一节不是一样的,而是对于训练误差和验证误差的分析,请注意。
- 保证文章逻辑清晰,全篇读完相信你会收获颇深。
2、正交化
首先需要有正交化的概念,正交化或正交性是一种系统设计属性,其确保修改算法的指令或部分不会对系统的其他部分产生或传播副作用。 相互独立地验证使得算法变得更简单,减少了测试和开发的时间。1
在机器学习中,一个好的模型需要满足如下假设链。
- 训练误差小
- 验证误差小
- 测试误差小
- 实际应用中表现好
如果对应不同的问题需要调整时,操作需要尽量满足正交化,即可以减少验证误差,但是不会对其他步造成影响,比如测试误差小,但是验证误差大时,可以使用正则化(L2正则),更大的训练集等,但是最好不要使用早停法,因为早停法也会影响训练误差,这个方法就不是正交的。
- 注意,有些时候会认为早停法也属于正则化,因为广义的正则就是为了防止过拟合,而此时的正则应该是L2正则、dropout等。
3、偏差(Bias)、方差(Variance)2 3
一、偏差、方差的概念
- 偏差(Bias):预测值和真实值之间的误差
- 方差(Variance):预测值之间的离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散。
在模型不断地训练迭代过程中,我们能碰到四种情况:
- 低偏差,低方差:这是训练的理想模型,此时蓝色点集基本落在靶心范围内,且数据离散程度小,基本在靶心范围内;
- 低偏差,高方差:这是深度学习面临的最大问题,过拟合了。也就是模型太贴合训练数据了,导致其泛化(或通用)能力差,若遇到测试集,则准确度下降的厉害;
- 高偏差,低方差:这往往是训练的初始阶段;
- 高偏差,高方差:这是训练最糟糕的情况,准确度差,数据的离散程度也差。
二、偏差—方差均衡(Tradeoff)
对于样本数据,如果选择的模型过于简单,学不到很多信息,此时模型的预测值和真实值误差很大,也就是偏差很大,随着模型的复杂度提升,学到的信息也越来越多,使得偏差逐渐降低。
同样的,随着模型复杂的提升,数据相对模型而言变得简单,使得模型学到了更多的数据噪音,方差也就越来越大。
泛化误差=数据本身噪声+偏差+方差
如下图蓝线,所以需要在中间位置找到一个合适的模型复杂度,使得泛化误差尽可能地小。过于简单导致欠拟合,过于复杂导致过拟合。
这也就是我们常说的训练误差随着模型复杂度地提升而降低,而泛化误差会逐渐增大。训练误差更多和偏差相关,偏差越小,模型就越能拟合训练数据。
- 由上图可知,训练误差和偏差走势是一致的,随着模型复杂度增加,都是逐渐减小,所以可以用偏差来描述训练情况,偏差大,说明训练误差大。而泛化误差和偏差和方差都有关,泛化误差=数据本身噪声+偏差+方差。所以可以用偏差和方差来表示训练误差和验证误差。
三、可避免偏差
- 当人类水平的错误是 1%。在这种情况下,如果学习算法达到 8%的训练错误率和10%的开发错误率。所以从减少偏差和方差的工具这个角度看,在这种情况下,需要把重点放在减少偏差上。
- 当人类水平的错误是 7.5%。在这种情况下,如果学习算法达到 8%的训练错误率和10%的开发错误率,需要把重点放在减少方差上。因为此时相对于偏差来说,方差对于模型的影响更大。
贝叶斯错误率或者对贝叶斯错误率的估计和训练错误率之间的差值称为可避免偏差,你可能希望一直提高训练集表现,直到你接近贝叶斯错误率,而训练错误率和开发错误率之前的差值,就说明你的算法在方差问题上还有多少改善空间。
4、误差分析
- 从此图着手分析:
-
训练误差大时,直观来看,泛化误差一般也会很大。此时需要着手解决训练误差大的问题。也就是可避免偏差(如果此时方差小,说明在训练初期)。
-
训练误差小,泛化误差大。说明此时方差大,模型过拟合了,解决过拟合的方法可以参考我写的另一篇博客:深度学习——这可能是你看过的最全的【正则化】的讲解。因为广义的正则化就是为了解决模型过拟合的问题。
5、如何改善模型表现
一个好的模型:
- 训练误差小(偏差小)
- 泛化误差小(在偏差尽可能小的时候,方差也要小,因为要找到一个平衡点)
- 在改善模型性能时,也要注意正交化。首先改善训练误差,再改善泛化误差。(因为我们的目的是要找到泛化误差最好的那个时刻,而泛化误差和偏差和方差都有关,所以要先改善偏差,再改善方差,有点像条件概率)
一、减小偏差:
- 训练更大的模型(当模型较为简单,复杂度低时,无法完全学会数据特征,导致训练误差大)
- 增加训练时间(可能是训练轮数不够,还未充分学习)
- 使用更好的优化算法(momentum、Adam、RMSprop等),加快梯度下降的收敛速度
- 改善网络结构,调参(dddd)
二、减小方差:
- 训练更多数据(模型见过更多的数据,学习能力自然增强,泛化能力也增加)
- 正则化(L2正则化、dropout、数据增强)
- 改善网络结构,调参(dddd)
可以看出,减少方差和偏差中有些方式是相似的,所以可能会出现我们预料之外的结果,但是方法有这些,可以多多尝试。
总结
偏差、方差和训练误差、验证误差之间的关系,以及正交化的思想在模型性能改善中的体现。