上篇文章中讲解了偏差、方差、误差,其中提到了过拟合,那么本文将深入展开过拟合及其解决方案。
一、竹篮打水一场空——过拟合
要直观解释过拟合,先上图:
图1明显分类有欠缺,称之为欠拟合,图2虽然有两个点分类错误,但是可以理解,毕竟现实世界是有噪音干扰的,该模型在容错情况下刚好,而图3分类全部正确,我们发现在训练集上该模型无比完美!请先不要高兴太早,这很可能是因为模型过拟合了。
过拟合的直观解释是模型在训练集上性能完美,但在验证集或测试集上效果却不那么尽人意了。
机器学习中一个核心任务就是防止模型过拟合,当模型的参数个数远大于数据集样本数量时,模型则可很好的“记忆”每一个训练数据的随机噪声而忘了去学习训练数据中通用的趋势,这就有可能导致过拟合,这个时候你可以简单的扩充数据集中的样本来降低过拟合的影响,但这需要一定的时间和人力成本,且效果可能不那么明显。那么如何用最小的成本来防止模型过拟合呢,即如何使训练错误率与测试错误率的差距尽可能小呢?那么答案就是本文的主题——正则化。
二、正则化
一般书上都是直接给出结构风险最小化的公式,如下:
m
i
n
1
N
∑
i
=
1
N
L
(
y
i
,
f
(
x
i
)
)
+
λ
r
(
d
)
min\frac{1}{N}\sum_{i=1}^{N}L\left ( y_i,f\left ( x_i \right ) \right )+\lambda r\left ( d \right )
minN1i=1∑NL(yi,f(xi))+λr(d)
其中
f
(
x
i
)
=
w
0
x
0
+
w
1
x
1
+
w
2
x
2
+
.
.
.
+
w
n
x
n
f\left ( x_i \right )=w_0x_0+w_1x_1+w_2x_2+...+w_nx_n
f(xi)=w0x0+w1x1+w2x2+...+wnxn
其中第一项是经验风险,第二项是正则化项。
好,知道了什么是过拟合之后,就要尽量避免,也就是要让结构风险最小化。
我们站在第一次接触这种分类模型的角度去看待这个问题,发散一下思维,应该如何去防止过拟合?
显而易见,我们应该从【过拟合】出现的特征去判别,才能规避吧?
显而易见,我们应该而且只能去看【过拟合】的
f
(
x
)
f\left(x\right)
f(x)形式吧?
显而易见,我们从【过拟合】的图形可以看出
f
(
x
)
f\left(x\right)
f(x)的涉及到的特征项一定很多吧,即
x
0
,
x
1
,
x
2
,
x
3
.
.
.
.
x
N
x_{0},x_{1},x_{2},x_{3}....x_{N}
x0,x1,x2,x3....xN 等等很多吧?
显而易见,
N
N
N很大的时候,
w
0
,
w
1
,
w
2
,
w
3
,
.
.
.
w
N
w_{0} ,w_{1} ,w_{2} ,w_{3} ,...w_{N}
w0,w1,w2,w3,...wN 是等数量增长的吧?
显而易见,
w
w
w系数都是学习来的吧?
知道这些信息之后,如何去防止过拟合,我们首先想到的就是控制
N
N
N的数量吧,即让N最小化吧,而让
N
N
N最小化,其实就是让
W
W
W向量中项的个数最小化吧?其中,
W
=
(
w
0
,
w
1
,
w
2
,
w
3
,
.
.
.
w
N
)
W=\left(w_{0} ,w_{1} ,w_{2} ,w_{3} ,...w_{N} \right)
W=(w0,w1,w2,w3,...wN)。
再来思考,如何求解“让
W
W
W向量中项的个数最小化”这个问题。
数学中
L
0
L_0
L0范数表示向量中非零元素的个数,它将模型参数不等于0的个数控制在
C
C
C以内来达到限制模型能力的目的。
所以,重点来了,要防止过拟合,既要让经验风险最小,又要让正则化项最小。所以为了让结构风险最小,就要让经验风险和正则化项之和最小,换句话说,就是在正则化项约束下求出损失函数取最小值的解。正则化就是将结构风险最小化的过程,它们是等价的。
但是,
L
0
L_0
L0范数很难求,求解的难度是个
N
P
NP
NP完全问题。因此,进一步放松限制,不要求参数的非零数量被限制在某个范围内,而要求参数数值的总和要小于某个数值。这种对参数数值总和的限制被称为
L
1
L_1
L1范数惩罚,又称参数稀疏性惩罚或者稀疏规则算子。
接下来有两个问题:
1、为什么要参数稀疏?有什么好处?
2、为什么
L
1
L_1
L1范数能实现稀疏?
先回答第一个问题,有以下两点:
- 特征选择(Feature Selection)
大家对稀疏规则化趋之若鹜的一个关键原因在于它能实现特征的自动选择。一般来说, x i x_i xi的大部分元素(也就是特征)都是和最终的输出 y i y_i yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑 x i x_i xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确 y i y_i yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。 - 可解释性(Interpretability)
第二个理由是,模型更容易解释。例如患某种病的概率是 y y y,然后我们收集到的数据 x x x是1000维的,也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。假设我们这个是个回归模型: y = w 1 ∗ x 1 + w 2 ∗ x 2 + … + w 1 000 ∗ x 1 000 + b y=w_1*x_1+w_2*x_2+…+w_1000*x_1000+b y=w1∗x1+w2∗x2+…+w1000∗x1000+b(当然,为了让 y y y限定在 [ 0 , 1 ] \left [ 0,1 \right ] [0,1]的范围,一般还得加个 S i g m o i d Sigmoid Sigmoid函数)。通过学习,如果最后学习到的 W W W就只有很少的非零元素,例如只有5个非零的 w i w_i wi,那么我们就有理由相信,这些对应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了。但如果1000个 w i w_i wi都非0,医生面对这1000种因素那肯定是晕菜了。。。
在回答第二个问题前先要介绍
L
2
L_2
L2范数。
直观上看,
L
2
L_2
L2范数是各个参数的平方和再开方,即:
∥
W
∥
2
=
∑
w
i
2
\left \| W \right \|_2=\sqrt{\sum w_i^2}
∥W∥2=∑wi2,也称欧氏距离。
那么
r
(
d
)
=
∥
W
∥
2
2
r\left ( d \right )=\left \| W \right \|_2^2
r(d)=∥W∥22
L
2
L_2
L2范数还有另外一个名字叫做:权重衰减惩罚。因此,它被用于解决过拟合问题。(PS:其实我个人认为
L
1
L_1
L1范数也是用于解决过拟合问题,但是侧重点是稀疏用户特征选择,而
L
2
L_2
L2范数侧重于要构造权重比较小的模型,所以叫做权重衰减么。)
下面可以回答第二个问题了,为什么
L
1
L_1
L1范数能实现稀疏。
从两个角度去解释,第一是数学角度,第二是图形。
我看到过这样一种纯数学上的解释:
任何的规则化算子,如果他在
W
i
=
0
W_i=0
Wi=0的地方不可微,并且可以分解为一个"求和"的形式,那么这个规则化算子就可以实现稀疏。
下面用公式进行解释:
假设只有一个参数为
w
w
w,损失函数为
L
(
w
)
L\left(w\right)
L(w),分别加上
L
1
L_1
L1正则项和
L
2
L_2
L2正则项后有:
J
L
1
(
w
)
=
L
(
w
)
+
λ
∣
w
∣
J_{L1}\left ( w \right )=L\left ( w \right )+\lambda \left | w \right |
JL1(w)=L(w)+λ∣w∣
J
L
2
(
w
)
=
L
(
w
)
+
λ
w
2
J_{L2}\left ( w \right )=L\left ( w \right )+\lambda w^2
JL2(w)=L(w)+λw2
假设
L
(
w
)
L\left(w\right)
L(w)在
0
0
0处的导数为
d
0
d_0
d0,即:
∂
L
(
w
)
∂
w
∣
w
=
0
=
d
0
\left.\begin{matrix} \frac{\partial L\left ( w \right )}{\partial w}\\ \end{matrix}\right|_{w=0} =d_0
∂w∂L(w)∣∣∣w=0=d0
则可以推导使用
L
1
L_1
L1正则和
L
2
L_2
L2正则时的导数。
引入
L
2
L_2
L2正则项,在
0
0
0处的导数:
∂
J
L
2
(
w
)
∂
w
∣
w
=
0
=
d
0
+
2
×
λ
×
w
\left.\begin{matrix} \frac{\partial J_{L2}\left ( w \right )}{\partial w}\\ \end{matrix}\right|_{w=0} =d_0+2\times \lambda \times w
∂w∂JL2(w)∣∣∣w=0=d0+2×λ×w
引入
L
1
L_1
L1正则项,在
0
0
0处的导数:
∂
J
L
1
(
w
)
∂
w
∣
w
=
0
−
=
d
0
−
λ
\left.\begin{matrix} \frac{\partial J_{L1}\left ( w \right )}{\partial w}\\ \end{matrix}\right|_{w=0^-} =d_0-\lambda
∂w∂JL1(w)∣∣∣w=0−=d0−λ
∂
J
L
1
(
w
)
∂
w
∣
w
=
0
+
=
d
0
+
λ
\left.\begin{matrix} \frac{\partial J_{L1}\left ( w \right )}{\partial w}\\ \end{matrix}\right|_{w=0^+} =d_0+\lambda
∂w∂JL1(w)∣∣∣w=0+=d0+λ
可见,引入
L
2
L_2
L2正则时,代价函数在
0
0
0处的导数仍是
d
0
d_0
d0,无变化。而引入
L
1
L_1
L1正则后,代价函数在
0
0
0处的导数有一个突变。从
d
0
+
λ
d_0+λ
d0+λ到
d
0
−
λ
d_0−λ
d0−λ,若
d
0
+
λ
d_0+λ
d0+λ和
d
0
−
λ
d_0−λ
d0−λ异号,则在
0
0
0处会是一个极小值点。因此,优化时,很可能优化到该极小值点上,即
w
=
0
w=0
w=0处。这是只有一个参数的情况,如果有更多的参数,也是类似的。因此,用
L
1
L_1
L1正则更容易产生稀疏解。
图形化解释,那么先看一幅图:
假设只有两个参数
w
1
w_1
w1和
w
2
w_2
w2
L
1
L_1
L1:因为
∥
w
∥
1
≤
C
\left \| w \right \|_1\leq C
∥w∥1≤C,所以
∣
w
1
∣
+
∣
w
2
∣
≤
C
\left | w_1 \right |+\left | w_2 \right |\leq C
∣w1∣+∣w2∣≤C,在图上画出来就是一个菱形;
L
2
L_2
L2:因为
∥
w
∥
2
≤
C
\left \| w \right \|_2\leq C
∥w∥2≤C,所以
w
1
2
+
w
2
2
≤
C
\sqrt{w_1^2+w_2^2}\leq C
w12+w22≤C,在图上画出来就是一个圆形。
重点来了,求等价后的问题就是求:等高线(从中心向外辐射)和约束线(菱形或圆形)的第一个交点。
对于
L
1
L_1
L1来说,交点一般出现在
y
y
y轴上,这意味着
w
1
=
0
w_1=0
w1=0。所以
L
1
L_1
L1具有稀疏性,可用于特征选择。
对于
L
2
L_2
L2来说,交点在圆上,这意味着
w
1
w_1
w1和
w
2
w_2
w2都不为
0
0
0。
因此
L
1
L_1
L1范数具有稀疏性,可以用于特征选择。
最后,再将注意力转移到 L 2 L_2 L2范数,正则化前面的系数 λ \lambda λ,可以控制 ∥ w ∥ 2 2 \left \| w \right \|_2^2 ∥w∥22图形的大小。 λ \lambda λ过小, ∥ w ∥ 2 2 \left \| w \right \|_2^2 ∥w∥22的半径则很大,就越容易达到损失函数的最小值(中心点),会发生过拟合现象; λ \lambda λ过大, ∥ w ∥ 2 2 \left \| w \right \|_2^2 ∥w∥22的半径则很小,即对模型参数惩罚过重,模型的能力也就越弱,会发生欠拟合现象。
模型在拟合过程中通常都会倾向于让权值尽可能小,最终构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,且能适应不同的数据集,在一定程度上可降低过拟合风险。比如,对于一个线性回归方程,若参数很大,那么只要数据偏移一点点,就会对结果造成很大的影响;但如果参数足够小,数据偏移得多一点也不会对结果造成什么影响,这就是常说的抗扰动能力强。
最后分享一篇文章《机器学习:分类问题中的“维数灾难”》来感受一下为什么降维在分类问题中是如此的重要!
未完待续。。。