权重衰减(weight decay)与L2正则化

本文深入解析了权重衰减(L2正则化)的概念,包括其如何通过减小权重来防止模型过拟合,以及在随机梯度下降中权重更新的具体公式。同时,探讨了L2正则化为何能有效降低模型复杂度,避免过拟合现象。

1. 权重衰减(weight decay)

L2正则化的目的就是为了让权重衰减到更小的值,在一定程度上减少模型过拟合的问题,所以权重衰减也叫L2正则化。

1.1 L2正则化与权重衰减系数

L2正则化就是在代价函数后面再加上一个正则化项:

其中C0代表原始的代价函数,后面那一项就是L2正则化项,它是这样来的:所有参数w的平方的和,除以训练集的样本大小n。λ就是正则项系数,权衡正则项与C0项的比重。另外还有一个系数1/2,1/2 1/211经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个2,与1/2相乘刚好凑整为1。系数λ就是权重衰减系数。

1.2 为什么可以对权重进行衰减

我们对加入L2正则化后的代价函数进行推导,先求导:

可以发现L2正则化项对b的更新没有影响,但是对于w的更新有影响:

在不使用L2正则化时,求导结果中w前系数为1,现在w前面系数为1-ηλ/n,因为η、λ、n都是正的,所以1-ηλ/n小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,w最终的值可能增大也可能减小。
另外,需要提一下,对于基于mini-batch的随机梯度下降,w和b更新的公式跟上面给出的有点不同:


对比上面w的更新公式,可以发现后面那一项变了,变成所有导数加和,乘以η再除以m,m是一个mini-batch中样本的个数。

1.3 权重衰减(L2正则化)的作用

作用:权重衰减(L2正则化)可以避免模型过拟合问题。
思考:L2正则化项有让w变小的效果,但是为什么w变小可以防止过拟合呢?
原理:(1)从模型的复杂度上解释:更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合更好(这个法则也叫做奥卡姆剃刀),而在实际应用中,也验证了这一点,L2正则化的效果往往好于未经正则化的效果。(2)从数学方面的解释:过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。

 

 

参考文献:

  1. https://blog.youkuaiyun.com/program_developer/article/details/80867468
**Weight Decay L2 正则化在数学上是等价的**,尤其是在使用随机梯度下降(SGD)优化器的情况下。下面我们从数学角度详细解释它们的关系。 --- ### 1. L2 正则化的定义 L2 正则化是通过在原始损失函数 $ \mathcal{L} $ 上添加一个权重的平方和惩罚项来实现的: $$ \mathcal{L}_{\text{total}} = \mathcal{L}(\theta) + \frac{\lambda}{2} \sum_{i} \theta_i^2 $$ 其中: - $ \mathcal{L}(\theta) $:原始损失函数(如交叉熵、均方误差等) - $ \theta_i $:模型参数(权重) - $ \lambda $:正则化系数,控制惩罚强度 对这个总损失求导得: $$ \nabla_\theta \mathcal{L}_{\text{total}} = \nabla_\theta \mathcal{L} + \lambda \theta $$ 所以在参数更新时(以 SGD 为例): $$ \theta \leftarrow \theta - \eta \nabla_\theta \mathcal{L} - \eta \lambda \theta = (1 - \eta \lambda)\theta - \eta \nabla_\theta \mathcal{L} $$ > 这里的关键是:**每次更新都会让权重乘以一个小于 1 的因子 $(1 - \eta \lambda)$,即“衰减”了权重本身**。 --- ### 2. Weight Decay 的定义 Weight Decay 是一种直接在参数更新阶段施加的操作,其更新规则为: $$ \theta \leftarrow \theta - \eta \nabla_\theta \mathcal{L} - \eta \lambda \theta $$ 这正是上面 L2 正则化推导出的结果! 也就是说,在标准 SGD 中: > **L2 正则化Weight Decay** --- ### 3. 在 Adam 等自适应优化器中的区别 但在 **Adam、AdamW** 等更复杂的优化器中,这种等价性不再严格成立。 #### 原因: 在 Adam 中,梯度被标准化(动量 + 自适应学习率),所以如果你把 L2 惩罚加到损失中: ```python loss = criterion(output, target) + (lambd / 2) * sum((p ** 2).sum() for p in model.parameters()) ``` 那么这个惩罚项也会进入梯度估计,并受到自适应缩放的影响 —— 这可能导致 weight decay 效果不稳定或偏离预期。 而 `weight_decay` 参数是在优化步骤中**单独处理的**,不参梯度计算。 --- ### 4. PyTorch 中的区别示例 #### 使用传统 L2 正则化(不推荐用于 Adam): ```python optimizer = torch.optim.Adam(model.parameters(), lr=0.001) loss = criterion(output, target) l2_lambda = 1e-4 l2_reg = sum((p ** 2).sum() for p in model.parameters()) loss += l2_lambda * l2_reg loss.backward() optimizer.step() ``` #### 使用内置 weight_decay(推荐): ```python optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-4) # 自动应用 weight decay,且行为更干净 loss = criterion(output, target) loss.backward() optimizer.step() ``` ⚠️ 注意:对于 Adam,这样设置 `weight_decay` 并不完全等同于 L2 正则化 —— 它只是模仿了 SGD 中 weight decay 的形式。 --- ### 5. 更优选择:AdamW 为了解决这个问题,**AdamW** 被提出,它明确将 weight decay 梯度更新分离,真正实现了“权重衰减”的语义。 ```python optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=1e-4) ``` ✅ 在 AdamW 中,weight decay 才真正对应理论上的 L2 正则化效果。 --- ### 总结 | 方法 | 数学形式 | 是否等价于 L2 正则化 | 适用场景 | |------|---------|------------------------|----------| | L2 正则化(加在 loss 上) | $\mathcal{L} + \frac{\lambda}{2}\|\theta\|^2$ | ✅ 仅在 SGD 下成立 | 不推荐用于 Adam | | Weight Decay(优化器参数) | $\theta \gets \theta - \eta g - \eta\lambda\theta$ | ❌ 在 Adam 中不完全等价 | 推荐搭配 AdamW 使用 | | AdamW + weight_decay | 显式解耦 weight decay | ✅ 理论一致 | 推荐现代训练首选 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值