了解机器学习的同学都知道,为了检验学习算法的有效性,我们常常会通过实验估计其泛化性能。可是,在实验过程中我们不难发现,同一学习算法在不同的数据集上效果。这又是为什么呢?“偏差-方差分解”为我们提供了解释依据。
简介
在通过实验检验学习算法泛化性能的过程中,人们还往往希望了解它为什么具有这样的性能。而“偏差——方差分解”是解释算法泛化性能的一种重要工具。
“偏差——方差分解”试图对学习算法的期望错误率进行拆解。前面提到,同一个学习算法在不同数据集上的学习效果是不同的,即使这些数据集满足同一种分布。而这又是为什么呢?
数学推导
为了便于数学推导,我们假设在数据集 D D D中,测试样本为 x x x, y D y_{D} yD为数据集中 x x x的标记, y y y为 x x x的真实标记(即数据集本身可能受噪声干扰,与真实数据有所不同),某学习算法在数据集 D D D上学得模型 f f f,模型的预测输出为 f ( x ; D ) f(x;D) f(x;D)。以回归任务为例,学习算法的期望预测输出为,
f ˉ ( x ) = E D [ f ( x ; D ) ] \bar{f}(x) = E_{D}[f(x;D)] fˉ(x)=ED[f(x;D)]
使用样本数相同的不同数据集产生的方差为,
v a r ( x ) = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] var(x) = E_{D}[(f(x;D) - \bar{f}(x))^{2}] var(x)=ED[(f(x;D)−fˉ(x))2]
噪声为,
ε 2 = E D [ ( y D − y ) 2 ] \varepsilon^{2} = E_{D}[(y_{D} - y)^{2}] ε2=ED[(yD−y)2]
期望输出与真实数据的标记差别即为偏差,
b i a s 2 ( x ) = [ f ˉ ( x ) − y ] 2 bias^{2}(x) = [\bar{f}(x) - y]^{2} bias2(x)=[fˉ(x)−y]2
此外,为便于讨论,我们假设噪声的数学期望为零,即 E D [ y D − y ] = 0 E_{D}[y_{D} - y] = 0 ED[yD−y]=0。则通过简单的多项式拆解,我们可以对算法的期望泛化误差进行如下分解:
E ( f ; D ) = E D [ ( f ( x ; D ) − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) + f ˉ ( x ) − y D ) 2 ] = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] + E D [ ( f ˉ ( x ) − y D ) 2 ] + E D [ 2 ( f ( x ; D ) − f ˉ ( x ) ) ( f ˉ ( x ) − y D ) ] \begin{aligned} E(f;D) &= E_{D}[(f(x;D) - y_{D})^{2}] \\ &= E_{D}[(f(x;D) - \bar{f}(x) + \bar{f}(x) - y_{D})^2] \\ &= E_{D}[(f(x;D) - \bar{f}(x))^{2}] + E_{D}[(\bar{f}(x) - y_{D})^2] \\ & + E_{D}[2(f(x;D) - \bar{f}(x))(\bar{f}(x) - y_{D})] \\ \end{aligned} E(f;D)=ED[(f(x;D)−yD)2]=ED[(f(x;D)−fˉ(x)+fˉ(x)−yD)2]=ED[(f(x;D)−fˉ(x))2]+ED[(fˉ(x)−yD)2]+ED[2(f(x;D)−fˉ(x))(fˉ(x)−yD)]
不难看出,由于 f ˉ ( x ) = E D [ f ( x ; D ) ] \bar{f}(x) = E_{D}[f(x;D)] fˉ(x)=ED[f(x;D)],则上式的最后一项为0,而且 v a r ( x ) = E D [ ( f ( x ; D ) − f ˉ ( x ) ) 2 ] var(x) = E_{D}[(f(x;D) - \bar{f}(x))^{2}] var(x)=ED[(f(x;D)−fˉ(x))2]。于是,
E ( f ; D ) = v a r ( x ) + E D [ ( f ˉ ( x ) − y D ) 2 ] = v a r ( x ) + E D [ ( f ˉ ( x ) − y + y − y D ) 2 ] = v a r ( x ) + E D [ ( f ˉ ( x ) − y ) 2 ] + E D [ ( y − y D ) 2 ] + E D [ 2 ( f ˉ ( x ) − y ) ( y − y D ) ] \begin{aligned} E(f;D) &= var(x) + E_{D}[(\bar{f}(x) - y_{D})^2] \\ &= var(x) + E_{D}[(\bar{f}(x) - y + y - y_{D})^2] \\ &= var(x) + E_{D}[(\bar{f}(x) - y)^2] + E_{D}[(y - y_{D})^2] \\ & + E_{D}[2(\bar{f}(x) - y)(y - y_{D})] \\ \end{aligned} E(f;D)=var(x)+ED[(fˉ(x)−yD)2]=var(x)+ED[(fˉ(x)−y+y−yD)2]=var(x)+ED[(fˉ(x)−y)2]+ED[(y−yD)2]+ED[2(fˉ(x)−y)(y−yD)]
前面提到,我们假设噪声的期望为零,即 E D [ y D − y ] = 0 E_{D}[y_{D} - y] = 0 ED[yD−y]=0,则有上式的最后一项为零。而且 b i a s 2 ( x ) = [ f ˉ ( x ) − y ] 2 bias^{2}(x) = [\bar{f}(x) - y]^{2} bias2(x)=[fˉ(x)−y]2, ε 2 = E D [ ( y D − y ) 2 ] \varepsilon^{2} = E_{D}[(y_{D} - y)^{2}] ε2=ED[(yD−y)2]。因此,我们可以得到,
E [ f ( x ; D ) ] = b i a s 2 ( x ) + v a r ( x ) + ε 2 E[f(x;D)] = bias^{2}(x) + var(x) + \varepsilon^{2} E[f(x;D)]=bias2(x)+var(x)+ε2
即学习算法的泛化误差可以分解为偏差,方差,噪声之和。
数学含义
上一节中,我们对“偏差——方差分解”进行了数学推导,对学习算法的泛化性能有了一定的认识。可是,偏差,方差,噪声又到底有什么含义呢?它们在学习算法的泛化性能中又各自扮演了什么样的角色呢?
回顾偏差,方差与噪声的含义:偏差度量了学习算法的的期望预测与真实标记的偏离程度,即刻画了学习算法本身的拟合能力;方差度量了同样大小的数据集的变动所导致的学习性能的变化,即刻画了数据扰动对学习性能的影响(这里的学习扰动与噪声不同);噪声度量了当前任务学习算法所能达到的期望泛化误差的下界,则刻画了学习任务本身的难度。“偏差-方差分解”表明,泛化性能是由学习算法的拟合能力,数据扰动和学习任务的自身难度所共同决定的。为了获得好的泛化性能,我们需要同时降低偏差与方差。
然而,一般来说,偏差与方差是冲突的,这称为“偏差-方差窘境”。给定学习任务,在训练的初始阶段,即训练不足时,学习算法的拟合能力不强,训练数据的数据扰动不足以使学习算法的泛化性能产生显著变化。此时,偏差主导了泛化错误率,模型处于欠拟合状态;随着训练程度的加深,学习算法的拟合能力逐渐增强,训练数据的数据扰动开始被学习算法学到,方差逐渐主导了泛化错误率;在训练程度充足时,学习算法的拟合能力已经足够强。此时,微小的数据扰动都会导致学习算法的泛化性能产生显著变化。若训练数据自身的,非全局的特性被学习算法学到,则模型将处于“过拟合”状态。即拥有较少参数的“简单”模型,可能有较大的偏差和较小的方差,而拥有较大参数的“复杂”模型则相反。下图很好地反映了这一过程(注:此图源于周志华老师的《机器学习》)。
参考文献
周志华,《机器学习》
常虹,《The Basic of Statistical Learning》