别再死记硬背了用PyTorch的torch.linalg.norm函数5分钟搞懂L1、L2、Frobenius范数区别刚接触机器学习时面对各种范数概念你是否也经历过这样的困惑L1和L2到底有什么区别为什么正则化时有时用L1有时用L2矩阵的Frobenius范数又是什么今天我们就用PyTorch的torch.linalg.norm函数通过实际代码演示帮你快速建立直观理解。1. 范数基础从几何直观到代码实现范数本质上是衡量向量或矩阵大小的一种方式。想象你在一座城市中L1范数就像在曼哈顿街区行走只能沿着街道直角转弯距离是各段路程的绝对值之和L2范数则是直线距离也就是我们常说的欧几里得距离Frobenius范数可以看作矩阵所有元素的平方和开根号是L2范数在矩阵上的扩展在PyTorch中torch.linalg.norm函数的基本用法如下import torch # 向量范数 v torch.tensor([1., 2., 3.]) l1_norm torch.linalg.norm(v, ord1) # L1范数 l2_norm torch.linalg.norm(v, ord2) # L2范数 # 矩阵范数 M torch.tensor([[1., 2.], [3., 4.]]) fro_norm torch.linalg.norm(M, ordfro) # Frobenius范数2. L1范数稀疏性的秘密武器L1范数定义为向量元素的绝对值之和。它的独特之处在于能够产生稀疏解这在特征选择中特别有用。典型应用场景特征选择LASSO回归压缩感知异常检测# L1范数计算示例 x torch.tensor([1., -2., 0.5]) l1 torch.linalg.norm(x, ord1) # 结果为3.5 (1 2 0.5) # L1正则化效果对比 def l1_regularization(params, alpha): return alpha * torch.linalg.norm(params, ord1)L1范数的一个有趣特性是它在原点处不可导这使得优化过程中参数容易变为0从而实现特征选择的效果。3. L2范数防止过拟合的经典选择L2范数就是我们熟悉的欧几里得距离定义为向量元素的平方和开平方。它倾向于让所有参数都较小而不是直接归零。典型应用场景权重衰减岭回归支持向量机神经网络正则化# L2范数计算示例 x torch.tensor([3., 4.]) l2 torch.linalg.norm(x, ord2) # 结果为5.0 (√(3² 4²)) # L2正则化实现 def l2_regularization(params, alpha): return alpha * torch.linalg.norm(params, ord2)**2L2范数的一个关键优势是它在数学上处理起来更方便因为处处可导这使得基于梯度的优化算法能够高效工作。4. Frobenius范数矩阵的整体度量Frobenius范数是矩阵所有元素平方和的开方可以看作是将矩阵展平为向量后的L2范数。典型应用场景矩阵近似推荐系统矩阵分解评估# Frobenius范数计算 A torch.tensor([[1., 2.], [3., 4.]]) fro_norm torch.linalg.norm(A, ordfro) # √(1² 2² 3² 4²) ≈ 5.477 # 矩阵相似度比较 def matrix_similarity(A, B): return torch.linalg.norm(A - B, ordfro)Frobenius范数与矩阵的奇异值有直接关系它等于所有奇异值平方和的开方。这个性质在矩阵分解和降维中非常有用。5. 实战对比不同范数的可视化效果为了更直观地理解这些范数的区别我们来看一个正则化效果的对比实验import matplotlib.pyplot as plt # 生成模拟数据 torch.manual_seed(42) X torch.randn(100, 10) true_weights torch.tensor([1., 0., 0., -1., 0., 0., 0.5, 0., 0., -0.5]) y X true_weights 0.1 * torch.randn(100) # 训练函数 def train_with_regularization(ord, alpha): weights torch.zeros(10, requires_gradTrue) optimizer torch.optim.SGD([weights], lr0.01) for _ in range(1000): pred X weights loss torch.mean((pred - y)**2) if ord 1: loss alpha * torch.linalg.norm(weights, ord1) else: loss alpha * torch.linalg.norm(weights, ord2)**2 optimizer.zero_grad() loss.backward() optimizer.step() return weights.detach() # 比较结果 l1_weights train_with_regularization(1, 0.1) l2_weights train_with_regularization(2, 0.1) plt.figure(figsize(10, 4)) plt.subplot(1, 2, 1) plt.stem(l1_weights.numpy(), use_line_collectionTrue) plt.title(L1正则化结果) plt.subplot(1, 2, 2) plt.stem(l2_weights.numpy(), use_line_collectionTrue) plt.title(L2正则化结果) plt.tight_layout() plt.show()这个实验清晰地展示了L1正则化确实产生了稀疏解将不重要的特征权重压缩为0L2正则化则使所有权重都均匀缩小但没有完全归零