深入理解D2L项目中的权重衰减技术
引言
在机器学习中,过拟合是一个常见且棘手的问题。当模型在训练数据上表现优异但在新数据上表现不佳时,我们就遇到了过拟合。权重衰减(Weight Decay)是一种简单而有效的正则化技术,它通过限制模型参数的大小来防止过拟合。本文将深入探讨权重衰减的原理、实现方式及其在深度学习中的应用。
权重衰减的基本原理
什么是权重衰减?
权重衰减,也称为L2正则化,是一种通过向损失函数添加惩罚项来限制模型参数大小的技术。其核心思想是:在最小化原始损失函数的同时,也尽量保持权重参数的数值较小。
为什么权重衰减能防止过拟合?
- 限制模型复杂度:较大的权重通常意味着模型对输入变化更敏感,可能导致过拟合
- 促进参数平滑:权重衰减倾向于让所有特征都有相对均衡的贡献,而不是让少数特征主导预测
- 数值稳定性:较小的权重有助于保持数值计算的稳定性
数学表达
考虑线性回归的损失函数:
$$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))
关键点:
l2_penalty
函数计算权重向量的L2范数平方的一半- 新的损失函数包含原始损失和正则化项
- 超参数
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正则化
-
L2正则化(权重衰减):
- 倾向于均匀分布权重
- 产生平滑的决策边界
- 计算梯度简单
-
L1正则化(Lasso):
- 倾向于产生稀疏解(许多权重为0)
- 自动执行特征选择
- 对异常值更鲁棒
权重衰减与优化
在SGD更新中,权重衰减表现为:
$$\mathbf{w} \leftarrow (1-\eta\lambda)\mathbf{w} - \eta\nabla L(\mathbf{w})$$
这相当于在每一步都先将权重缩小一点,再沿着梯度方向更新。
实践建议
- 偏差项通常不正则化:只对权重参数应用权重衰减
- 分层设置:不同层可以使用不同的衰减强度
- 与其他正则化结合:如Dropout、数据增强等
- 超参数调优:通过验证集选择合适的$\lambda$值
总结
权重衰减是一种简单而强大的正则化技术,通过限制模型参数的大小来防止过拟合。本文从原理到实现详细介绍了权重衰减:
- 解释了权重衰减如何通过L2惩罚项控制模型复杂度
- 展示了从零实现和使用框架内置功能的两种方式
- 通过实验验证了权重衰减对过拟合的改善效果
- 讨论了权重衰减与其他技术的比较和实践建议
权重衰减是深度学习工具箱中的基础技术,理解其原理和实现对于构建泛化能力强的模型至关重要。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考