[TOC]
过拟合指的是在训练数据集上表现良好,而在未知数据上表现差,即高方差,如下图所示。其根本原因在于:
1)特征维度过多,模型假设过于复杂;
2)参数过多,训练数据过少;
3)噪声过多
导致拟合的函数完美的预测训练集,但对新数据的测试集预测结果差。 过度的拟合了训练数据,而没有考虑到泛化能力。
欠拟合指的是模型没有很好地学习到数据特征,不能够很好地拟合数据,在训练数据和未知数据上表现都很差,即高偏差,如下图所示。其根本原因在于特征维度过少,模型过于简单,导致拟合的函数无法满足训练集,误差较大。
泛化误差可分解为方差、偏差和噪声三部分。这三部分中,噪声是个不可控因素,它的存在是算法一直无法解决的问题,很难约减,所以我们更多考虑的是方差和偏差。偏差通常是由于我们对学习算法做了错误的假设导致的,而方差通常是由于模型的复杂度相对于训练样本数过高导致的。
假设我们的预测值为$$g(x)$$,真实值为$$f(x)$$,则均方误差为$$E{(g(x) - f(x))^2}$$,这里假设不考虑噪声,$$g$$来代表预测值,$$f$$代表真实值,$$\mathop g\limits^ - = E(g)$$法的期望预测,则有如下表达:
其中,$$E(g - \mathop g\limits^ - )$$为方差,$${(\mathop g\limits^ - - f)^2}$$为偏差的平方。由上述公式可知,方差描述是理论期望和预测值之间的关系,这里的理论期望通常是指所有适用于模型的各种不同分布类型的数据集;偏差描述为真实值和预测值之间的关系,这里的真实值通常指某一个特定分布的数据集合。
所以综上方差表现为模型在各类分布数据的适应能力,方差越大,说明数据分布越分散,而偏差则表现为在特定分布上的适应能力,偏差越大越偏离真实值。下图为偏差和方差示意图。
偏差和方差示意图(图片来源百面机器学习)
泛化误差、偏差、方差和模型复杂度的关系(图片来源百面机器学习)
欠拟合基本上都会发生在训练刚开始的时候,经过不断训练之后欠拟合应该不怎么考虑了。但是如果真的还是存在的话,可以通过增加网络复杂度或者在模型中增加特征,这些都是很好解决欠拟合的方法。
注意:这部分的内容是面试的重点内容,请各位重视
要想解决过拟合问题,就要显著减少测试误差而不过度增加训练误差,从而提高模型的泛化能力。我们可以使用正则化(Regularization)方法。那什么是正则化呢?正则化是指修改学习算法,使其降低泛化误差而非训练误差。
常用的正则化方法根据具体的使用策略不同可分为:(1)直接提供正则化约束的参数正则化方法,如L1 / L2正则化;(2)通过工程上的技巧来实现更低泛化误差的方法,如提前终止(Early stopping)和Dropout;(3)不直接提供约束的隐式正则化方法,如数据增强等。
1)获取和使用更多的数据(数据集增强)——解决过拟合的根本性方法
以图像数据集举例,通常用旋转图像、缩放图像、随机裁剪、加入随机噪声、平移、镜像等方式来增加数据量。
2)特征降维
通过删除冗余特征,人工选择保留特征的方法对特征进行降维。如何对特征降维,我们后续会单独使用一章进行讲解。
3)加入正则化,控制模型的复杂度
常用的正则化方式有L1正则化和L2正则化,L1正则化又叫Lasso回归,L2正则化又叫岭回归。
正则化L1和L2的区别
概括:L1和L2是正则化项,又叫做罚项,是为了限制模型的参数,防止模型过拟合而加在损失函数后面的一项。
区别
-
L1是模型各个参数的绝对值之和,即$$C = {C_0} + \frac{\lambda }{n}\sum\limits_i {\left| {{w_i}} \right|}$$,L2是模型各个参数的平方和,即$$C = {C_0} + \frac{\lambda }{{2n}}\sum\limits_i {{w_i}^2}$$。
-
L1会趋向于产生少量的特征,而其他的特征都是0,因为最优的参数值很大概率出现在坐标轴上,这样就会导致某一维的权重为0 ,产生稀疏权重矩阵; L2会选择更多的特征,这些特征都会接近于0,最优的参数值很小概率出现在坐标轴上,因此每一维的参数都不会是0。
注意:笔者在这里常被面试官问到:L1和L2的使用场景有什么不同或者各自在什么场景下使用。
在这里的话,就要从L1和L2的根本原理上去回答,从上面的区别可知,L1它可以有助于生成一个稀疏权值矩阵,因此可以在特征选择的时候使用。但由于其求导困难,所以在神经网络加入正则化中,我们常用的是L2正则化。
4) Dropout
Dropout指的是在训练过程中每一次按照一定的概率(比如50%)随机地“删除”一部分神经元。所谓的“删除”不是真正意义上的删除,其实就是将该部分神经元的激活函数设为0(激活函数的输出为0),让这些神经元不计算而已,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征。
5)Early stopping
Early stopping便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合
具体做法是,在每一个Epoch结束时计算validation data的accuracy,当accuracy不再提高时,就停止训练。当然我们并不会在accuracy一降低的时候就停止训练,因为可能经过这个Epoch后,accuracy降低了,但是随后的Epoch又让accuracy又上去了,所以不能根据一两次的连续降低就判断不再提高。一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping)。
因为参数的稀疏,在一定程度上实现了特征的选择。一般而言,大部分特征对模型是没有贡献的。这些没有用的特征虽然可以减少训练集上的误差,但是对测试集的样本,反而会产生干扰。稀疏参数的引入,可以将那些无用的特征的权重置为0。
可从以下三个方面来回答
1)如上图所示,假设$$L1$$正则化公式为$$C = {C_0} + \frac{\lambda }{n}\sum\limits_i {\left| {{w_i}} \right|}$$,其中$${C_0}$$是原始的损失函数,加号后面的一项是$$L1$$正则化项,$$ \frac{\lambda }{n}$$是正则化系数。那么从该公式我们可以知道,$$C$$是带有绝对值符号的函数,因此$$C$$是不完全可微的。而在机器学习的任务就是要通过一些方法(比如梯度下降)求出损失函数的最小值。当我们在原始损失函数$${C_0}$$添加$$L1$$正则化项后,相当于对$${C_0}$$做了一个约束。令$$L = \frac{\lambda }{n}\sum\limits_i {\left| {{w_i}} \right|} $$,那么$$C = {C_0} + L$$。此时我们的任务变成在L的约束下求出$${C_0}$$取最小值的解。考虑二维的情况,即只有两个权值$${w^1}$$和$$w^2$$。此时$$L = \left| {{w^1}} \right| + \left| {{w^2}} \right|$$,对于梯度下降法,求解$${C_0}$$的过程可以画出等值线,同时L1正则化函数L也可以在$$w^1$$$$w^2$$所表示的平面画出来,如上图(b)所示。
在图中,当$${C_0}$$等值线与$$L$$图形首次相交的地方就是最优解。上图中$${C_0}$$与$$L$$在$$L$$的一个顶点处相交,这个顶点就是最优解。注意到这个顶点的值是$$({w^1},{w^2}) = (0,w)$$。可以直观想象,因为$$L$$函数有很多『突出的角』(二维情况下四个,多维情况下更多),$${C_0}$$与这些角接触的机率会远大于与$$L$$其它部位接触的机率(这是很直觉的想象,突出的角比直线的边离等值线更近写),而在这些角上,会有很多权值等于0(因为角就在坐标轴上),这就是为什么$$L1$$正则化可以产生稀疏模型,进而可以用于特征选择。
而正则化前面的系数$$\frac{\lambda }{n}$$,可以控制$$L$$图形的大小。$$\frac{\lambda }{n}$$越小,$$L$$的图形越大(上图中的黄色方框);$$\frac{\lambda }{n}$$越大,$$L$$的图形就越小,可以小到黑色方框只超出原点范围一点点,这是最优点的值$$({w^1},{w^2}) = (0,w)$$中的$$w$$可以取到很小的值。
而对于L2正则化来说,假设其公式为$$C = {C_0} + \frac{\lambda }{{2n}}\sum\limits_i {{w_i}^2}$$,其在二维平面的图如上(a)图所示。可以看出,二维平面下$$L2$$正则化的函数图形是个圆(绝对值的平方和,是个圆),与方形相比,被磨去了棱角。因此$${C_0}$$与$$C$$相交时使得$$w^1$$或者$$w^2$$等于0的几率小了很多(这个也是一个很直观的想象),这就是为什么$$L2$$正则化不具有稀疏性的原因,因为不太可能出现多数$$w$$都为0的情况。
2)从梯度的角度来看(上面的只是直观解释,有些面试官可能还会问你有没有其他解释,那么这时候可以从梯度的角度来出发)
L1正则化$$C = {C_0} + \frac{\lambda }{n}\sum\limits_i {\left| {{w_i}} \right|}$$对应的梯度为:$$\frac{{\partial C}}{{\partial w}} = \frac{{\partial {C_0}}}{{\partial w}} + \frac{\lambda }{n}{\mathop{\rm sgn}} (w)$$。其中,$${\mathop{\rm sgn}} (w)$$只是简单地取$$w$$各个元素地正负号。 $$ {\mathop{\rm sgn}} (w)\left{ \begin{array}{l} 1{\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} w > 0\ 0{\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} w = 0\
- 1{\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} w < 0 \end{array} \right. $$ 那么当梯度下降时权重$$w$$更新为:
- 当
$$w = 0$$ 时,|w|是不可导的。所以我们仅仅能依照原始的未经正则化的方法去更新$$w$$。 - 当
$$w > 0$$ 时,$$sgn(w)>0$$, 则梯度下降时更新后的$$w$$ 变小。 - 当
$$w < 0$$ 时,,$$sgn(w)<0$$ 则梯度下降时更新后的$$w$$变大。换句换说,$$L1$$正则化使得权重$$w$$ 往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。
L2正则化通常被称为权重衰减(weight decay),就是在原始的损失函数后面再加上一个L2正则化项,即全部权重$$w$$的平方和,再乘以$$λ/2n$$。则损失函数变为: $$ C = {C_0} + \frac{\lambda }{{2n}}\sum\limits_i {{w_i}^2} $$ 对应的梯度为$$\frac{{\partial C}}{{\partial w}} = \frac{{\partial {C_0}}}{{\partial w}} + \frac{\lambda }{n}w$$和$$\frac{{\partial C}}{{\partial b}} = \frac{{\partial {C_0}}}{{\partial b}}$$。
能够发现$$L2$$正则化项对偏置
这里的$$\eta $$、$$n$$、$$\lambda $$都是大于0的, 所以$$1 - \frac{{\eta \lambda }}{n}$$小于1。因此在梯度下降过程中,权重$$w$$将逐渐减小,趋向于0但不等于0。这也就是**权重衰减(weight decay)**的由来。
**L2正则化起到使得权重参数$$w$$变小的效果,为什么能防止过拟合呢?**因为更小的权重参数
参考链接:https://zhuanlan.zhihu.com/p/72038532
- 从下图可以看出,服从拉普拉斯分布的$$L1$$正则项更倾向于产生稀疏参数,而服从高斯分布的$$L2$$正则项在0处相对比较平滑,在参数绝对值较大处抑制效果更好,使整体数据的分布更接近0。
(1)取平均的作用:先回到标准的模型即没有dropout,我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。例如3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。
(2)减少神经元之间复杂的共适应关系: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。
(3)Dropout类似于性别在生物进化中的角色:物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。
参考链接:https://zhuanlan.zhihu.com/p/38200980
Dropout在训练时采用,是为了减少神经元对部分上层神经元的依赖,类似将多个不同网络结构的模型集成起来,减少过拟合的风险。而在测试时,应该用整个训练好的模型,因此不需要dropout。
Dropout 在训练时以一定的概率使神经元失活,实际上就是让对应神经元的输出为0
假设失活概率为 p ,就是这一层中的每个神经元都有p的概率失活,如下图的三层网络结构中,如果失活概率为0.5,则平均每一次训练有3个神经元失活,所以输出层每个神经元只有3个输入,而实际测试时是不会有dropout的,输出层每个神经元都有6个输入,这样在训练和测试时,输出层每个神经元的输入和的期望会有量级上的差异。
因此在训练时还要对第二层的输出数据除以(1-p)之后再传给输出层神经元,作为神经元失活的补偿,以使得在训练时和测试时每一层输入有大致相同的期望。
BN和Dropout单独使用都能减少过拟合并加速训练速度,但如果一起使用的话并不会产生1+1>2的效果,相反可能会得到比单独使用更差的效果。
参考链接:https://www.zhihu.com/tardis/sogou/art/61725100
L1 正则先验分布是 Laplace 分布,L2 正则先验分布是 Gaussian 分布。
Laplace 分布公式为: $$ f(x \mid \mu, \delta)=\frac{1}{2 \delta} \exp \left(-\frac{|x-\mu|}{\delta}\right) $$ Gaussian 分布公式为: $$ f(x \mid \mu, \delta)=\frac{1}{\sqrt{2 \pi} \delta} \exp \left(-\frac{(x-\mu)^{2}}{2 \delta^{2}}\right) $$ 接下来从最大后验概率的角度进行推导和分析。在机器学习建模中,我们知道了𝑋和𝑦 以后,需要对参数进行建模。那么后验概率表达式如下。 $$ P=\log P(y \mid X, w) P(w)=\log P(y \mid X, w)+\log P(w) $$ 可以看出来后验概率函数是在似然函数的基础上增加了$\log P(w)$,$P(w)$的意义是对权 重系数𝑤的概率分布的先验假设,在收集到训练样本𝑋,𝑦后,则可根据𝑤在𝑋,𝑦下的 后验概率对𝑤进行修正,从而做出对𝑤的更好地估计。若假设的𝑤先验分布为 0 均值的 高斯分布,即: $$ P(w)=\frac{1}{\sqrt{2 \pi} \delta} \exp \left(-\frac{w^{2}}{2 \delta^{2}}\right) $$ 则有 $$ \begin{aligned} \log P(w) &=\log \prod_{j} P\left(w_{j}\right)=\log \sum_{j}\left[\frac{1}{\sqrt{2 \pi} \delta} \exp \left(-\frac{w_{j}^{2}}{2 \delta^{2}}\right)\right] \ =&-\frac{1}{2 \delta^{2}} \sum_{j} w_{j}^{2}+C \end{aligned} $$ 可以看到,在高斯分布下的效果等价于在代价函数中增加 L2 正则项。若假设服从均值 为 0,参数为𝛿的拉普拉斯分布,即 $$ P\left(w_{j}\right)=\frac{1}{2 \delta} \exp \left(-\frac{|w|}{\delta}\right) $$ 则有 $$ \begin{aligned} \log P(w)=& \log \prod_{j} P\left(w_{j}\right)=\log \sum_{j}\left[\frac{1}{2 \delta} \exp \left(-\frac{\left|w_{j}\right|}{\delta}\right)\right] \ &=-\frac{1}{\delta} \sum_{j}\left|w_{j}\right|+C \end{aligned} $$ 可以看到,在拉普拉斯分布下的效果等价于在代价函数中增加 L1 正项。