正则化的概念和原因
简单来说,正则化是一种为了减小测试误差的行为(有时候会增加训练误差)。我们在构造机器学习模型时,最终目的是让模型在面对新数据的时候,可以有很好的表现。当你用比较复杂的模型比如神经网络,去拟合数据时,很容易出现过拟合现象(训练集表现很好,测试集表现较差),这会导致模型的泛化能力下降,这时候,我们就需要使用正则化,降低模型的复杂度。
正则化的几种常用方法
假设
x
x
x 是一个向量,则向量的p范数定义为:
∥
x
∥
p
=
(
∑
i
∣
x
i
∣
p
)
1
p
\|x\|_{p}=\left(\sum_{i}\left|x_{i}\right|^{p}\right)^{\frac{1}{p}}
∥x∥p=(i∑∣xi∣p)p1在目标函数后面添加一个系数的“惩罚项”是正则化的常用方式,为了防止系数过大从而让模型变得复杂。在加了正则化项之后的目标函数为:
J
ˉ
(
w
,
b
)
=
J
(
w
,
b
)
+
λ
2
m
Ω
(
w
)
\bar{J}(w, b)=J(w, b)+\frac{\lambda}{2 m} \Omega(w)
Jˉ(w,b)=J(w,b)+2mλΩ(w)式中,
λ
2
m
\frac{\lambda}{2m}
2mλ 是一个常数,
m
m
m 为样本个数,
λ
\lambda
λ 是一个超参数,用于控制正则化程度。
L1 正则化时,对应惩罚项为 L1 范数 :
Ω
(
w
)
=
∥
w
∥
1
=
∑
i
∣
w
i
∣
\Omega(w)=\|w\|_{1}=\sum_{i}\left|w_{i}\right|
Ω(w)=∥w∥1=i∑∣wi∣L2 正则化时,对应惩罚项为 L2 范数:
Ω
(
w
)
=
∥
w
∥
2
2
=
∑
i
w
i
2
\Omega(w)=\|w\|_{2}^{2}=\sum_{i} w_{i}^{2}
Ω(w)=∥w∥22=i∑wi2从上式可以看出, L1 正则化通过让原目标函数加上了所有特征系数绝对值的和来实现正则化,而L2正则化通过让原目标函数加上了所有特征系数的平方和来实现正则化。
两者都是通过加上一个和项来限制参数大小,却有不同的效果: L1 正则化更适用于特征选择,而L2正则化更适用于防止模型过拟合。
让我们从梯度下降的角度入手,探究两者的区别。
为了方便叙述,假设数据只有两个特征即
w
1
,
w
2
w_{1}, w_{2}
w1,w2 ,考虑L1 正则化的目标函数:
J
ˉ
=
J
+
λ
2
m
(
∣
w
1
∣
+
∣
w
2
∣
)
\bar{J}=J+\frac{\lambda}{2 m}\left(\left|w_{1}\right|+\left|w_{2}\right|\right)
Jˉ=J+2mλ(∣w1∣+∣w2∣)在每次更新
w
1
w_{1}
w1 时:
w
1
:
=
w
1
−
α
d
w
1
=
w
1
−
α
λ
2
m
sign
(
w
1
)
−
∂
J
∂
w
1
\begin{array}{c}{w_{1}:=w_{1}-\alpha d w_{1}} \\ {=w_{1}-\frac{\alpha \lambda}{2 m} \operatorname{sign}\left(w_{1}\right)-\frac{\partial J}{\partial w_{1}}}\end{array}
w1:=w1−αdw1=w1−2mαλsign(w1)−∂w1∂J若
w
1
w_{1}
w1为正数,则每次更新会减去一个常数;若为负数,则每次更新会加上一个常数,所以很容易产生特征的系数为 0 的情况,特征系数为 0 表示该特征不会对结果有任何影响,因此L1正则化会让特征变得稀疏,起到特征选择的作用。
现考虑L2 正则化的目标函数:
J
ˉ
=
J
+
λ
2
m
(
w
1
2
+
w
2
2
)
\bar{J}=J+\frac{\lambda}{2 m}\left(w_{1}^{2}+w_{2}^{2}\right)
Jˉ=J+2mλ(w12+w22)在每次更新
w
1
w_{1}
w1时:
w
1
:
=
w
1
−
α
d
w
1
=
(
1
−
α
λ
m
)
w
1
−
∂
J
∂
w
1
\begin{array}{c}{w_{1}:=w_{1}-\alpha d w_{1}} \\ {=\left(1-\frac{\alpha \lambda}{m}\right) w_{1}-\frac{\partial J}{\partial w_{1}}}\end{array}
w1:=w1−αdw1=(1−mαλ)w1−∂w1∂J从上式可以看出每次更新时,会对特征系数进行一个比例的缩放而不是像L1正则化减去一个固定值,这会让系数趋向变小而不会变为 0,因此L2 正则化会让模型变得更简单,防止过拟合,而不会起到特征选择的作用。
以上就是L1、L2 正则化的作用以及区别。
训练集增强
更大数量的训练集是提升机器学习模型泛化能力最好的方法。做一个不可能的假设,如果你的训练集包含了所有的你需要测试的数据,那么该模型的泛化能力将是100%(开个玩笑)。在实际项目中,获取训练数据的成本会很高,这时候就需要我们自己来“创造”数据。希望在以后,GAN可以成功的应用到训练集增强领域。
dropout
dropout 是一种计算方便但功能强大的正则化方法,适用于最近很火的神经网络。基本步骤是在每一次的迭代中,随机删除一部分节点,只训练剩下的节点。每次迭代都会随机删除,每次迭代删除的节点也都不一样,相当于每次迭代训练的都是不一样的网络,通过这样的方式降低节点之间的关联性以及模型的复杂度,从而达到正则化的效果。这点上有点类似 bagging,但是远比 bagging 来的简单。
说dropout简单是因为你只需要设置一个超参数 keep_prob,这个参数的意义是每层节点随机保留的比例,比如将 keep_prob 设置为 0.7,那么就会随机30%的节点消失,消失这个动作其实很简单,只是将这一层的参数矩阵与根据 keep_prob 生成的 {0, 1} 矩阵做 逐点乘积,当然前向传播与反向传播都需要做以上的操作。
dropout的缺点在于,需要将训练集分为不同子集输入每一次的迭代,这就需要较大的训练集,所以在训练集较小的情况下,dropout的效果可能并不好。我们上面也说过,增大数据集是最好的正则化方式,所以在增大数据集的情况下,使用 dropout 需要使用的计算代价可能会比他带来正则化效果更高,这需要我们在实际使用场景中做取舍。
earlystopping
提前终止可能是最简单的正则化方式,他适用于模型的表达能力很强的时候。这种情况下,一般训练误差会随着训练次数的增多逐渐下降,而测试误差则会先下降而后再次上升。我们需要做的就是在测试误差最低的点停止训练即可。