范数
一句话版
范数 = “量大小的尺子”。 它把一个向量或矩阵,变成一个非负数,表示“有多大/多长”。有了这把尺子,才能谈“谁更近、谁更远、会不会爆炸、要不要缩小一点”。
范数到底在量什么?
想象你有一根箭头(向量)。你想回答:
- 这根箭头有多长?(大小)
- 两个箭头差多远?(距离)
- 一个“变换”(矩阵)会把箭头拉长几倍?(放大/稳定性)
范数就是专门给这些问题用的“统一尺子”。不同范数 = 不同量法,但都要满足几条基本常识: 不为负、只有零的长度是 0、放大几倍长度也跟着几倍、两段合在一起不会比各自长度之和还短(这就是三角不等式的直白版)。
最常用的三把“尺子”(向量)
- L2 范数(最像直线距离):把每一维的数“ 平方后累加再开方”。 直觉:平均地看整体大小,大数会被更重地惩罚。
- L1 范数(绝对值相加):把每一维的“绝对值”都加起来。 直觉:温和地看整体大小,对“少数很大的值”没那么敏感。
- L∞ 范数(最大值):只看“最大的那一维”。 直觉:最坏分量有多大。
形状直觉(在二维): L2 的“单位圈”是圆;L1 是菱形;L∞ 是正方形。就是不同的量法。
矩阵怎么量?
- Frobenius 范数:把矩阵当“大号多维数组”,所有元素平方相加再开方。直觉:整体有多大。
- 谱范数(最大奇异值):表示这个矩阵把向量最多能拉长几倍。直觉:最狠的放大量 → 跟稳定性、数值爆炸相关。
直白的小例子
向量 x = [3, -4]:
- L2:大约 5(你会把它当“长度”)
- L1:7(更“数值相加”的感觉)
- L∞:4(只在意最大的那一维)
**你要哪把尺子?**看你在意什么: 整体平滑 → L2; 对离群点稳一点/想要稀疏 → L1; 只关心最坏的一维 → L∞。
范数正则是啥?为啥要用?
范数正则 = 在训练里给参数大小“上枷锁”。 做法:在损失函数后面 + 一个“范数罚分”。 目的:不让参数(权重)无限做大,防过拟合、更稳、更好泛化。
最常见两种:
1) L2 正则(权重衰减/weight decay)
- 惩罚 “整体都大” 的参数。
- 效果:让权重整体变小、变平滑;通常不把权重推到 0,但会“缩小一圈”。
- 直觉:像给每个参数拴了橡皮筋,拉远了会被拽回来一点。
2) L1 正则(稀疏)
- 惩罚 “有很多非零” 的参数。
- 效果:会把很多小权重直接压到 0 → 稀疏(等于自动做特征选择)。
- 直觉:像扫地,把小的灰尘(小参数)直接清掉。
什么时候用哪种?
- 默认想稳、想平滑:L2。
- 想让模型更简单、特征更少、可解释:L1。
- 有时两者混用(Elastic Net):既稳又稀疏。
放到训练里怎么理解(超直观)
- 没正则:模型只关心“训练误差最小”,容易记住训练集细节 → 过拟合。
- 加 L2:模型在“误差小”和“参数别太大”之间折中 → 更平滑、不易炸。
- 加 L1:模型在“误差小”和“参数大多为 0”之间折中 → 更简单、很多权重消失。
一句话收尾
- 范数:量大小的不同“尺子”(L2 看整体、L1 看总量且促稀疏、L∞ 看最坏)。
- 范数正则:在训练里给“大小”设约束,防止模型长得又大又复杂,提升稳健和泛化。
如果你愿意,我可以用你的一小段 PyTorch 代码,现场加一行 L2 或 L1 正则,并打印训练前后参数大小(范数)对比,直觉就更强了。