L1、L2正则化理论与实践
源于网络上很多资料估计自己都没弄懂,不如自己总结一篇。
正则化理论
网络上流传着一张图:
所以,他到底是什么意思?你需要从损失函数开始理解。
损失函数投影
对于一个平方损失函数,容易写出他的形式:
对于一个简单的场景,比如只有两个参数 w1 w1, 整理后,他是一个二次型:
对于一个简化后的二次型:
我们可以查看他的三维表示:
对于相同的损失函数值,即假设 z = C 截取了某个二维平面,在这个平面与损失函数的交线就是等高线,表示在这个线上损失函数值相同
同理,我们可以画出多个等高线,同时梯度下降的本质就是尽量朝着圆心出发
L1、L2区别
为什么正则化能限制范围
此时我们已经有了损失函数在二维平面上的基础表示,我们也知道 loss 下降实质是外围等高线向内部出发。那对于 L1、L2 又是如何对 loss 的下降过程进行约束?
权重变化
如果认为少数参数核心作用,可以使用 L1,多数参数有效,使用 L2,为何?
Pytorch中的正则化
import torch
import torch.nn as nn
# 定义模型
class Net(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(100, 1)
def forward(self, x):
return self.fc(x)
model = Net()
criterion = nn.MSELoss()
lambda_l1 = 0.01 # 正则化强度
# 手动添加L1正则项
def l1_loss(model):
return sum(p.abs().sum() for p in model.parameters() if p.requires_grad)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
for input, target in dataloader:
output = model(input)
loss = criterion(output, target) + lambda_l1 * l1_loss(model)
optimizer.zero_grad()
loss.backward()
optimizer.step()
或者
# 等价于L2正则化:loss = L0 + λ/2 ∑w²
optimizer = torch.optim.AdamW(
model.parameters(),
lr=0.01,
weight_decay=0.01 # 对应λ
)
手动添加 L2 项时,lambda 需乘以 2(因公式中的 1/2),而weight_decay直接对应 λ,无需调整。
与权重衰减的区别
数学等价:L2 正则化的梯度为 ,权重衰减的更新公式为 ,本质相同。
实现差异: 手动 L2:正则项随损失函数反向传播,计算图包含正则项。 weight_decay:直接在优化器中修改参数,不经过损失函数(更高效,不影响梯度统计)。 适用场景:深度模型优先用weight_decay(如 Transformer 标配),需精细控制特定层时用显式正则项。