本文系统梳理了深度学习中各类正则化方法,包括:
在机器学习中,“正则化”有广义与狭义两种定义:
考虑一个多项式回归模型:
y = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + ⋯ + a n x n + ε y = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + \cdots + a_n x^n + \varepsilon y=a0+a1x+a2x2+a3x3+⋯+anxn+ε
当多项式次数 n n n 很大时,即使模型可以很好拟合训练数据,也容易在测试集上产生剧烈震荡。这就是典型的过拟合现象。
常见的防止过拟合方法包括:
增加数据量(More data)
丢弃不必要的假设(Simplify hypothesis class)
正则化:通过显式或隐式方式,控制模型复杂度或优化行为
经典正则化:约束假设的一些主要方法。
其他类型的正则化:数据增强、提前停止等。
我们关注的核心问题是:
如何以数学的方式形式化“控制模型复杂度”?
将正则化约束写作优化问题中的一个限制条件:
min θ 1 n ∑ i = 1 n ℓ ( θ , x i , y i ) s.t. R ( θ ) ≤ r \min_{\theta} \ \frac{1}{n} \sum_{i=1}^{n} \ell(\theta, x_i, y_i) \quad \text{s.t.} \ R(\theta) \leq r θmin n1i=1∑nℓ(θ,xi,yi)s.t. R(θ)≤r
其中:
这意味着:在训练误差最小化的同时,参数复杂度不得超过阈值。
更常见的做法是将约束移入目标函数,作为惩罚项加权求和:
min θ 1 n ∑ i = 1 n ℓ ( θ , x i , y i ) + λ R ( θ ) \min_{\theta} \ \frac{1}{n} \sum_{i=1}^{n} \ell(\theta, x_i, y_i) + \lambda R(\theta) θmin n1i=1∑nℓ(θ,xi,yi)+λR(θ)
其中:
这是一种“软性限制”,允许复杂度稍微增长但给予惩罚。
在贝叶斯视角下,正则化可以被解释为对模型参数施加先验概率分布。深度学习中的参数 θ \theta θ 并非是确定的最优解,而是从一个分布中抽取的可能值。
根据贝叶斯公式,有:
p ( θ ∣ { x i , y i } ) = p ( θ ) ⋅ p ( { x i , y i } ∣ θ ) p ( { x i , y i } ) p(\theta \mid \{x_i, y_i\}) = \frac{p(\theta) \cdot p(\{x_i, y_i\} \mid \theta)}{p(\{x_i, y_i\})} p(θ∣{xi,yi})=p({xi,yi})p(θ)⋅p({xi,yi}∣θ)
其中:
因此我们有:
log p ( θ ∣ { x i , y i } ) ∝ log p ( θ ) + log p ( { x i , y i } ∣ θ ) \log p(\theta \mid \{x_i, y_i\}) \propto \log p(\theta) + \log p(\{x_i, y_i\} \mid \theta) logp(θ∣{xi,yi})∝logp(θ)+logp({xi,yi}∣θ)
我们希望找到最可能的参数值,即最大化后验概率:
θ ^ MAP = arg max θ log p ( θ ∣ { x i , y i } ) \hat{\theta}_{\text{MAP}} = \arg \max_{\theta} \log p(\theta \mid \{x_i, y_i\}) θ^MAP=argθmaxlogp(θ∣{xi,yi})
等价于:
θ ^ MAP = arg max θ [ log p ( θ ) + log p ( { x i , y i } ∣ θ ) ] \hat{\theta}_{\text{MAP}} = \arg \max_{\theta} \left[ \log p(\theta) + \log p(\{x_i, y_i\} \mid \theta) \right] θ^MAP=argθmax[logp(θ)+logp({xi,yi}∣θ)]
我们将其拆分为两个部分理解:
因此,正则化就是在最大化似然目标之外,加上了一个对参数行为的约束项。
先验分布形式 | 对应的正则项 |
---|---|
高斯分布 N ( 0 , σ 2 ) \mathcal{N}(0, \sigma^2) N(0,σ2) | L2 正则化: λ ∣ θ ∣ 2 2 \lambda |\theta|_2^2 λ∣θ∣22 |
拉普拉斯分布 Laplace ( 0 , b ) (0, b) (0,b) | L1 正则化: λ ∣ θ ∣ 1 \lambda |\theta|_1 λ∣θ∣1 |
从贝叶斯角度来看,正则化的选择就是先验分布的选择。
选择 L2 正则意味着我们相信参数应该集中在 0 附近且分布平滑;选择 L1 正则意味着我们期望大多数参数为 0(产生稀疏解)。
权重衰减(Weight Decay)是最经典的显式正则化方法之一,它通过抑制参数值变大,从而控制模型复杂度,降低过拟合风险。
其核心思想是:在每一步更新时都对参数施加衰减,使其逐渐趋近于零。
权重衰减对应的优化目标为带有 L2 范数的正则化损失函数:
L total ( θ ) = L ( θ ) + α 2 ∥ θ ∥ 2 2 \mathcal{L}_{\text{total}}(\theta) = \mathcal{L}(\theta) + \frac{\alpha}{2} \|\theta\|_2^2 Ltotal(θ)=L(θ)+2α∥θ∥22
其中:
对该目标函数求梯度,有:
∇ θ L total ( θ ) = ∇ θ L ( θ ) + α θ \nabla_\theta \mathcal{L}_{\text{total}}(\theta) = \nabla_\theta \mathcal{L}(\theta) + \alpha \theta ∇θLtotal(θ)=∇θL(θ)+αθ
代入标准 SGD 更新规则:
θ ← θ − η ( ∇ θ L ( θ ) + α θ ) \theta \leftarrow \theta - \eta \left( \nabla_\theta \mathcal{L}(\theta) + \alpha \theta \right) θ←θ−η(∇θL(θ)+αθ)
将其拆分整理得到:
θ ← ( 1 − η α ) θ − η ∇ θ L ( θ ) \theta \leftarrow (1 - \eta \alpha) \theta - \eta \nabla_\theta \mathcal{L}(\theta) θ←(1−ηα)θ−η∇θL(θ)
可以看出:每一步更新中,参数都会乘上一个小于 1 的衰减因子 ( 1 − η α ) (1 - \eta \alpha) (1−ηα),这就是所谓的“权重衰减”。
独立于研究人员工作的工程师注意到,如果你只是在每次训练迭代中减少每个权重的值,你就会得到一个改进的训练模型,它不太可能过拟合
将参数衰减写成更新中的一部分,其本质就是:
在不显式修改损失函数的前提下,通过优化器实现 L2 正则化的效果。
L2方法有坚实的基础理论,但实现起来很复杂。权重衰减方法“刚好有效”,但实现起来很简单
注意:在某些深度学习库(如 PyTorch)的实现中,Weight Decay 是直接添加在梯度更新中的,而不是加入损失函数里。
回顾我们前面讲到的软约束正则化:
min θ 1 n ∑ i = 1 n ℓ ( θ ; x i , y i ) + λ ∥ θ ∥ 2 2 \min_\theta \ \frac{1}{n} \sum_{i=1}^n \ell(\theta; x_i, y_i) + \lambda \|\theta\|_2^2 θmin n1i=1∑nℓ(θ;xi,yi)+λ∥θ∥22
与 Weight Decay 的损失函数形式是完全一致的。二者仅在实现路径上略有不同,但数学等价。
除了在目标函数中显式加入正则项,或者在优化器中控制权重的更新,我们也可以通过对输入添加噪声的方式进行正则化。这是一种隐式的正则化方法。
这种方法的核心思想是:
通过随机扰动训练样本,迫使模型学会对输入的扰动具有鲁棒性,从而提升泛化性能。
对输入添加噪声的方式可以有多种类型:
加性高斯噪声(Additive Gaussian noise):
对原始输入 x x x 添加均值为 0 的正态噪声:
x ~ = x + ϵ , ϵ ∼ N ( 0 , σ 2 I ) \tilde{x} = x + \epsilon, \quad \epsilon \sim \mathcal{N}(0, \sigma^2 I) x~=x+ϵ,ϵ∼N(0,σ2I)
乘性噪声(Multiplicative noise):
例如在 Dropout 中使用的伯努利遮罩:
x ~ = x ⊙ z , z ∼ Bernoulli ( 1 − p ) \tilde{x} = x \odot z, \quad z \sim \text{Bernoulli}(1 - p) x~=x⊙z,z∼Bernoulli(1−p)
随机遮挡输入维度:
在图像任务中,这种技术与 Cutout、Masking 等技术类似。
设模型输出为 f ( x , θ ) f(x, \theta) f(x,θ),我们将输入加入噪声 ϵ \epsilon ϵ 得到 x ~ = x + ϵ \tilde{x} = x + \epsilon x~=x+ϵ,此时模型输出变为:
f ( x + ϵ , θ ) f(x + \epsilon, \theta) f(x+ϵ,θ)
在 ϵ \epsilon ϵ 很小时,泰勒展开该输出(在 x x x 处)为:
f ( x + ϵ , θ ) ≈ f ( x , θ ) + ϵ ⊤ ∇ x f ( x , θ ) f(x + \epsilon, \theta) \approx f(x, \theta) + \epsilon^\top \nabla_x f(x, \theta) f(x+ϵ,θ)≈f(x,θ)+ϵ⊤∇xf(x,θ)
对加噪后的输出求平方损失并取期望:
E ϵ [ ( f ( x + ϵ , θ ) − y ) 2 ] \mathbb{E}_\epsilon \left[ (f(x + \epsilon, \theta) - y)^2 \right] Eϵ[(f(x+ϵ,θ)−y)2]
近似等价于:
( f ( x , θ ) − y ) 2 + σ 2 ∥ ∇ x f ( x , θ ) ∥ 2 (f(x, \theta) - y)^2 + \sigma^2 \|\nabla_x f(x, \theta)\|^2 (f(x,θ)−y)2+σ2∥∇xf(x,θ)∥2
也就是说:
在输入添加高斯噪声,相当于对模型的输入梯度做正则化。
这种正则化鼓励模型对输入的扰动不敏感,提高鲁棒性。
在输入中加入噪声:一种特殊的增强。
方法 | 正则化解释 |
---|---|
加性高斯噪声 | 等价于输入梯度正则项 ∣ ∇ x f ( x , θ ) ∣ 2 |\nabla_x f(x, \theta)|^2 ∣∇xf(x,θ)∣2 |
Dropout(遮挡) | 等价于对结构采样的模型集成 |
图像遮挡、抖动、随机剪裁等数据增强 | 提高模型对局部扰动、视角变化的泛化能力 |
这种类型的正则化属于 数据级干预,但其效果可以形式化地理解为隐式参数约束,因此也纳入正则化范畴。
Early Stopping(早停)是一种简单有效的正则化技术,它的基本思想是:
在训练误差持续下降但验证误差开始上升时,及时停止训练,避免过拟合。
在训练神经网络时,我们通常会监控训练集与验证集上的误差变化:
此时若继续训练,会导致模型对训练数据“记忆”过强,泛化能力下降。Early Stopping 通过以下流程避免这一问题:
该过程引入了一个超参数 patience
,表示可以容忍多少次不下降。
这种策略的图示如下:
Epoch | Training Loss | Validation Loss | Stop? |
---|---|---|---|
1 | 0.9 | 0.8 | |
10 | 0.5 | 0.4 | |
20 | 0.3 | 0.35 | |
30 | 0.2 | 0.37 | ✖️ |
35 | 0.15 | 0.38 | ✅ |
验证集在第 20 epoch 最优,因此返回第 20 轮模型。
有时我们希望最大化数据利用率,避免把数据永久分成训练 / 验证集,可以采取如下策略:
两阶段训练:
从 early stop 点继续:
Early Stopping 实际上相当于在训练轮数 T T T 上施加了一个软约束,防止模型完全拟合训练集。
可以视为在优化过程中提前打断,间接控制模型复杂度,因此它是一种有效的“过程级正则化”技术。
Dropout 是一种被广泛应用于神经网络训练的正则化技术,由 Hinton 等人提出。其主要思想是在训练过程中随机屏蔽神经元的输出,以此防止神经元之间过度依赖(共适应 co-adaptation)导致的过拟合。
在标准神经网络中,每个神经元都会对训练数据进行响应。但在小样本或过拟合风险大的情形下:
Dropout 通过在训练时随机遮蔽神经元,迫使模型在每个小批次上适应不同的子网络,从而有效提升鲁棒性与泛化能力。
设神经元的输出为 h = [ h 1 , h 2 , . . . , h n ] h = [h_1, h_2, ..., h_n] h=[h1,h2,...,hn],我们在训练阶段生成一个遮罩向量 z ∈ { 0 , 1 } n z \in \{0, 1\}^n z∈{0,1}n,其中每一位 z i z_i zi 独立采样自伯努利分布:
z i ∼ Bernoulli ( 1 − p ) z_i \sim \text{Bernoulli}(1 - p) zi∼Bernoulli(1−p)
Dropout 后的输出为:
h ~ i = h i ⋅ z i \tilde{h}_i = h_i \cdot z_i h~i=hi⋅zi
或者记为:
h ~ = h ⊙ z \tilde{h} = h \odot z h~=h⊙z
其中 ⊙ \odot ⊙ 表示逐元素乘法, p p p 是 Dropout rate,表示神经元被“丢弃”的概率。
由于训练阶段的激活被随机屏蔽,因此在测试阶段,我们需要对神经元的输出进行缩放以保持数学期望不变。
训练阶段:
h ~ train = h ⊙ z \tilde{h}^{\text{train}} = h \odot z h~train=h⊙z
h i train = { w , 概率 p 0 , 概率 ( 1 − p ) h_i^{\text{train}} = \begin{cases} w, & \text{概率 } p \\ 0, & \text{概率 } (1 - p) \end{cases} hitrain={w,0,概率 p概率 (1−p)
测试阶段:
h ~ test = ( 1 − p ) ⋅ h \tilde{h}^{\text{test}} = (1 - p) \cdot h h~test=(1−p)⋅h
训练阶段:
h ~ train = h ⊙ z 1 − p \tilde{h}^{\text{train}} = \frac{h \odot z}{1 - p} h~train=1−ph⊙z
测试阶段:
h ~ test = h \tilde{h}^{\text{test}} = h h~test=h
这种方法称为 Inverted Dropout,在 TensorFlow、PyTorch 等主流框架中为默认实现方式。
我们希望无论是否 Dropout,神经元在训练与测试阶段的期望输出保持一致。考虑某个神经元输出 h i h_i hi,在训练时以概率 1 − p 1 - p 1−p 保留:
E [ z i ⋅ h i ] = ( 1 − p ) ⋅ h i \mathbb{E}[z_i \cdot h_i] = (1 - p) \cdot h_i E[zi⋅hi]=(1−p)⋅hi
因此,在测试阶段如果使用全部神经元输出 h i h_i hi,则需乘以 ( 1 − p ) (1 - p) (1−p) 才能与训练期望一致。
Dropout 的一个核心观点是:
在训练过程中,Dropout 实际上训练了一个巨大的子网络集合,并且这些网络共享权重。
具体来说:
因此,Dropout 可以被视为一种廉价的、参数共享的模型集成方法(Ensemble)。
Dropout 并不显式添加正则项到损失函数,而是通过噪声干扰机制实现了如下行为:
Dropout是无标度的:Dropout不会在需要时惩罚大权重的使用
Dropout不受参数缩放的影响:如果某一层的权重按常数增大,而另一层的权重按常数减小,则Dropout不受影响
DropConnect 是 Dropout 的一种推广,由 Wan et al. 在 2013 年提出。其基本思想是:
不是随机屏蔽神经元的输出,而是随机屏蔽权重连接本身。
换句话说,Dropout 是对激活值 h h h 做随机失活,而 DropConnect 是对权重矩阵 W W W 的每一个元素做随机失活。
在前向传播中,某一层的计算通常为:
z = W x + b z = W x + b z=Wx+b
在 DropConnect 中,权重矩阵 W W W 被随机遮蔽为 W ~ \tilde{W} W~,即:
W ~ i j = W i j ⋅ m i j , m i j ∼ Bernoulli ( 1 − p ) \tilde{W}_{ij} = W_{ij} \cdot m_{ij}, \quad m_{ij} \sim \text{Bernoulli}(1 - p) W~ij=Wij⋅mij,mij∼Bernoulli(1−p)
也可以写为:
z = ( W ⊙ M ) x + b z = (W \odot M) x + b z=(W⊙M)x+b
其中:
DropConnect 是对网络中**连接级别(weights)**进行随机屏蔽,而非神经元输出级别。
特性 | Dropout | DropConnect |
---|---|---|
随机屏蔽目标 | 激活值 h h h | 权重参数 W W W |
屏蔽位置 | 层输出阶段 | 层输入前,权重矩阵 |
实现复杂度 | 较低,易于实现 | 较高,需构造完整权重遮罩 |
是否加噪 | 是,直接对 forward path 加扰动 | 是,但更细粒度 |
能否推广 | 是,DropConnect ⊃ Dropout | 是,更通用 |
Dropout 可视为 DropConnect 的特例:如果一整行或一整列连接全部为 0,就等价于将某个神经元屏蔽掉。
训练时,每个连接以概率 p p p 被失活,使用遮罩矩阵 M M M 进行前向与反向传播。
推理阶段不能使用随机遮罩,需对所有连接使用期望权重:
E [ W ~ i j ] = ( 1 − p ) W i j \mathbb{E}[\tilde{W}_{ij}] = (1 - p) W_{ij} E[W~ij]=(1−p)Wij
因此,测试阶段通常使用“期望连接”:
z test = ( ( 1 − p ) ⋅ W ) x + b z^{\text{test}} = ((1 - p) \cdot W) x + b ztest=((1−p)⋅W)x+b
也可采用 Monte Carlo 采样多个 M M M 得到多个预测再平均(不过计算开销较大,实践中较少使用)。
DropConnect 从参数空间引入扰动,具有如下效果:
DropConnect 类似于在训练过程中构造子网络,但与 Dropout 构造的是不同维度的子结构。
在机器学习算法中,优化过程中涉及的函数对归一化很敏感
例如:两点之间的距离用欧氏距离表示。如果其中一个特征值的范围很广,则距离将由该特定特征控制。
在归一化之后,每个特征对最终距离的贡献大致成比例。
一般来说,有特征缩放的梯度下降比没有特征缩放的梯度下降收敛得快得多。
数值计算的数值稳定性的良好实践,并避免在求解方程组时出现病态。
Batch Normalization(BN)是一种广泛使用的训练加速和正则化技术。其主要目标是:
缓解“内部协变量偏移”(Internal Covariate Shift)问题,从而加速训练并提升模型泛化性能。
cup game的游戏为例,一群人用杯子传递声音,问题是系统性的,是由有缺陷的杯造成的。
BN 在深度网络中尤其有效,可以稳定训练过程、允许更大的学习率,并具有一定的正则化效果。
神经网络中的每一层都将输入映射到新的表示空间,后续层的输入分布会随着前一层参数更新而不断变化。
这种输入分布的变化称为 内部协变量偏移。
问题在于:
BN 通过标准化每一层的输入,使其均值为 0,方差为 1,从而保持输入分布稳定。
BN减小协变量移位(Covariate Shift)。这是一个组分激活分布的变化。通过使用BN,每个神经元的激活(s形)(或多或少)成为高斯分布,即它通常不活跃,有时有点活跃,很少非常活跃.
协变量移位是不可取的,因为后面的层必须不断适应分布类型的变化
BN减少了爆炸和消失梯度的影响,因为每个梯度都大致为正态分布。没有BN,一层的低活化度会导致下一层的低活化度,然后下一层的更低活化度,以此类推
设某层输入为 x = [ x 1 , x 2 , . . . , x m ] x = [x_1, x_2, ..., x_m] x=[x1,x2,...,xm],表示一个 mini-batch 的同一维度上的激活值,BN 的过程如下:
μ B = 1 m ∑ i = 1 m x i , σ B 2 = 1 m ∑ i = 1 m ( x i − μ B ) 2 \mu_B = \frac{1}{m} \sum_{i=1}^{m} x_i, \quad \sigma_B^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu_B)^2 μB=m1i=1∑mxi,σB2=m1i=1∑m(xi−μB)2
x ^ i = x i − μ B σ B 2 + ϵ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} x^i=σB2+ϵxi−μB
其中 ϵ \epsilon ϵ 是一个小常数,用于数值稳定。
BN 并不会直接使用 x ^ i \hat{x}_i x^i,而是引入两个可学习参数 γ \gamma γ 和 β \beta β:
y i = γ x ^ i + β y_i = \gamma \hat{x}_i + \beta yi=γx^i+β
γ \gamma γ 控制缩放, β \beta β 控制平移。这样 BN 不会限制网络的表达能力。
在测试阶段,不能使用当前 batch 的均值与方差,因为此时是单一样本或数据分布已变。
BN 使用**滑动平均(moving average)**存储的训练阶段统计值:
推理时使用:
x ^ = x − μ EMA σ EMA 2 + ϵ , y = γ x ^ + β \hat{x} = \frac{x - \mu_{\text{EMA}}}{\sqrt{\sigma_{\text{EMA}}^2 + \epsilon}}, \quad y = \gamma \hat{x} + \beta x^=σEMA2+ϵx−μEMA,y=γx^+β
训练阶段中,BatchNorm 使用的是 mini-batch 内的均值和方差:
μ B = 1 m ∑ i = 1 m x i , σ B 2 = 1 m ∑ i = 1 m ( x i − μ B ) 2 \mu_{\mathcal{B}} = \frac{1}{m} \sum_{i=1}^m x_i, \quad \sigma_{\mathcal{B}}^2 = \frac{1}{m} \sum_{i=1}^m (x_i - \mu_{\mathcal{B}})^2 μB=m1i=1∑mxi,σB2=m1i=1∑m(xi−μB)2
但这个 σ B 2 \sigma_{\mathcal{B}}^2 σB2 是一个有偏估计(biased estimator),它的期望值小于整体分布的真实方差 Var [ x ] \text{Var}[x] Var[x]。
为了在测试(推理)阶段使用准确的无偏方差,我们要将多个 batch 的方差均值进行修正:
Var [ x ] ← m m − 1 ⋅ E B [ σ B 2 ] \text{Var}[x] \leftarrow \frac{m}{m - 1} \cdot \mathbb{E}_{\mathcal{B}}[\sigma_{\mathcal{B}}^2] Var[x]←m−1m⋅EB[σB2]
其中 m m m 是 batch size。这个修正因子 m m − 1 \frac{m}{m-1} m−1m 可以保证推理时所使用的方差估计是无偏的,从而提升稳定性和数值精度。
BN 带来了两类改进:
BN 使用 batch 内部的统计量估计均值与方差,这会引入噪声扰动(batch-to-batch variance),从而具备一定的正则化效果。
尤其在小 batch 情况下,这种方差的估计不稳定性具有正则化特性,防止过拟合。
BN 通常被插入在:
Linear or Conv → BatchNorm → Activation \text{Linear or Conv} \ \rightarrow \ \text{BatchNorm} \ \rightarrow \ \text{Activation} Linear or Conv → BatchNorm → Activation
即先归一化,再激活。这样可以保证激活函数的输入具有良好的分布特性。
BN 对 batch size 敏感(小 batch 时效果差);
由于批统计估计不准确,当批大小变小时,BN的误差迅速增大
对 RNN 结构适应性较弱;
推理阶段行为与训练阶段不同,需正确区分;
衍生方法:
除了 BatchNorm(BN)以外,还有许多归一化方法被提出,适用于不同的网络结构或应用场景。它们的共同目标是解决内部协变量偏移的问题,但在归一化的粒度与方式上各有差异。
LayerNorm 是在 NLP 模型中非常常用的归一化方式,特别适用于 RNN、Transformer 等结构。
与 BN 的区别在于:
假设一个样本的激活为向量 x ∈ R d x \in \mathbb{R}^d x∈Rd,LayerNorm 的计算方式为:
μ = 1 d ∑ i = 1 d x i , σ 2 = 1 d ∑ i = 1 d ( x i − μ ) 2 \mu = \frac{1}{d} \sum_{i=1}^d x_i, \quad \sigma^2 = \frac{1}{d} \sum_{i=1}^d (x_i - \mu)^2 μ=d1i=1∑dxi,σ2=d1i=1∑d(xi−μ)2
归一化结果为:
x ^ i = x i − μ σ 2 + ϵ , y i = γ x ^ i + β \hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}}, \quad y_i = \gamma \hat{x}_i + \beta x^i=σ2+ϵxi−μ,yi=γx^i+β
其中 γ , β \gamma, \beta γ,β 是可学习的缩放和平移参数, ϵ \epsilon ϵ 是防止除零的小常数。
LayerNorm 具有以下特点:
InstanceNorm 最初是为风格迁移任务设计的,主要用于图像生成模型中。
它的归一化维度是:
给定张量 x ∈ R B × C × H × W x \in \mathbb{R}^{B \times C \times H \times W} x∈RB×C×H×W,对第 b b b 个样本,第 c c c 个通道,其均值和方差为:
μ b c = 1 H W ∑ i = 1 H ∑ j = 1 W x b c i j , σ b c 2 = 1 H W ∑ i = 1 H ∑ j = 1 W ( x b c i j − μ b c ) 2 \mu_{bc} = \frac{1}{HW} \sum_{i=1}^H \sum_{j=1}^W x_{bcij}, \quad \sigma^2_{bc} = \frac{1}{HW} \sum_{i=1}^H \sum_{j=1}^W (x_{bcij} - \mu_{bc})^2 μbc=HW1i=1∑Hj=1∑Wxbcij,σbc2=HW1i=1∑Hj=1∑W(xbcij−μbc)2
归一化结果为:
x ^ b c i j = x b c i j − μ b c σ b c 2 + ϵ \hat{x}_{bcij} = \frac{x_{bcij} - \mu_{bc}}{\sqrt{\sigma^2_{bc} + \epsilon}} x^bcij=σbc2+ϵxbcij−μbc
InstanceNorm 的特点:
GroupNorm 是为了解决 BN 在小 batch 下失效的问题,由 Facebook AI 研究院提出。
它将每个通道分组后,在组内做归一化。比如将 32 个通道分为 4 组,每组 8 个通道,然后在每组中计算均值和方差。
假设张量形状为 x ∈ R B × C × H × W x \in \mathbb{R}^{B \times C \times H \times W} x∈RB×C×H×W,设有 G G G 个组,则每组大小为 C / G C/G C/G。
每一组的归一化操作为:
μ g = 1 m ∑ k = 1 m x k , σ g 2 = 1 m ∑ k = 1 m ( x k − μ g ) 2 \mu_{g} = \frac{1}{m} \sum_{k=1}^{m} x_k, \quad \sigma^2_{g} = \frac{1}{m} \sum_{k=1}^{m} (x_k - \mu_g)^2 μg=m1k=1∑mxk,σg2=m1k=1∑m(xk−μg)2
其中 m = C G × H × W m = \frac{C}{G} \times H \times W m=GC×H×W 是组内的元素数量。
归一化结果与前述方法一致:
x ^ k = x k − μ g σ g 2 + ϵ \hat{x}_k = \frac{x_k - \mu_g}{\sqrt{\sigma^2_g + \epsilon}} x^k=σg2+ϵxk−μg
GN 的优点:
方法 | 归一化维度 | 是否依赖 batch size | 适用场景 |
---|---|---|---|
BN | Batch 内每个通道 | 是 | 通用 CNN、较大 batch |
LN | 每个样本的特征维 | 否 | RNN、Transformer、NLP |
IN | 每个样本每个通道 | 否 | 风格迁移、图像生成 |
GN | 每个样本的分组通道 | 否 | 小 batch CNN、语义分割等 |
BatchNorm 在现代深度学习框架中仍是默认的标准化方法,但当 batch size 受限,或模型对顺序建模敏感时,LayerNorm、GroupNorm 等是更好的替代方案。
本节对前面介绍的所有正则化方法进行系统总结,从三种视角(损失函数级、模型结构级、训练过程级)归纳,并给出实际应用中的建议策略。
正则化可以按照其作用方式,划分为以下三类:
直接在损失函数中添加限制项,对模型参数的大小或稀疏性进行惩罚:
目标函数形式为:
L total = L + λ R ( θ ) \mathcal{L}_{\text{total}} = \mathcal{L} + \lambda R(\theta) Ltotal=L+λR(θ)
其中 R ( θ ) R(\theta) R(θ) 是参数的范数。
通过改变网络结构引入归纳偏置,从而控制模型的表达能力或增强模型泛化:
这类正则化不修改损失函数,但通过模型本身行为影响泛化。
通过优化策略对模型学习过程施加限制,避免过拟合或加速收敛:
这些方法作用于训练过程,改变收敛路径和收敛点。
方法类别 | 方法 | 典型代表 |
---|---|---|
损失函数正则 | Weight Decay, L1/L2, Label Smoothing | 控制参数大小与偏离 |
模型结构正则 | Dropout, DropConnect, 数据增强 | 引入噪声、结构采样 |
优化过程正则 | Early Stopping, BN, Norm 类方法 | 控制训练动态,提升稳定性 |
这些方法可以联合使用,但需注意相互间的兼容性与冗余性。
以下是根据不同任务与网络结构给出的正则化建议:
图像分类任务:
文本任务(如 Transformer):
小样本训练:
大规模模型训练: