在深度学习领域,训练模型时,我们不仅要求模型对训练数据集有很好的拟合(较低的训练误差),同时也希望它可以对未知数据集(测试集)有很好的拟合结果(泛化能力),所产生的测试误差被称为泛化误差。其中就会产生欠拟合和过拟合的问题。度量泛化能力的好坏,最直观的表现就是模型的过拟合(overfitting)和欠拟合(underfitting)。
模型开始训练时,处于欠拟合阶段,随着训练的进行,训练误差和测试误差开始下降。在到达一个临界点后,训练集的误差开始下降,测试集的误差开始上升,进入了过拟合阶段。此时,训练出的模型过度拟合了训练集,对训练集以外的数据则效果不佳。
欠拟合
指模型没有在训练集上获得足够低的误差,在训练集上的表现不佳。
解决方法
可以增加模型的复杂度。
过拟合
模型在训练集上表现很好,但在测试集上的表现很差,泛化能力差。
过拟合的原因
- 训练数据样本单一,样本不足;
- 训练数据中噪声干扰过大,影响了数据的特征;
- 模型过于复杂
防止过拟合的方法
要想解决过拟合问题,就要显著减少测试误差而不过度增加训练误差,从而提高模型的泛化能力。可以使用正则化(Regularization)方法解决模型过拟合问题。正则化是指修改学习算法,使其降低泛化误差而非训练误差。
常用的正则化方法:
- 直接提供正则化约束的参数正则化方法,如L1/L2正则化;
- 通过工程上的技巧来实现更低泛化误差的方法,如提前终止(Early stopping)和Dropout;
- 不直接提供约束的隐式正则化方法,如数据增强等;
获取和使用更多的数据(数据集增强)——解决过拟合的根本性方法:让机器学习或深度学习模型泛化能力更好的办法就是使用更多的数据进行训练。但是,在实践中,我们拥有的数据量是有限的。解决这个问题的一种方法就是创建“假数据”并添加到训练集中——数据集增强。通过增加训练集的额外副本来增加训练集的大小,进而改进模型的泛化能力。以图像数据集举例,能够做:旋转图像、缩放图像、随机裁剪、加入随机噪声、平移、镜像等方式来增加数据量。另外补充一句,在物体分类问题里,CNN在图像识别的过程中有强大的“不变性”规则,即待辨识的物体在图像中的形状、姿势、位置、图像整体明暗度都不会影响分类结果。我们就可以通过图像平移、翻转、缩放、切割等手段将数据库成倍扩充。
采用合适的模型(控制模型的复杂度):过于复杂的模型会带来过拟合问题。对于模型的设计,目前公认的一个深度学习规律"deeper is better"。国内外各种大牛通过实验和竞赛发现,对于CNN来说,层数越多效果越好,但是也更容易产生过拟合,并且计算所耗费的时间也越长。根据奥卡姆剃刀法则:在同样能够解释已知观测现象的假设中,我们应该挑选“最简单”的那一个。对于模型的设计而言,我们应该选择简单、合适的模型解决复杂的问题。
降低特征的数量:对于一些特征工程而言,可以降低特征的数量——删除冗余特征,人工选择保留哪些特征。这种方法也可以解决过拟合问题。
L1/L2正则化
L1正则化
在原始损失函数的基础上加上 L1
正则化项(即全部权重
w
w
w 的绝对值取平均,再乘上
λ
\lambda
λ,如下:
J
=
∑
m
L
(
y
^
[
i
[
,
y
[
i
]
)
+
λ
n
∑
i
=
1
n
∣
w
i
∣
J=\sum^{m}{\mathcal{L}(\hat{y}^{[i[},y^{[i]})}+\frac{\lambda}{n}\sum_{i=1}^{n}|w_i|
J=∑mL(y^[i[,y[i])+nλi=1∑n∣wi∣
简记为:
J
=
L
+
λ
n
∑
i
=
1
n
∣
w
i
∣
J=L+\frac{\lambda}{n}\sum_{i=1}^{n}|w_i|
J=L+nλi=1∑n∣wi∣
对应的梯度为:
∂
J
∂
w
=
∂
L
∂
w
+
λ
n
sign
(
w
)
\frac{\partial J}{\partial w}=\frac{\partial L}{\partial w}+\frac{\lambda}{n}\text{sign}(w)
∂w∂J=∂w∂L+nλsign(w)
其中,
sign
\text{sign}
sign 表示取
w
w
w 的符号,如下:
sign(w)
=
{
1
,
w
>
0
0
,
w
=
0
−
1
,
w
<
0
\text{sign(w)}= \begin{cases} 1 &,w>0\\ 0 &,w=0\\ -1 &,w<0 \end{cases}
sign(w)=⎩⎪⎨⎪⎧10−1,w>0,w=0,w<0
梯度下降时,权重
w
w
w 更新为:
w
′
=
w
−
η
(
∂
L
∂
w
+
λ
n
sign
(
w
)
)
w'=w-\eta \left(\frac{\partial L}{\partial w}+\frac{\lambda}{n}\text{sign}(w)\right)
w′=w−η(∂w∂L+nλsign(w))
当
w
=
0
w=0
w=0 时,按正常的更新方式;
当
w
>
0
w>0
w>0 时,
sign
(
w
)
>
0
\text{sign}(w)>0
sign(w)>0 ,则梯度下降法更新后
w
w
w 更小;
当
w
<
0
w<0
w<0 时,
sign
(
w
)
<
0
\text{sign}(w)<0
sign(w)<0 ,则梯度下降法更新后
w
w
w 更大;
总而言之,L1正则化使得权重
w
w
w 往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。