权重衰减

了解权重衰减(L2正则化)的数学原理,掌握正则化技术在防止过拟合中的应用

发布于 2025-04-26 更新于 2025-04-261,888 字 5 分钟
权重衰减的文章封面
展开文章目录
  1. 1. 从特征数量限制到权重大小控制
  2. 1.1 多项式复杂度的组合爆炸
  3. 1.2 权重分布的理想状态
  4. 2. 惩罚权重向量的大分量
  5. 2.1 范数特性的利用
  6. 2.2 L2正则化的数学表达
  7. 2.3 正则化算法对比
  8. 3. 权重衰减中的参数更新
  9. 3.1 梯度计算
  10. 3.2 参数更新公式
  11. 3.3 收缩因子的作用
  12. 4. 权重衰减的实现要点
  13. 4.1 超参数选择
  14. 4.2 实现注意事项
  15. 4.3 与其他正则化技术的结合
  16. 5. PyTorch中的权重衰减实现
  17. 5.1 优化器中的权重衰减
  18. 5.2 手动实现权重衰减
  19. 5.3 不同参数组的权重衰减
  20. 参考资料

1. 从特征数量限制到权重大小控制

多项式回归的拟合测试让我们感性地意识到:“限制特征的数量”可用于缓解过拟合问题。让我们继续深入这个话题。

1.1 多项式复杂度的组合爆炸

多项式模型的阶数dd越高,模型的容量也就越大。对于具有nn个变量的dd阶多项式,其项数组合可能的个数有:

Ck1+dk1=(k1+d)!d!(k1)!C_{k-1+d}^{k-1}=\frac{(k-1+d)!}{d!\left(k-1\right)!}

多项式项数随阶数和变量数的变化

1.2 权重分布的理想状态


2. 惩罚权重向量的大分量

2.1 范数特性的利用

我们已经知道,L2L_2范数比L1L_1范数更容易受异常值的影响。利用这一特性,为了防止因单个变量具有过高的权重而导致过拟合,我们可以在损失函数中增加一个惩罚项来约束模型的复杂性。

正则化方法对比

L2正则化(权重衰减)

  • 别名:Tikhonov正则化、岭回归
  • 特点:对权重向量的大分量施加巨大惩罚
  • 效果:平滑地减小所有权重,不会产生稀疏解
  • 应用:最广泛使用的正则化技术之一

L1正则化(套索回归)

  • 特点L1L_1范数是对模型参数简单性的度量
  • 效果:一些特征的权重往往被直接置为零
  • 应用:权重集中在一小部分特征上,实现特征选择和稀疏性
  • 算法:构成套索回归(lasso regression)算法

2.2 L2正则化的数学表达

以线性回归模型中的损失函数LL为例,将L2L_2范数作为惩罚项引入后,结合了权重衰减的新损失函数为:

Lreg=12nXwy22+λ2w22=L+λ2w22\begin{aligned}L_{\mathrm{reg}}&=\frac{1}{2n}\left\|\mathbf{X}\mathbf{w}-\mathbf{y}\right\|_2^2+\frac{\lambda}{2}\|\mathbf{w}\|_2^2\\&=L+\frac{\lambda}{2}\|\mathbf{w}\|_2^2\end{aligned}

参数说明

参数详解

  • LL:原始损失函数
  • LregL_{reg}:引入了正则化项的损失函数
  • λ\lambda:权重衰减因子,属于超参数(12\frac{1}{2}是为了简化梯度计算而特意引入的常数因子)
  • w2\|\mathbf{w}\|^2:权重向量L2L_2范数w22\|\mathbf{w}\|_2^2的平方

L2正则化项的具体形式

对于向量w=[w1,w2,,wd]T\mathbf{w} = [w_1, w_2, \ldots, w_d]^TL2L_2正则化w2\|\mathbf{w}\|^2表示为:

w22=(w2)2=(w12+w22++wn2)2=w12+w22++wn2=inwi2\|\mathbf{w}\|_2^2=\left(\|\mathbf{w}\|_2\right)^2=\left(\sqrt{w_1^2+w_2^2+\ldots+w_n^2}\right)^2=w_1^2+w_2^2+\ldots+w_n^2=\sum_i^nw_i^2

2.3 正则化算法对比


3. 权重衰减中的参数更新

3.1 梯度计算

在梯度下降法中(以 Mini-Batch SGD 为例),需要计算LregL_{reg}的梯度。

梯度分解

梯度计算

原损失函数LL的梯度:

Lw\frac{\partial L}{\partial \mathbf{w}}

这是不包含正则化项的原始梯度。

惩罚项λ2w2\frac{\lambda}{2}\|\mathbf{w}\|^2的梯度:

w(λ2w2)=λw\frac{\partial}{\partial \mathbf{w}}\left(\frac{\lambda}{2}\|\mathbf{w}\|^2\right) = \lambda \mathbf{w}

这个梯度与权重向量本身成正比。

3.2 参数更新公式

结合两部分梯度,参数更新表示为:

wwη(Lw+λw)\mathbf{w} \leftarrow \mathbf{w} - \eta\left(\frac{\partial L}{\partial \mathbf{w}} + \lambda \mathbf{w}\right)

等价变换

我们可以将上式重写为:

w(1ηλ)wηLw\mathbf{w} \leftarrow (1 - \eta\lambda)\mathbf{w} - \eta\frac{\partial L}{\partial \mathbf{w}}

3.3 收缩因子的作用

权重衰减的直观理解

权重衰减理解

数学表达:

每次参数更新时,权重都会被乘以一个小于1的因子(1ηλ)(1 - \eta\lambda),这导致权重逐渐”衰减”到更小的值。

物理类比:

就像摩擦力会逐渐减慢运动物体的速度一样,权重衰减会逐渐减小模型参数的大小,防止它们变得过大。

实际应用:

  • 防止模型过度拟合训练数据
  • 提高模型的泛化能力
  • 使模型对输入的小变化更加鲁棒

4. 权重衰减的实现要点

4.1 超参数选择

  • 权重衰减系数λ\lambda:通常在[10^{-6\}10^{-2\}]范围内选择
  • 学习率η\eta:需要与权重衰减系数协调选择
  • 验证集调优:通过验证集性能选择最佳的λ\lambda

4.2 实现注意事项

4.3 与其他正则化技术的结合

权重衰减可以与其他正则化技术结合使用:


5. PyTorch中的权重衰减实现

5.1 优化器中的权重衰减

在PyTorch中,大多数优化器都支持weight_decay参数:

import torch
import torch.nn as nn
import torch.optim as optim

# 定义模型
model = nn.Linear(10, 1)

# 使用权重衰减的优化器
optimizer = optim.SGD(model.parameters(), lr=0.01, weight_decay=1e-4)

# 或者使用Adam优化器
optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-4)

5.2 手动实现权重衰减

def train_with_weight_decay(model, data_loader, criterion, lr=0.01, weight_decay=1e-4):
    for batch_idx, (data, target) in enumerate(data_loader):
        # 前向传播
        output = model(data)
        loss = criterion(output, target)
        
        # 手动添加L2正则化项
        l2_reg = torch.tensor(0.)
        for param in model.parameters():
            l2_reg += torch.norm(param, p=2)
        
        total_loss = loss + weight_decay * l2_reg
        
        # 反向传播
        total_loss.backward()
        
        # 参数更新
        with torch.no_grad():
            for param in model.parameters():
                param -= lr * param.grad
                param.grad.zero_()

5.3 不同参数组的权重衰减

# 对不同层设置不同的权重衰减
optimizer = optim.Adam([
    {'params': model.conv_layers.parameters(), 'weight_decay': 1e-4},
    {'params': model.fc_layers.parameters(), 'weight_decay': 1e-3},
    {'params': model.bias_params, 'weight_decay': 0}  # 偏置项不使用权重衰减
], lr=0.001)

参考资料

如果这篇记录对你有帮助,可以留下一句回应。

前往留言

DISCUSSION

讨论与回应

欢迎补充细节、指出问题,或分享与这篇文章有关的经验。

昵称与邮箱为必填项,邮箱仅用于头像和回复通知,不会公开。网址可以留空。

正在准备留言区…

演示赞赏界面

谢谢你愿意支持长期写作。

第一阶段不会发起支付或收集任何信息。接入真实赞赏渠道后,这里会展示清楚的金额、渠道和完成状态。

输入关键词开始搜索 · 按 Esc 关闭
打开完整搜索页 →