正则化(regularization)方法总结

目录

  • 1 正则化作用
  • 2 正则化方法
    • 2.1 基于数据的正则化方法
      • 2.1.1 data augmentation
      • 2.1.2 dropout
    • 2.2 基于网络结构的正则化方法
      • 2.2.1 weight sharing
      • 2.2.2 activation functions
      • 2.2.3 Noisy models
      • 2.2.4 Multi-task learning
      • 2.2.5 Model selection
    • 2.3 基于正则化项
      • 2.3.1 L2
      • 2.3.2 L1
      • 2.3.3 L1与L2的异同
    • 2.4 基于optimization进行正则化
      • 2.4.1 Initialization methods
      • 2.4.2 Update methods
      • 2.4.4 Early Stopping
  • 3 参考

1 正则化作用

当训练一个深度神经网络模型时,模型有可能会过拟合训练数据集,如下图所示:
正则化(regularization)方法总结_第1张图片
几乎拟合每个训练样本,在训练样本中虽然准确率很高,但模型泛化能力差,往往在测试集上预测准确率较低。那么怎么解决这种问题?通过正则化(regularization)提高模型的泛化能力,减少过拟合现象。

2 正则化方法

什么叫正则化?传统的定义可能定义为在模型的损失函数增加惩罚项来增强模型的泛化能力。但是,在最新的Goodfellow和Bengio出的deep learning一书中,给出了 “正则化” 较为广义的定义:能够提高模型在test上的准确率,能够提高模型的泛化能力所做的任何改动,我们都可以称之为正则化,如下是常见的一些正则化方法。

2.1 基于数据的正则化方法

深度模型的表现很大程度上依赖于训练数据,我们可以对训练数据 D \mathcal D D进行一些转换处理得到一个有助于提高模型泛化能力的新的数据集 D R \mathcal D_R DR。其中转换操作一方面可以通过改变更有利于模型学习的数据的分布;另一方面通过生成更大的训练样本集,加强模型的泛化能力。这两种处理方法都是独立的,也可以两者都结合。总体来说,这两种方式都是通过对输入进行一个变量转换得到,这种转换,我们定义如下:
T θ ( x ) = x + θ ,   θ ∼ N ( 0 , ∑ ) . \mathcal T_\theta(x) = x + \theta, \text{ } \theta ∼ N(0, \sum). Tθ(x)=x+θ, θN(0,).
通过转换参数变量 θ \theta θ来产生新的数据,例如常见的data augmentation,对输入或者隐层特征进行变化。若参数变量 θ \theta θ是确定的,则经过转换后的数据保持不变,若是一个随机的参数,则可以产生一个更大的数据集。而常见的对数据进行转换的方法如下:

2.1.1 data augmentation

data augmentation通过对输入或者隐层特征进行转换,从而获得一个更大的数据集,提高模型在训练样本较少情况下的效果。对原始数据集中 ( x i , t i ) ∈ D (x_i, t_i) \in \mathcal D (xi,ti)D每个样本,通过转换函数,进行样本扩增操作 ( T θ ( x i ) , t i ) ∼ Q (\mathcal T_{\theta}(x_i), t_i) ∼ Q (Tθ(xi),ti)Q,可以获得一个更大的新的数据集 Q Q Q来模型训练。

2.1.2 dropout

dropout目的是防止模型过拟合,若模型复杂,在训练数据不足的情况下,模型会过拟合训练样本,泛化能力差。dropout通过随机丢弃一部分神经元节点(特征检测器),让模型变简单,防止模型过拟合。那为什么dropout可以缓解过拟合现象?

  • (1) 这种随机丢弃一部分神经元节点,使得两个神经元不一定都在一个网络中出现,可以减少神经元节点之间的互相作用,所谓的相互作用是指一个神经元检测的特征需要依赖其他神经元才能够发挥作用。而通过随机丢弃一部分神经元节点,可以使得神经元节点更关注自身的特征检测是否对最终的结果有帮助,而不是依赖其它有固定关系的神经元检测的特征值

  • (2) dropout机制可以看成是训练多个网络模型结构,而这些网络模型结构共享相同的参数。通过训练这样多个网络,类似bagging思想,通过多个网络的求平均结果,一定程度上可以防止过拟合,提升模型的效果。
    注意:dropout只在训练阶段执行,预测的时候关闭dropout。理想情况是对所有的训练阶段的dropout网络预测一个值,然后求平均值得到预测的结果,但是这样开销太大,所以目前的做法是,在训练的时候,对没有dropout的神经元权重值做一个invert rescale,乘以 1 1 − d r o p o u t \frac{1}{1-dropout } 1dropout1,这样可以保证在预测的时候和训练的时候scale保持一致。或者,在训练的时候不做操作,在预测的时候对每个神经权重值预先乘以 ( 1 − d r o p o u t ) (1-dropout) (1dropout),这样做的目的为了保证训练和预测权重参数scale的一致性。

  • (3) 训练的时候,dropout类似于在input和隐层特征随机加入噪声(一定概率让一部分神经元值为0),通过加入噪声,防止模型过拟合。或者另外一个角度理解,dropout机制,相当于上述提到的 T θ ( x ) \mathcal T_{\theta}(x) Tθ(x)转换函数,对原始 x x x转换到新的数据分布,由于 θ \theta θ是算计的,会得到一个更大的样本集,一定程度上可以防止过拟合。

  • (4) dropout思想和ReLu的思想有一定的关联,dropout以一定的概率随机对神经元丢弃(输出值为0),而ReLu是对神经元小于0的值置为0。

2.2 基于网络结构的正则化方法

2.2.1 weight sharing

不同的任务共享网络模型结构的部分,则称作权重共享,从而减少模型参数。比如常见的自编码autoencoder,在解码部分的权重与编码部分权重共享。

2.2.2 activation functions

正确选择激活函数对模型的表现是也很重要的,比如ReLu激活函数在许多深度模型结构上训练效率和模型的效果上都有一定的提高。而ReLu函数的成功除了能够缓解梯度消失问题,还因为具有更强的映射能力(用两层的ReLu就可以近似接近sigmoid的非线性表征,但需要无限的sigmoid神经元才能够接近一层的ReLu表征能力)。

2.2.3 Noisy models

通过随机在模型中注入噪声,可以减缓模型的过拟合问题,dropout是我们常见的在模型中注入随机噪声。

2.2.4 Multi-task learning

multi-task学习可以看做一种特殊的正则化,它可以结合半监督学习,在辅助task任务中充分利用无标签的数据。同样这种知识共享的概念也在meta-learning中有体现,通过来自相同领域的多个任务有序的学习,用前面的任务学到的知识作为新任务的一个bias。类似在transfer learning中,主要通过从一个领域的知识迁移到另外一个领域。

2.2.5 Model selection

模型选择的主要目的是从我们训练的多个模型中选择最佳的模型,所以我们需要一份数据集进行评估,往往通过对训练集进行划分validation数据集,通过模型在validation集的预测效果作为评判准则。但由于不同的划分结果模型在validation的表现波动较大,如果划分不好,可能无法选择到最好的模型与参数。为了解决这个问题,有人提出了交叉验证(cross-validation),通过将样本分成k份,依次取其中的一份作为validation验证集,其它作为训练集,最终取k次预测结果的平均作为模型的最终预测预结果。

2.3 基于正则化项

通过在损失函数中增加正则化项,实现正则化目的。损失函数主要是保证模型的输出和目标label一致性,而加入的正则化项是独立于label标签,可以对数据的先验知识进行建模,如果数据是稀疏的或者服从某种分布,我们可以在损失函数中加入这种先验知识限制,提高模型的效果。

2.3.1 L2

L2正则化,也叫weight decay,通过在损失函数上额外添加一项正则化项,表达如下:
L = E D ( w ) + λ 1 2 ∣ ∣ w ∣ ∣ 2 2 L =E_D(w) + \lambda \frac{1}{2}||w||_2^2 L=ED(w)+λ21w22
其中 λ \lambda λ是一个参数权重,控制正则化项 1 2 ∣ ∣ w ∣ ∣ 2 2 \frac{1}{2}||w||_2^2 21w22在整个loss的比重。通过加入这项,会带来什么变化?

  • 第一:整个loss不仅仅看模型预测结果与label的度量结果 E D ( w ) E_D(w) ED(w)产生的loss,还与本身权重参数 w w w的有关系,也就是说优化的最终目标是使得模型的预测的结果尽可能准的条件下,希望模型的参数权重也尽可能小,防止模型结构复杂,减少模型过拟合。
  • 第二:从贝叶斯角度理解,L2正则化其实是加入了数据的先验知识,认为权重参数服从高斯先验分布,所以在损失函数中加入这样的先验知识,让模型表现更好。那L2正则与高斯分布有什么关系? 首先我们来看下高斯分布的概率密度函数如下:
    f ( x ∣ μ , σ 2 ) = 1 2 π σ 2 e − ( x − μ ) 2 2 σ 2 f(x|\mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} f(xμ,σ2)=2πσ2 1e2σ2(xμ)2
    对应的概率密度函数图形如下:
    正则化(regularization)方法总结_第2张图片

而L2范数正好服从的是均值为0,标准差近似为 λ − 1 \lambda^{-1} λ1的高斯先验分布,表达式关系如下:
− l o g N ( w ∣ 0 , λ − 1 I ) ∝ − l o g   e x p ( − λ 2 ∣ ∣ w ∣ ∣ 2 2 ) = λ 2 ∣ ∣ w ∣ ∣ 2 2 -logN(w|0,\lambda^{-1}I) ∝ -log\text{ }exp(-\frac{\lambda}{2}||w||_2^2) = \frac{\lambda}{2}||w||_2^2 logN(w0λ1I)log exp(2λw22)=2λw22
现在就清晰了,权重参数 w w w服从高斯分布,则 − l o g N ( w ∣ 0 , λ − 1 I ) -logN(w|0, \lambda^{-1}I) logN(w0,λ1I)对应的是先验概率值损失函数,更直观的解释是,只有当 w w w在分布中出现的概率较大的区域范围,对应的概率密度值 N ( w ∣ 0 , λ − 1 I ) N(w|0,\lambda^{-1}I) N(w0λ1I)就越大,则-log(*)函数对应的loss越小,也就是限制让模型的参数 w w w服从先验高斯分布。

2.3.2 L1

同样,L1也是在损失函数中加入一项正则化项,公式表达如下:
L = E D ( w ) + λ ∣ w ∣ L = E_D(w) + \lambda |w| L=ED(w)+λw
λ ∣ ∣ w ∣ ∣ 1 \lambda ||w||_1 λw1为正则化项,那么我们来看下,加入这项正则化项,我们最终优化的目标会有什么变化?

  • 直观理解,优化的目标是使得模型的预测的结果尽可能准的条件下,希望模型的参数权重尽可能为稀疏
  • 同样,类似L2假设模型参数w服从高斯先验分布,其中L1假设模型参数服从拉普拉斯分布,我们先来看下拉普拉斯分布概率密度函数公式:
    f ( x ∣ μ , b ) = 1 2 b e x p ( − ∣ x − μ ∣ b ) f(x|\mu,b) = \frac{1}{2b}exp(-\frac{|x-\mu|}{b}) f(xμ,b)=2b1exp(bxμ)
    对应的概率密度函数图形如下:
    正则化(regularization)方法总结_第3张图片
    其中 μ \mu μ为数学期望, b b b为尺度参数,而L1正好假设模型参数服从拉普拉斯分布,关系推导如下:
    − l o g N ( w ∣ μ = 0 , b = λ − 1 ) ∝ − l o g   e x p ( − λ ∣ w ∣ 1 ) = λ ∣ w ∣ -logN(w|\mu=0,b=\lambda^{-1}) ∝ -log\text{ }exp(-\lambda|w|_1) = \lambda |w| logN(wμ=0b=λ1)log exp(λw1)=λw
    在损失函数中加入这样一个惩罚项,让模型的权重参数服从拉普拉斯分布,若权重参数离分布的中心值较远,则对应的概率越小,产生的损失loss就会大,起到惩罚的作用。L1正则化可以让模型更加稀疏,简化模型的效果,进而防止模型过拟合。

2.3.3 L1与L2的异同

相同点:

  • 防止模型过于复杂,通过对损失函数加入正则化项,防止模型过拟合
  • 假设模型参数服从一个分布,通过加入先验知识,限制模型参数服从一定的分布

不同点:

  • L2正则化相比L1对大数值参数 w w w更敏感,惩罚粒度也会更大
    首先L2和L1的概率密度分布图对比如下:
    正则化(regularization)方法总结_第4张图片
    其中L1是蓝色线,L2是橙色线,从图上来看,对于参数 ∣ w ∣ |w| w较大时,L2比L1更快让概率值接近0,而L1的分布对极端值更能够容忍。

-L1相比L2会更容易获得稀疏解
我们来看下L1和L2正则化求导结果如下:
L 1 ( w ) = ∣ w ∣ → d L 1 ( w ) d w = s i g n ( w ) L_1(w) = |w| \to \frac{dL_1(w)}{dw}=sign(w) L1(w)=wdwdL1(w)=sign(w)
L 2 ( w ) = 1 2 λ ∣ w ∣ 2 → d L 2 ( w ) d w = w L_2(w) = \frac{1}{2}\lambda|w|^2 \to \frac{dL2(w)}{dw}=w L2(w)=21λw2dwdL2(w)=w
对应的图形结果如下:
正则化(regularization)方法总结_第5张图片

从上面可以看出L1正则化的函数图为左上图,对应的导数图为右上图,可以看出不管L1的大小是多少(只要不为0),梯度都是1或者-1,所以每次更新梯度的时候,参数 w w w会稳步向0前进。而L2函数的导数图如右下图,w越靠近0的时候,梯度也越来越小,所以优化一定步骤后只能让 w w w接近0,很难等于0,但是L1有稳定的梯度,经过一定的迭代步数后很可能变为0,这就是为什么L1正则化比L2正则化可以得到更稀疏的解。

2.4 基于optimization进行正则化

2.4.1 Initialization methods

通过对模型参数的初始化,让模型一开始有个好的状态。目前最常见的对参数的初始化方法是从一个已知的数据分布中采样(例如正态分布等)初始化模型参数,有利于减缓深层网络导致的梯度消失或者梯度爆炸问题。另外一种方法是通过在相同领域上的数据集做=pre-training得到的模型参数初始化fine-tuning中的模型。用pre-training的模型参数初始化模型,通常可以加快模型收敛,而且可以学习到一些基础特征。另外一种方法课程学习 (curriculum learning)也称作warm-start methods,核心思想是模仿人类学习的特点,先学简单,再学较难的,会更有利于学习。所以在机器学习中,先学习简单的样本,再学习较困难的样本,能够提高模型的表现。比如在神经网络中的warmup策略,在最开始的steps中,先以小的学习率学习,再逐渐上升,如下表示:
l r i = i n ∗ l r {lr}_i = \frac{i}{n}*lr lri=nilr
其中 i i i是当前的step, n n n代表warmup阶段的所有steps,比如在bert中设置为占整个训练steps的10分之一。在warmup阶段,学习率是慢慢上升的,但还是比我们的初始化学习率低。避免模型在一开始由于学习率过大,模型对mini-batch过拟合,导致后期很难再纠正过来,等稍微平稳了,就可以用大的学习率进行加快学习,这样能够保持深层模型学习的稳定性。

2.4.2 Update methods

在梯度更新过程中,有两方面影响最终权重的计算,一方面是梯度更新规则,常见的有SGD,momentum,RMSProp,Adam等,另一方面权重和梯度的值的更改,比如在梯度上注入噪声值等。

2.4.4 Early Stopping

在恰当时刻结束模型训练也有可能提高模型的泛化能力,而常见的是通过early stopping准则,通过模型在validation的测试表现,保存结果最优的模型,防止模型一直训练,可能在训练集上表现越来越好,但模型过拟合了,有可能某个时刻,在测试集上已经开始变差。

3 参考

Regularization for Deep Learning: A Taxonomy

你可能感兴趣的:(NLP,机器学习,深度学习,神经网络)