天天看点

解决过拟合的方法:正则化、dropout

文章目录

      • 1. 产生过拟合的原因
      • 2. 应对过拟合的方法
        • 2.1 正则化
          • 2.1.1 L1正则化
          • 2.1.2 L2正则化
        • 2.2 dropout
      • 参考资料:

1. 产生过拟合的原因

  1. 模型的复杂度太高。比如:网络太深
  2. 过多的特征
  3. 训练迭代次数多
  4. 数据集太小

2. 应对过拟合的方法

一般来说有如下方法:

  1. 尽量减少特征的数量
  2. 数据集扩增
  3. 增加正则化参数 λ
  4. dropout

下面就比较难理解的正则化和 dropout 进行解释

2.1 正则化

机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作 l1-norm 或 l2-norm,中文称作 L1 正则化 和 L2 正则化,或者 L1 范数 和 L2 范数。

L1 正则化和 L2 正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用 L1 正则化的模型叫做 Lasso 回归,使用 L2 正则化的模型叫做 Ridge 回归(岭回归)。

2.1.1 L1正则化

通常带有 L1 正则项的损失函数如下:

J = J 0 + λ ∑ i n ∣ ω i ∣ J = J_0 + λ\sum^n_i|ω_i| J=J0​+λi∑n​∣ωi​∣

其中 J 0 J_0 J0​ 是原始的损失函数,加号后面一项是 L1 正则项,λ 是正则化参数,注意到:

  • L1 正则项是权值的绝对值之和

我们在原始损失函数 J 0 J_0 J0​ 后添加 L1 正则项时,相当于对 J 0 J_0 J0​ 做了一个约束。令 L = α ∑ ω ∣ ω ∣ L = α\sum_ω|ω| L=α∑ω​∣ω∣,则 J = J 0 + L J = J_0 + L J=J0​+L,对此我们的任务变成在 L 约束下求出 J 0 J_0 J0​ 取最小值的解。考虑二维的情况,即只有两个权值 ω 1 ω^1 ω1 和 ω 2 ω^2 ω2。此时 L = ∣ ω 1 ∣ + ∣ ω 2 ∣ L = |ω^1| + |ω^2| L=∣ω1∣+∣ω2∣。对于梯度下降法,求解 J 0 J_0 J0​ 的过程可以画出等值线,同时 L1 正则化的函数 L 也可以在 ω 1 ω 2 ω^1ω^2 ω1ω2的二维平面上画出来。如下图所示:

解决过拟合的方法:正则化、dropout

其中彩色的圈圈是 J 0 J_0 J0​ 的等值线,黑色四边形是 L 函数图形。

在图中,当 J 0 J_0 J0​ 等值线与 L 图形首次相交的地方就是最优解。上图中 J 0 J_0 J0​ 与 L 的一个顶点处相交,这个顶点就是最优解,值为 ( ω 1 , ω 2 ) = ( 0 , ω ) (ω^1, ω^2) = (0, ω) (ω1,ω2)=(0,ω)。 J 0 J_0 J0​ 与这些角接触的机率会远大于其它部位接触的机率(这是很直觉的想象,突出的角比直线的边离等值线更近些),而在这些角上,会有很多权值等于 0(因为角就在坐标轴上),所以:

  • L1 正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,用于特征选择。
2.1.2 L2正则化

L2 正则化,也称为权重衰减。带有 L2 正则项的损失函数如下:

J = J 0 + λ ∑ i n ω i 2 J = J_0 + λ\sum^n_iω_i^2 J=J0​+λi∑n​ωi2​

  • L2 正则项是权值的平方和

线性回归的损失函数为例:

J ( ω ) = 1 2 m ∑ i = 1 m ( h ω ( x ( i ) ) − y ( i ) ) 2 J(ω) = \frac{1}{2m} \sum^m_{i = 1}(h_ω(x^{(i)}) - y^{(i)}) ^ 2 J(ω)=2m1​i=1∑m​(hω​(x(i))−y(i))2

在梯度下降算法中,需要先对损失函数求导,得到梯度。对于单个样本,先对某个参数 ω j ω_j ωj​ 求导,最后得到下式:

∂ ∂ ω j J ( ω ) = 1 m ∑ i = 1 m ( h ω ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial}{\partial ω_j}J(ω) = \frac{1} {m} \sum^m_{i = 1}(h_ω(x^{(i)}) - y^{(i)})x^{(i)}_j ∂ωj​∂​J(ω)=m1​i=1∑m​(hω​(x(i))−y(i))xj(i)​

最后再乘以一个系数α(学习率),得到没有添加正则项的 ω j ω_j ωj​ 参数更新公式为:

ω j : = ω j − α 1 m ∑ i = 1 m ( h ω ( x ( i ) ) − y ( i ) ) x j ( i ) ω_j := ω_j - α \frac{1} {m} \sum^m_{i = 1}(h_ω(x^{(i)}) - y^{(i)})x^{(i)}_j ωj​:=ωj​−αm1​i=1∑m​(hω​(x(i))−y(i))xj(i)​

正则项 L2 对参数 ω j ω_j ωj​ 求导:

∂ ∂ ω j L 2 = 2 λ ω j \frac{\partial}{\partial ω_j}L2 = 2 λ ω_j ∂ωj​∂​L2=2λωj​

综合 L2 正则项之后参数 ω j ω_j ωj​ 的更新公式为:

ω j : = ω j ( 1 − 2 λ ) − α 1 m ∑ i = 1 m ( h ω ( x ( i ) ) − y ( i ) ) x j ( i ) ω_j := ω_j(1 - 2 λ) - α \frac{1} {m} \sum^m_{i = 1}(h_ω(x^{(i)}) - y^{(i)})x^{(i)}_j ωj​:=ωj​(1−2λ)−αm1​i=1∑m​(hω​(x(i))−y(i))xj(i)​

其中 λ 就是正则化参数。从上式可以看到,与未添加L2正则化的迭代公式相比,每一次迭代, θ j \theta_j θj​ 都要先乘以一个小于1的因子,即 ( 1 − 2 λ ) (1 - 2 λ) (1−2λ),从而使得 θ j \theta_j θj​ 不断减小,因此总的来看, θ θ θ 是不断减小的。所以:

  • L2 正则化可以产生参数值较小的模型,能适应不同的数据集,一定程度上防止过拟合,抗扰动能力强。

2.2 dropout

除了前面介绍的正则化方法以外,深度学习模型常常使用丢弃法(dropout)[4] 来应对过拟合问题。丢弃法有一些不同的变体。本节中提到的丢弃法特指倒置丢弃法(inverted dropout)。

描述一个单隐藏层的多层感知机。其中输入个数为 4,隐藏单元个数为 5,且隐藏单元 h i ( i = 1 , . . . , 5 ) h_i (i=1,...,5) hi​(i=1,...,5) 的计算表达式为:

h i = φ ( x 1 ω 1 i + x 2 ω 2 i + x 3 ω 3 i + x 4 ω 4 i + b i ) h_i = φ(x_1ω_{1i} + x_2ω_{2i} + x_3ω_{3i} + x_4ω_{4i} + b_i) hi​=φ(x1​ω1i​+x2​ω2i​+x3​ω3i​+x4​ω4i​+bi​)

这里 φ 是激活函数, x 1 , . . . , x 4 x_1,...,x_4 x1​,...,x4​ 是输入,权重参数为 ω 1 i , . . . , ω 4 i ω_{1i},...,ω_{4i} ω1i​,...,ω4i​ ,偏差参数为 b i b_i bi​。当对该隐藏层使用丢弃法时,该层的隐藏单元将有一定概率被丢弃掉。设丢弃概率为 p p p,那么有 p p p 的概率 h i h_i hi​ 会被清零,有 1 − p 1-p 1−p的概率 h i h_i hi​ 会除以 1 − p 1-p 1−p 做拉伸。丢弃概率是丢弃法的超参数。具体来说,设随机变量 ξ i \xi_i ξi​ 为 0 和 1 的概率分别为 p p p 和 1 − p 1-p 1−p。使用丢弃法时我们计算新的隐藏单元

h i ′ = ξ i 1 − p h i h_i'= \frac{\xi_i}{1-p} h_i hi′​=1−pξi​​hi​

  • 即丢弃法不改变其输入的期望值,而随机丢弃训练中隐藏层的神经元,从而应对过拟合。
  • 在测试模型中,我们为了拿到更加确定性的结果,一般不使用丢弃法。
    解决过拟合的方法:正则化、dropout
    在上图中, h 2 h_2 h2​ 和 h 5 h_5 h5​ 被丢弃了,输出层的计算无法过度依赖 h 1 i , . . . , h 5 i h_{1i},...,h_{5i} h1i​,...,h5i​ 中的任一个,从而在训练模型时起到正则化的作用,可以用来应对过拟合。

参考资料:

[1]机器学习中正则化项L1和L2的直观理解

[2]《动手学深度学习》(PyTorch版)3.12 权重衰减

[3]数据预处理–特征选择-L1、L2正则化

[4]Srivastava, N., Hinton, G., Krizhevsky, A., Sutskever, I., & Salakhutdinov, R. (2014). Dropout: a simple way to prevent neural networks from overfitting. JMLR

[5]《动手学深度学习》(PyTorch版)3.13 丢弃法

继续阅读