为什么需要正则化
在线性回归中容易导致过拟合现象,我们有时候有许多的特征,于是我们的拟合函数就变成了
θ
0
+
θ
1
x
+
θ
2
x
2
+
θ
3
x
3
+
θ
4
x
4
+
.
.
.
.
.
.
+
θ
n
x
n
\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3+\theta_4x^4+......+\theta_nx^n
θ0+θ1x+θ2x2+θ3x3+θ4x4+......+θnxn
这个时候在训练集上很容易产生过拟合,就例如下图所示
为什么会这样子,因为给的变量太多,训练过程中不断地缩减在训练集上的损失,导致最后的曲线怪绕来贴合训练集的数据,在其他数据集上效果极差,这就是过拟合。
为了防止过拟合,我们有一下两种方式。
- 减少特征数:这个方法的坏处显而易见,直接去除了一部分特征,导致这一部分特征带来的影响直接消失。
- 正则化:这就是接下来要讲的部分
如何正则化
我们需要一个方法,来抑制变量的影响,但是又不是直接让系数为0(去除变量)。那么我们只需要在损失函数的最后加上一项
λ
∑
i
=
1
n
θ
i
2
即可
\lambda\sum_{i=1}^n\theta_i^2即可
λ∑i=1nθi2即可,这里不一定要是平方,可以是一范数(绝对值),也可以是二范数(平方和)。
加入这一个惩罚项之后,就能让指数更大的项系数更小,具体原因可以看下图,下图展示了,随着阶数的增加,系数处于一个急速增长的状态。那么我们加入这个惩罚项之后,指数越高的地方,系数如果越大就会导致损失变大,因此达到控制高阶系数的效果。
l
o
s
s
=
∑
i
=
1
n
(
h
θ
(
x
)
−
y
)
2
+
λ
∑
j
=
1
n
θ
j
2
loss=\sum_{i=1}^n(h_{\theta}(x)-y)^2+\lambda\sum_{j=1}^n\theta_j^2
loss=i=1∑n(hθ(x)−y)2+λj=1∑nθj2
Pytorch中正则化的实现
在Pytroch中,正则化的实现是在优化器里实现的。
torch.optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False)
随机梯度下降优化器里的weight_decay就是正则化的
λ
\lambda
λ,默认为0,不进行正则化处理。
如果去官网查阅文档,可以发现其实每一个优化器都有实现正则化功能。