深入理解D2L项目中的权重衰减技术

深入理解D2L项目中的权重衰减技术

d2l-en d2l-ai/d2l-en: 是一个基于 Python 的深度学习教程,它使用了 SQLite 数据库存储数据。适合用于学习深度学习,特别是对于需要使用 Python 和 SQLite 数据库的场景。特点是深度学习教程、Python、SQLite 数据库。 d2l-en 项目地址: https://gitcode.com/gh_mirrors/d2/d2l-en

引言

在机器学习中,过拟合是一个常见且棘手的问题。当模型在训练数据上表现优异但在新数据上表现不佳时,我们就遇到了过拟合。权重衰减(Weight Decay)是一种简单而有效的正则化技术,它通过限制模型参数的大小来防止过拟合。本文将深入探讨权重衰减的原理、实现方式及其在深度学习中的应用。

权重衰减的基本原理

什么是权重衰减?

权重衰减,也称为L2正则化,是一种通过向损失函数添加惩罚项来限制模型参数大小的技术。其核心思想是:在最小化原始损失函数的同时,也尽量保持权重参数的数值较小。

为什么权重衰减能防止过拟合?

  1. 限制模型复杂度:较大的权重通常意味着模型对输入变化更敏感,可能导致过拟合
  2. 促进参数平滑:权重衰减倾向于让所有特征都有相对均衡的贡献,而不是让少数特征主导预测
  3. 数值稳定性:较小的权重有助于保持数值计算的稳定性

数学表达

考虑线性回归的损失函数:

$$L(\mathbf{w}, b) = \frac{1}{n}\sum_{i=1}^n \frac{1}{2}\left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right)^2$$

加入L2正则化项后,损失函数变为:

$$L(\mathbf{w}, b) + \frac{\lambda}{2} |\mathbf{w}|^2$$

其中$\lambda$是正则化强度超参数,控制惩罚项的权重。

权重衰减的实现

从零开始实现

让我们看看如何在代码中实现权重衰减:

def l2_penalty(w):
    return d2l.reduce_sum(w**2) / 2

class WeightDecayScratch(d2l.LinearRegressionScratch):
    def __init__(self, num_inputs, lambd, lr, sigma=0.01):
        super().__init__(num_inputs, lr, sigma)
        self.save_hyperparameters()
        
    def loss(self, y_hat, y):
        return (super().loss(y_hat, y) +
                self.lambd * l2_penalty(self.w))

关键点:

  1. l2_penalty函数计算权重向量的L2范数平方的一半
  2. 新的损失函数包含原始损失和正则化项
  3. 超参数lambd控制正则化强度

使用框架内置实现

主流深度学习框架都内置了权重衰减支持:

PyTorch示例:

optimizer = torch.optim.SGD([
    {'params': model.weight, 'weight_decay': wd},
    {'params': model.bias}], lr=lr)

TensorFlow示例:

model.add(tf.keras.layers.Dense(
    units=1, 
    kernel_regularizer=tf.keras.regularizers.l2(wd)
))

MXNet示例:

trainer = gluon.Trainer(model.collect_params(),
                       'sgd', 
                       {'learning_rate': lr, 'wd': wd})

权重衰减的效果演示

实验设置

我们使用一个高维(200维)线性回归问题,但只有20个训练样本,这样很容易出现过拟合:

data = Data(num_train=20, num_val=100, num_inputs=200, batch_size=5)

不使用权重衰减的结果

train_scratch(0)  # lambd=0表示不使用权重衰减

结果分析:

  • 训练误差迅速下降
  • 验证误差保持高位
  • 典型的过拟合现象

使用权重衰减的结果

train_scratch(3)  # 使用适度的权重衰减

结果分析:

  • 训练误差略高
  • 验证误差显著降低
  • 模型泛化能力提升

权重衰减的深入讨论

L2 vs L1正则化

  1. L2正则化(权重衰减)

    • 倾向于均匀分布权重
    • 产生平滑的决策边界
    • 计算梯度简单
  2. L1正则化(Lasso)

    • 倾向于产生稀疏解(许多权重为0)
    • 自动执行特征选择
    • 对异常值更鲁棒

权重衰减与优化

在SGD更新中,权重衰减表现为:

$$\mathbf{w} \leftarrow (1-\eta\lambda)\mathbf{w} - \eta\nabla L(\mathbf{w})$$

这相当于在每一步都先将权重缩小一点,再沿着梯度方向更新。

实践建议

  1. 偏差项通常不正则化:只对权重参数应用权重衰减
  2. 分层设置:不同层可以使用不同的衰减强度
  3. 与其他正则化结合:如Dropout、数据增强等
  4. 超参数调优:通过验证集选择合适的$\lambda$值

总结

权重衰减是一种简单而强大的正则化技术,通过限制模型参数的大小来防止过拟合。本文从原理到实现详细介绍了权重衰减:

  1. 解释了权重衰减如何通过L2惩罚项控制模型复杂度
  2. 展示了从零实现和使用框架内置功能的两种方式
  3. 通过实验验证了权重衰减对过拟合的改善效果
  4. 讨论了权重衰减与其他技术的比较和实践建议

权重衰减是深度学习工具箱中的基础技术,理解其原理和实现对于构建泛化能力强的模型至关重要。

d2l-en d2l-ai/d2l-en: 是一个基于 Python 的深度学习教程,它使用了 SQLite 数据库存储数据。适合用于学习深度学习,特别是对于需要使用 Python 和 SQLite 数据库的场景。特点是深度学习教程、Python、SQLite 数据库。 d2l-en 项目地址: https://gitcode.com/gh_mirrors/d2/d2l-en

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶准鑫Natalie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值