LOADING
1078 字
5 分钟
正则化与深度学习

正则化与深度学习#

正则化是防止模型过拟合的核心技术。本文从数学原理出发,系统介绍深度学习中的各种正则化方法。


一、过拟合与正则化#

1.1 偏差-方差权衡#

模型的泛化误差可以分解为:

E[(yf^(x))2]=Bias2偏差+Variance方差+σ2噪声\mathbb{E}[(y - \hat{f}(x))^2] = \underbrace{\text{Bias}^2}_{\text{偏差}} + \underbrace{\text{Variance}}_{\text{方差}} + \underbrace{\sigma^2}_{\text{噪声}}
  • 高偏差:欠拟合,模型过于简单
  • 高方差:过拟合,模型过于复杂

正则化通过限制模型复杂度来减少方差。

1.2 正则化的统一视角#

从优化角度,正则化将原问题:

minθL(θ)\min_\theta \mathcal{L}(\theta)

转化为:

minθL(θ)+λR(θ)\min_\theta \mathcal{L}(\theta) + \lambda R(\theta)

其中 R(θ)R(\theta) 是正则化项,λ\lambda 是正则化强度。


二、L1 和 L2 正则化#

2.1 L2 正则化(Ridge / Weight Decay)#

R(θ)=θ22=iθi2R(\theta) = \|\theta\|_2^2 = \sum_i \theta_i^2

梯度更新

θθη(θL+2λθ)=(12ηλ)θηθL\theta \leftarrow \theta - \eta \left( \nabla_\theta \mathcal{L} + 2\lambda \theta \right) = (1 - 2\eta\lambda)\theta - \eta \nabla_\theta \mathcal{L}
几何解释

L2 正则化使权重向原点收缩,但不会变为精确的零。等价于对权重施加高斯先验 θN(0,1/2λ)\theta \sim \mathcal{N}(0, 1/2\lambda)

2.2 L1 正则化(Lasso)#

R(θ)=θ1=iθiR(\theta) = \|\theta\|_1 = \sum_i |\theta_i|

关键性质:产生稀疏解,部分权重精确为零。

特性L1L2
稀疏性✓ 产生稀疏解✗ 权重趋近但不等于零
可微性在零点不可微处处可微
鲁棒性对异常值更鲁棒对大权重惩罚更大
贝叶斯解释Laplace 先验Gaussian 先验

2.3 弹性网络(Elastic Net)#

结合 L1 和 L2:

R(θ)=αθ1+(1α)θ22R(\theta) = \alpha \|\theta\|_1 + (1-\alpha) \|\theta\|_2^2

三、Dropout#

3.1 原理#

训练时,以概率 pp 随机将神经元输出置零:

h~i={0with probability phi/(1p)with probability 1p\tilde{h}_i = \begin{cases} 0 & \text{with probability } p \\ h_i / (1-p) & \text{with probability } 1-p \end{cases}

除以 (1p)(1-p) 保证期望不变。

3.2 数学理解#

贝叶斯近似

Dropout 可以理解为对模型参数的近似贝叶斯推断。每次前向传播相当于从参数后验分布中采样。

集成学习视角:训练 2n2^n 个共享权重的子网络,测试时取平均。

3.3 实现#

import torch
import torch.nn as nn
class DropoutLayer(nn.Module):
def __init__(self, p=0.5):
super().__init__()
self.p = p
def forward(self, x):
if self.training:
mask = torch.bernoulli(torch.ones_like(x) * (1 - self.p))
return x * mask / (1 - self.p)
return x

四、Batch Normalization#

4.1 前向传播#

对每个 mini-batch,计算均值和方差并归一化:

x^i=xiμBσB2+ϵ\hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}

然后进行缩放和平移:

yi=γx^i+βy_i = \gamma \hat{x}_i + \beta

其中 γ,β\gamma, \beta 是可学习参数。

4.2 为什么有效?#

  1. 减少内部协变量偏移:稳定每层的输入分布
  2. 允许更大学习率:梯度更稳定
  3. 正则化效果:mini-batch 统计量引入噪声

4.3 变体#

方法归一化维度适用场景
Batch Norm沿 batch 维度CNN
Layer Norm沿特征维度RNN, Transformer
Instance Norm每个样本独立风格迁移
Group Norm分组归一化小 batch size

五、数据增强#

5.1 图像增强#

from torchvision import transforms
transform = transforms.Compose([
transforms.RandomHorizontalFlip(p=0.5),
transforms.RandomRotation(15),
transforms.ColorJitter(brightness=0.2, contrast=0.2),
transforms.RandomCrop(224, padding=4),
])

5.2 Mixup#

混合两个样本及其标签:

x~=λxi+(1λ)xj,y~=λyi+(1λ)yj\tilde{x} = \lambda x_i + (1-\lambda) x_j, \quad \tilde{y} = \lambda y_i + (1-\lambda) y_j

其中 λBeta(α,α)\lambda \sim \text{Beta}(\alpha, \alpha)

5.3 CutMix#

将一个样本的矩形区域替换为另一个样本:

x~=Mxi+(1M)xj\tilde{x} = M \odot x_i + (1-M) \odot x_j

其中 MM 是二值掩码。


六、早停(Early Stopping)#

6.1 原理#

监控验证集损失,当连续 kk 个 epoch 不再下降时停止训练。

class EarlyStopping:
def __init__(self, patience=10, min_delta=0):
self.patience = patience
self.min_delta = min_delta
self.counter = 0
self.best_loss = float('inf')
def __call__(self, val_loss):
if val_loss < self.best_loss - self.min_delta:
self.best_loss = val_loss
self.counter = 0
return False
self.counter += 1
return self.counter >= self.patience

6.2 理论分析#

早停的效果类似于 L2 正则化:限制参数从初始值移动的距离。


七、正则化策略总结#

graph TD A[正则化技术] --> B[显式正则化] A --> C[隐式正则化] B --> D[L1/L2 正则化] B --> E[Dropout] C --> F[数据增强] C --> G[Batch Normalization] C --> H[早停]

总结#

正则化是深度学习成功的关键因素之一:

技术优势注意事项
L2 正则化简单有效不产生稀疏解
Dropout强大的正则化增加训练时间
Batch Norm加速训练依赖 batch size
数据增强无需修改模型需要领域知识
早停自动调节需要验证集
实践建议
  1. 从 Batch Norm + 适度 Dropout 开始
  2. 配合数据增强(尤其是图像任务)
  3. 使用 AdamW(解耦的 L2 正则化)
  4. 监控训练/验证曲线,必要时调整正则化强度
正则化与深度学习
https://goblinunde.github.io/posts/regularization-deep-learning/
作者
CJX
发布于
2026-01-21
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时