0. 引言
作为一名算法工程师,在利用算法模型解决实际问题时,模型的欠拟合、过拟合问题是无论如何都无法回避的。这两个问题的表象相比很多人都知道,但是涉及到它们背后的产生原因、本质以及解决方法,要说清楚还是不容易的。
1. 误差、偏差和方差的数学定义
误差(error)的概念有两类,一类是数据本身带来的噪声,一般假设服从均值为0的高斯分布,记为
ϵ
∼
N
(
0
,
σ
ϵ
)
\epsilon \sim N(0,\sigma_{\epsilon})
ϵ∼N(0,σϵ)(噪声的各变量是独立同分布于均值为0、方差为
σ
ϵ
\sigma_{\epsilon}
σϵ的正态分布),且往往是认为无法避免的;另一类是模型输出与实际值之间的误差,例如均方误差(mean squared error, MSE),这个是实际应用中我们所直接关心的,一般希望它越小越好。
假设现在有因变量
y
y
y(输出)由自变量
x
x
x(输入)决定,记真实的映射函数为
f
(
x
)
f(x)
f(x)(也叫真实的模型),则
y
=
f
(
x
)
+
ϵ
(1-1)
y=f(x)+\epsilon \tag{1-1}
y=f(x)+ϵ(1-1)
对应的,记我们从数据中学习出的模型为
f
^
(
x
)
\hat f(x)
f^(x),那么偏差(bias)的定义为:
B
i
a
s
(
f
^
(
x
)
)
=
E
(
f
^
(
x
)
)
−
f
(
x
)
(1-2)
Bias(\hat f(x))=E(\hat f(x))-f(x)\tag{1-2}
Bias(f^(x))=E(f^(x))−f(x)(1-2)
方差的定义为:
V
a
r
(
f
^
(
x
)
)
=
E
[
(
f
^
(
x
)
−
E
(
f
^
(
x
)
)
)
2
]
(1-3)
Var(\hat f(x))=E\left[\left(\hat f(x)-E(\hat f(x))\right)^2\right]\tag{1-3}
Var(f^(x))=E[(f^(x)−E(f^(x)))2](1-3)
假设我们现在关心的是模型的均方误差
M
S
E
(
f
^
(
x
)
MSE(\hat f(x)
MSE(f^(x),它的定义以及分解过程为:
M
S
E
(
f
^
(
x
)
)
=
E
[
(
y
−
f
^
(
x
)
)
2
]
=
E
[
(
f
(
x
)
+
ϵ
−
f
^
(
x
)
)
2
]
=
E
[
(
f
(
x
)
−
f
^
(
x
)
)
2
+
2
ϵ
(
f
(
x
)
−
f
^
(
x
)
)
+
ϵ
2
]
=
E
[
(
f
(
x
)
−
f
^
(
x
)
)
2
]
+
2
E
(
ϵ
)
E
(
f
(
x
)
−
f
^
(
x
)
)
+
E
(
ϵ
2
)
=
E
[
(
(
f
(
x
)
−
E
(
f
^
(
x
)
)
−
(
f
^
(
x
)
−
E
(
f
^
(
x
)
)
)
)
2
]
+
0
+
σ
ϵ
2
=
E
[
(
f
(
x
)
−
E
(
f
^
(
x
)
)
)
2
]
−
2
E
[
(
f
(
x
)
−
E
(
f
^
(
x
)
)
)
(
f
^
(
x
)
−
E
(
f
^
(
x
)
)
)
]
+
E
[
(
f
^
(
x
)
−
E
(
f
^
(
x
)
)
)
2
]
+
σ
ϵ
2
=
E
(
B
i
a
s
(
f
^
(
x
)
)
2
)
−
2
E
[
f
(
x
)
f
^
(
x
)
−
f
(
x
)
E
(
f
^
(
x
)
)
−
E
(
f
^
(
x
)
)
f
^
(
x
)
+
E
(
f
^
(
x
)
)
E
(
f
^
(
x
)
)
]
+
V
a
r
(
f
^
(
x
)
)
+
σ
ϵ
2
=
B
i
a
s
(
f
^
(
x
)
)
2
+
V
a
r
(
f
^
(
x
)
)
+
σ
ϵ
2
(1-4)
\begin{aligned} MSE(\hat f(x))&=E\left[\left(y-\hat f(x)\right)^2\right]\\ &=E\left[\left(f(x)+\epsilon-\hat f(x)\right)^2\right]\\ &=E\left[\left(f(x)-\hat f(x)\right)^2+2\epsilon \left(f(x)-\hat f(x)\right)+\epsilon^2\right]\\ &=E\left[\left(f(x)-\hat f(x)\right)^2\right]+2E(\epsilon)E(f(x)-\hat f(x))+E(\epsilon^2)\\ &=E\left[\left(\left(f(x)-E(\hat f(x)\right)-\left(\hat f(x)-E(\hat f(x))\right)\right)^2\right]+0+\sigma_{\epsilon}^2\\ &=E\left[\left(f(x)-E(\hat f(x))\right)^2\right]-2E\left[\left(f(x)-E(\hat f(x))\right)\left(\hat f(x)-E(\hat f(x))\right)\right]+E\left[\left(\hat f(x)-E(\hat f(x))\right)^2\right]+\sigma_{\epsilon}^2\\ &=E(Bias(\hat f(x))^2)-2E\left[f(x)\hat f(x)-f(x)E(\hat f(x))-E(\hat f(x))\hat f(x)+E(\hat f(x))E(\hat f(x))\right]+Var(\hat f(x))+\sigma_{\epsilon}^2\\ &=Bias(\hat f(x))^2+Var(\hat f(x))+\sigma_{\epsilon}^2\\ \tag{1-4} \end{aligned}
MSE(f^(x))=E[(y−f^(x))2]=E[(f(x)+ϵ−f^(x))2]=E[(f(x)−f^(x))2+2ϵ(f(x)−f^(x))+ϵ2]=E[(f(x)−f^(x))2]+2E(ϵ)E(f(x)−f^(x))+E(ϵ2)=E[((f(x)−E(f^(x))−(f^(x)−E(f^(x))))2]+0+σϵ2=E[(f(x)−E(f^(x)))2]−2E[(f(x)−E(f^(x)))(f^(x)−E(f^(x)))]+E[(f^(x)−E(f^(x)))2]+σϵ2=E(Bias(f^(x))2)−2E[f(x)f^(x)−f(x)E(f^(x))−E(f^(x))f^(x)+E(f^(x))E(f^(x))]+Var(f^(x))+σϵ2=Bias(f^(x))2+Var(f^(x))+σϵ2(1-4)
注意,上述最后一步的化简中,用到了这些隐含条件(下面的常量是指关于数据的常量):
- E ( f ^ ( x ) ) E(\hat f(x)) E(f^(x))是常量, f ( x ) f(x) f(x)是常量,因 此 B i a s ( f ^ ( x ) ) 此Bias(\hat f(x)) 此Bias(f^(x))也是常量,且常量可以提到 E ( ) E() E()外面去
由此可见,均方误差是取决于偏差、方差和随机误差的,且后三者的绝对值(平方)越大,均方误差也越大,这也符合我们的一般直觉。
2. 偏差与方差的直观理解
图片来源http://scott.fortmann-roe.com/docs/BiasVariance.html
如上图所示,对于某个靶子而言,上面的每个点表示给定算法的情况下,每次更换不同的训练样本训练出不同的模型,对同一个测试样本进行预测的结果。
最理想的情况是左上角,此时偏差和方差都较小,因此模型的误差(例如前面提到的均方误差)较小;右上角是低偏差和高方差的情况,这体现出算法的输出结果不是很“稳定”,也即不同的数据训练出的模型,对同一样本的预测结果可能大相径庭;左下角是高偏差和低方差的情况,这体现出算法的输出结果虽然稳定但是与真实结果总存在一点偏差,类似于控制理论里面的静差;右下角是最糟糕的情况,偏差和方差都很大
3. 偏差、方差与欠拟合、过拟合的关系
结合上一章中的直观理解,偏差、方差与欠拟合、过拟合的关系其实呼之欲出了。
所谓欠拟合(underfitting),外在现象就是模型在训练集上和测试集上表现都不好。这就意味着,模型没有学习到数据中足够的信息,导致模型的输出与真实值存在较大偏差,也即高偏差。形象的比喻就是造狙击枪的车床有个明显的公差,导致造出来的狙击枪瞄准镜都往某个方向偏了一个角度,于是用这批狙击枪打靶都会网靶心某个方向偏移。
所谓过拟合(overfitting),外在现象就是模型在训练集上表现很好,但是在测试集上表现不好。这就意味着模型学习到了数据中的信息,但是学到的信息跟具体的训练数据强相关,缺乏举一反三、灵活变通的能力,导致模型的输出与真实值存在较大方差,也即高方差。形象的比喻就是学生只会背老师讲的题目模板,不论老师怎么教,只能记住老师教的那几个题。如果运气好,老师押中了考题,那么考得好;否则就考得差。
4. 欠拟合、欠拟合的产生原因及解决方案
前面讲到,出现欠拟合是因为模型没有学习到数据中的信息。造成这一结果的原因有:
- 模型复杂度不够,具体来说就是特征项不够。例如男女性别分类时,只有身高这一维特征。
- 正则化参数太大,导致将某些重要特征给抑制住了
对应的解决方法有:
- 添加输入特征,例如男女性别分类时,引入体重、头发长度等特征。
- 当输入数据的原始特征无法改变的时候,提高模型的特征抽取能力,“制造”出更丰富、有效的特征。例如引入多项式特征、卷积层、transformer结构等
- 减小正则化参数
过拟合是因为模型泛化能力太差,具体原因有:
- 输入特征过多,导致模型容易过拟合到某些特征上面,缺乏全局视野
- 模型结构过于复杂,导致提取出了过多的特征
- 训练数据不够多,没有覆盖完整测试集数据的分布空间
- 训练集中噪声过大,导致模型学到了许多无用信息
对应的解决方法:
- 进行特征筛选,减少输入特征数量
- 控制模型复杂度,避免选用过于复杂的模型解决相对简单的问题
- 在损失函数中引入L1/L2正则化,以减少某些不那么重要的特征的权重
- 增大训练数据集,尤其是提高训练集的分布丰富度
- 对训练数据进行数据增强,本质上和上一个方法是同样的效果
- 对数据进行清洗,剔除异常点
- 引入dropout,训练过程的一个技巧,某种程度上类似于正则化
- early stop, 某种程度上类似于正则化