一.误差、偏差和方差的理解
我们衡量一个机器学习算法是否好的时候,最直接的方法是衡量算法预测和测量数据的误差。比如对于训练数据,损失函数就是衡量这种误差的方法。
训练一个神经网络时,损失函数降到一个非常小的值,我们说网络很好地收敛了。然而当网络训练好以后,是否能对训练数据以外的数据也做出很好的预测呢?其实这才是更看重的指标,这种对训练数据以外数据做出准确预测的能力称为泛化(generalization)能力。
接下来我们先介绍误差、偏差和方差的相关知识:
误差
误差(Error):一般地,我们把机器学习的实际预测输出与样本的真实输出之间的差异称为“误差”。
误差(Error) = 偏差(Bias) + 方差(Variance) + 噪声(Noise),误差反应的是整个模型的准确度。
噪声
噪声(Noise):描述了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。
偏差
偏差(Bias):衡量了模型拟合训练数据的能力(训练数据不一定是整个数据集,可能只是用于训练的一部分数据,例如mini-batch),Bias反应的是模型在样本上的输出与真实值之间的误差,即模型本身的精确度。
偏差(Bias)越小,拟合能力却强(可能产生过拟合);反之,拟合能力越弱(可能产生欠拟合)。
偏差越大,越偏离真实数据,如下面的图所示。
方差
方差(Variance)公式:
方差描述的是预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散,模型的稳定程度越差。
方差反应的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。
方差越小,模型的泛化能力越高;反之,模型的泛化能力越低。
如果模型在训练集上拟合效果比较优秀,但是在测试集上拟合效果比较差,则表示方差较大,说明模型的稳定程度较差,出现这种现象可能是由于模型对训练集过拟合造成的。如下面的图所示。
经验误差与泛化误差
经验误差(empirical error):也叫训练误差(training error),模型在训练集上的误差。
泛化误差(generalization error): 模型在测试集上的误差称为“泛化误差”或者称之为“测试误差(test error)”。
一般来说,训练误差是否变小代表着学习的过程是否收敛,而测试误差是否足够小则和模型对于未见过的样本预测能力的好坏直接相关。
通常来说,测试误差总是大于训练误差,不过这两者随着模型能力的变化趋势并不相同。
二.欠拟合和过拟合
首先我们看一个一维拟合的例子:
上面的三个图都是同样的数据点,这些点都是由一个“倒U”形状的曲线叠加一个高斯分布的噪声产生的。其中红色的圆点是用来训练的数据,蓝色的三角形点则是测试的数据。红色的点和蓝色的点都来自同一个分布。 在机器学习中,这种分布通常称为数据产生分布(data-generating distribution),训练数据和测试数据来源于同一分布,是机器学习中的一个基本假设。
在数据同分布的假设下,从训练数据中学习到的特征,才能有效预测没有见过但是和训练数据来源于同一分布的数据,这个过程就是泛化。
上图a中尝试用一个线性的模型去拟合红色的圆点数据,结果是训练集和测试集都难以学习好。其根本原因是线性拟合的模型过于简单,表达能力不足以学习到数据点的特征,这样的情况我们称之为欠拟合。
上图b中的模型非常复杂,,比如可以是一个包含很多高次项的多项式,或者是一个隐藏层单元很多的双层神经网络。这样的模型有了很强的表达能力,训练集上很好的拟合。但是这个模型连噪声数据的特征都学习了,丧失了对测试集的泛化能力,称为过拟合。
上图c中用一个适度复杂的模型,成功的学习到了数据的趋势,这才是我们想要的模型。
相关图解
误差与训练样本数量
横轴为训练样本数量,纵轴为误差。
如上图所示,我们可以直观地看出欠拟合和过拟合的区别:
- 模型欠拟合:在训练集以及测试集上同时具有较高的误差,此时模型的偏差较大。
- 模型过拟合:在训练集上具有较低的误差,在测试集上具有较高的误差,此时模型的方差较大。
- 模型正常:在训练集以及测试集上,同时具有相对较低的偏差以及方差。
误差与模型复杂度
上图横轴为模型复杂度,纵轴为误差。
红线为测试集上的Error,蓝线为训练集上的Error。
- 模型欠拟合:模型在点A处,在训练集以及测试集上同时具有较高的误差,此时模型的偏差较大。
- 模型过拟合:模型在点C处,在训练集上具有较低的误差,在测试集上具有较高的误差,此时模型的方差较大。
- 模型正常:模型复杂度控制在B点处为最优。
接下来我们详解解释上图的过程。
首先,当模型的复杂度不高时,训练误差和测试误差都会随着模型复杂度的增加而降低,这对应着欠拟合。
当模型的复杂度恰到好处的时候,测试误差达到最小。随着模型复杂度的继续增加,模型开始在能够学习训练数据分布的基础上,进而开始学习到每一个训练数据(特别是噪声数据),这就是过拟合。 所以测试误差会越变越大。
这个趋势曲线中的测试误差和训练误差的差异(generalization gap)随着模型复杂度的增加使不断变大的。当模型复杂度过了最佳的点时,这个差异的增长速度就会超过训练误差的下降速度,这就是为什么测试误差会越来越大。
通常我们会希望测试误差和训练误差的差异尽可能小,因为这代表了更好的泛化能力。由于数据都是来源于某种分布,如果从抽样的观点来看待训练数据,根据最基本的统计知识,数据量越大,抽样误差越小。也就是说随着数据量的增加模型对真实分布描述的误差就越小,泛化能力就越强。不过就算无限增加数据量,也不能完全解决误差的问题,因为数据中还隐含了一个假设,那就是我们讨论的都是带有随机性的数据。 这些随机性有可能是误差,有可能是一些难以观测到的变量。
我们再来看一个例子:
如上图所示,a中代表数据不够多的时候,我们得到的实线代表最优模型,黑色虚线代表真实数据下能得到的最优模型。可以看出,数据量少的时候,对真实分布的描述会有较大的误差,所以两线完全没有重合。
b中代表有更多的数据,最优模型的泛化能力会强一些,但模型的复杂度一般会更高。在训练数据集上的误差会增加,而对真实数据的误差会下降,并且下降程度会超过训练误差的上升程度,图中可以看出实线和虚线的差异变小了。
c中代表了极端的情况,我们可以获取任意的数据,或者说对到最真实分布的描述误差可以忽略。这种情况下,可以认为是得到了完美的模型,训练误差和测试误差的差异可以忽略不计了,他们会趋向于同一个值,那就是贝叶斯误差(Bayes error)。
误差与正则项系数
上图横轴为正则项系数,纵轴为误差。
红线为测试集上的Error,蓝线为训练集上的Error。
- 模型欠拟合:模型在点C处,在训练集以及测试集上同时具有较高的误差,此时模型的偏差较大。
- 模型过拟合:模型在点A处,在训练集上具有较低的误差,在测试集上具有较高的误差,此时模型的方差较大。它通常发生在模型过于复杂的情况下,如参数过多等,会使得模型的预测性能变弱,并且增加数据的波动性。虽然模型在训练时的效果可以表现的很完美,基本上记住了数据的全部特点,但这种模型在未知数据的表现能力会大减折扣,因为简单的模型泛化能力通常都是很弱的。
- 模型正常:模型复杂度控制在B点处为最优。
如何解决欠拟合:
- 添加新的特征项。组合、泛化、相关性、上下文特征、平台特征等特征是特征添加的重要手段,有时候特征项不够会导致模型欠拟合。在深度学习潮流中,有很多模型可以帮助完成特征工程,如因子分解机、梯度提升决策树、Deep-crossing等都可以成为丰富特征的方法。
- 可以增加模型复杂度。比如添加多项式特征,将线性模型添加二次项或三次项使模型泛化能力更强。对于神经网络可以增加网络层数或者神经元数量。
- 减小正则化系数。正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要有针对性地减小正则化系数。
如何解决过拟合:
- 重新清洗数据,数据不纯会导致过拟合,此类情况需要重新清洗数据或重新选择数据。
- 增加训练样本数量。使用更多的训练数据是解决过拟合最有效的手段。 我们可以通过一定的规则来扩充训练数据,比如在图像分类问题上,可以通过图像的平移、旋转、缩放等方式扩充数据;也可以用GAN网络来合成大量的新训练数据。
- 降低模型复杂程度。适当降低模型复杂度可以避免模型拟合过多的噪声数据。在神经网络中减少网络层数、神经元个数等;在决策树模型中降低树额深度、进行减枝等。
- 加入正则化方法,增大正则项系数。给模型的参数加上一定的正则约束,比如将权值的大小加入到损失函数中。
- 采用dropout方法,dropout方法就是在训练的时候让神经元以一定的概率失活。
- 提前截断(early stopping)。
- 减少迭代次数。
- 增大学习率。
- 减少特征项。
- 集成学习方法。集成学习是把多个模型集成在一起,来降低单一模型的过拟合风险,如Bagging方法。