当前位置: 首页 > news >正文

l2正则化项以及torch.norm

非常好,这段代码是一个非常典型的 L2 正则化(L2 Regularization) 的实现例子。
我们来一步步讲清楚它的作用、为什么写成这样,以及 torch.norm(param, p=2) 的意义。


一、先看这段代码在干什么

# 手动计算 L2 正则化项并加到总损失中
l2_reg = 0
for param in model.parameters():l2_reg += torch.norm(param, p=2)   # 计算每个参数的 L2 范数(即平方和的平方根)# 最终损失 = 原始损失 + L2 正则化项
total_loss = loss + l2_lambda * l2_reg

这段代码的逻辑是:

  1. 遍历模型的所有参数;
  2. 计算每个参数张量的 L2 范数(即权重的平方和开方)
  3. 把所有参数的 L2 范数加起来,得到正则项;
  4. 把它乘以一个超参数 l2_lambda(正则化系数);
  5. 最后与原始 loss 相加,形成新的总损失 total_loss

二、为什么要写 torch.norm(param, p=2)

torch.norm 是计算张量的范数(norm)的函数。

常用形式:

torch.norm(tensor, p=2)

表示计算 L2 范数,即:

\[||W||_2 = \sqrt{\sum_i W_i^2} \]

举个例子:

import torch
w = torch.tensor([3.0, 4.0])
torch.norm(w, p=2)  # = sqrt(3² + 4²) = 5

在机器学习里,我们并不是单纯想知道权重有多大,而是希望:

在损失函数中惩罚权重过大的情况,防止模型过拟合。

于是我们把这个 L2 范数作为惩罚项加入总损失里。


三、为什么要加 L2 正则化项?

这是为了防止模型过拟合(overfitting)

原始损失(如交叉熵)只关注“模型预测得对不对”;
但我们希望模型的参数也“不要太极端”(太大、太尖锐)。

所以我们加入一项惩罚:

\[Loss*{total} = Loss*{original} + \lambda \sum_i w_i^2 \]

其中 (\lambda) 是权重衰减系数,控制惩罚力度。

它的意义是:

  • 如果权重过大 → 惩罚项大 → 让优化器“缩小”权重;
  • 如果权重适中 → 惩罚项小 → 不影响原始损失。

这相当于告诉模型:

“别太依赖某个特征,保持整体权重平衡。”


四、L2 正则化的数学形式

从数学上讲,
L2 正则化项是:

\[\text{Regularization} = \frac{\lambda}{2} \sum_{i} w_i^2 \]

而 PyTorch 的 torch.norm(param, p=2) 返回的是:

\[||W||_2 = \sqrt{\sum_i w_i^2} \]

通常我们会用平方形式(不取平方根),即:

\[||W||_2^2 = \sum_i w_i^2 \]

如果你想完全对应公式,可以改成:

l2_reg += torch.norm(param, p=2) ** 2

这样结果是 L2 范数平方,更严格地符合理论定义。


五、它和 weight_decay 的关系

其实你不用手动写这段代码也可以实现同样效果。
在 PyTorch 的优化器中,比如 Adam、SGD,都有一个参数叫:

optimizer = torch.optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-4)

weight_decay 本质上就是在每次梯度更新时加上一个 L2 正则项(权重衰减项),
等价于你手动加的这一段。

手动写通常是为了:

  • 控制哪些层加正则、哪些不加;
  • 或者在复杂损失中单独调整正则项权重。

六、总结一句话

torch.norm(param, p=2) 是在计算参数张量的 L2 范数(权重平方和的平方根)
它作为惩罚项加入总损失中,起到限制模型复杂度、防止过拟合的作用。


✅ 结构化总结:

部分 含义
torch.norm(param, p=2) 计算每个参数的 L2 范数
l2_reg += ... 累加所有参数的范数
total_loss = loss + λ * l2_reg 在总损失中加上正则惩罚
目的 抑制权重过大、防止过拟合
对应公式 ( \mathcal{L}{total} = \mathcal{L} + \lambda \sum_i w_i^2 )

http://www.zskr.cn/news/24699.html

相关文章:

  • SP4191 天空代码 分析
  • [KaibaMath]1013 关于收敛数列保不等式性的证明
  • 什么是命运(摘抄)
  • ZXK传
  • 螺纹钢的中线节奏
  • KL散度
  • 随便记
  • [fastgrind] 一个轻量级C++内存监控及可视化开源库
  • Appium 3.0:跨平台移动自动化测试框架全面解析
  • 德国州政府全面弃用微软办公套件,改用开源方案
  • [KaibaMath]1011 关于收敛数列保号性的证明
  • 塔吊施工人员操作合规性监测!思通数科 AI 卫士实时守护作业安全
  • 题解:P1073 [NOIP 2009 提高组] 最优贸易
  • 吩咐
  • 互评五
  • C++ std::forwardT 的使用
  • Agilent E363x 系列
  • 迈向零信任存储:基于RustFS构建内生安全的数据架构
  • 得到的眼泪学会了哭泣 得到的悲伤缓慢摧残肉体 被所爱之人踩在地
  • 框架架构的多维赋能——论其对自然语言处理深层语义分析的影响与启示
  • 路径规划算法学习Day1:深度优先搜索算法(DFS)
  • 顺天地之自然
  • 详细介绍:Vue Router路由
  • 《青云志》
  • AVR 单片机批量编程脚本(.bat)
  • 软工问题总结10.19
  • tryhackme-预安全-网络基础知识-OSI模型-06
  • AI元人文构想研究:理论溯源、跨学科审视与技术路径探析
  • NPM(更新中)
  • 使用DAO模式改造学生信息管理系统