1. 为什么我们需要范数?
第一次接触范数这个概念是在研究生阶段的线性代数课上。当时教授在黑板上写下"||x||"这个符号时,我完全不明白这几个竖线能有什么实际用途。直到后来做机器学习项目时,我才真正体会到范数的重要性。
范数本质上是一种衡量向量或矩阵"大小"的工具。想象一下,你手里有一堆数字,怎么判断这堆数字整体上是大还是小?直接把所有数加起来?那正负数会相互抵消。取绝对值相加?这就是L1范数的思想。取平方和再开根号?这就是L2范数的思路。
在实际工程中,范数最常见的三个用途是:
- 正则化:防止模型过拟合。比如在损失函数中加入L2范数惩罚项(权重衰减),可以让参数值不至于过大。
- 误差衡量:比较两个向量的差异。比如在回归任务中,用L2范数计算预测值和真实值的距离(MSE)。
- 矩阵分析:通过核范数进行低秩矩阵分解,这在推荐系统中非常有用。
python复制import torch
# 简单的L2正则化示例
weights = torch.randn(10, requires_grad=True)
loss = ... # 原始损失函数
l2_lambda = 0.01
regularization = l2_lambda * torch.linalg.norm(weights, ord=2)
total_loss = loss + regularization
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 常见范数类型详解
2.1 L1范数:稀疏性的秘密武器
L1范数也叫曼哈顿距离,计算方式很简单:所有元素绝对值之和。我第一次用它是在特征选择任务中,发现它能产生稀疏解——也就是让很多参数直接变成0。
数学定义:
对于向量x ∈ ℝⁿ:
||x||₁ = Σ|xᵢ|
对于矩阵A ∈ ℝᵐˣⁿ:
||A||₁ = max(Σ|aᵢⱼ| over columns)
python复制# PyTorch计算L1范数
x = torch.tensor([1., -2, 3])
l1_norm = torch.linalg.norm(x, ord=1) # 输出6.0
A = torch.tensor([[1, 2], [3, 4]])
matrix_l1 = torch.linalg.norm(A, ord=1)
