☰
机器学习中的范数:从L1、L2到谱范数的选型指南
2026/9/26 15:18:46 网站建设 项目流程

搞机器学习和数值计算的人,几乎天天跟“范数”打交道。1-范数、2-范数、∞-范数这些向量范数,以及F-范数、谱范数等矩阵范数,表面看只是一堆公式,实际上决定了模型训练、误差分析、条件数估计和正则化设计的底层逻辑。这篇文章就从一个从业者的视角,把范数的来龙去脉、计算方法和选型经验讲清楚,希望能帮你少走弯路。

1. 范数是什么:从“长度”到“度量”

1.1 从几何长度到抽象范数

中学里我们算向量 (3,4) 的长度,得到 5,这其实就是 2-范数。可一旦进入优化、矩阵分析和机器学习,“长度”就不能只靠勾股定理了。比如在推荐系统里,用户向量的每个维度是不同打分,有的维度有缺失,有的维度是离群值,你可能会更关心“绝对偏差之和”,而不是平方和。这时候就需要把“长度”这个概念泛化。范数就是这样一个泛化的长度函数:它接收一个向量或矩阵,输出一个非负实数,用来衡量这个对象的大小。

很多人一开始不理解,为什么同一个向量会有好几种“长度”?这就像同一座城市,你可以问直线距离,也可以问开车的最短路线,还可以问最堵的一条路要花多久。度量方式不同,回答的侧重点就不同。范数家族里每一个成员,都是在回答一个特定视角下的“有多大”问题。只有先明确你要度量的是哪一种“大小”,范数才真正有用。

1.2 范数必须遵守的三条公理

数学上,向量空间上的范数必须满足三条公理:

  1. 非负性:||x|| ≥ 0,且 ||x|| = 0 当且仅当 x = 0;
  2. 齐次性:||αx|| = |α| · ||x||;
  3. 三角不等式:||x + y|| ≤ ||x|| + ||y||。

这三条不是随便定的。非负性保证“大小”有意义;齐次性保证把向量放大 α 倍,长度也会精确放大 |α| 倍;三角不等式则是距离定义的基础,也是证明收敛性、唯一性和误差传播不等式的前提。

很多看起来像范数的函数,其实并不满足这些条件。举个简单例子,定义 f(x) = max(x_i),只取分量最大值。如果 x 全是正数,看起来没问题;但把 x 乘上一个负数后,齐次性直接被破坏,因为 max 不会等比例缩放到负数。我见过不少初学者在自定义损失函数时,随手把一个“部分最大”当范数用,结果优化目标在不同尺度下表现不一致,损失曲线反复震荡。排查到最后,问题往往就出在公理没有逐条验证上。

2. 三类最常用的向量范数

2.1 1-范数:绝对值之和与曼哈顿距离

1-范数的定义是||x||_1 = Σ|x_i|,也就是把每个分量的绝对值加起来。直观上它度量的是曼哈顿距离:从原点出发,只能沿着坐标轴方向走,经过的最短路径长度。在二维平面上,集合|x| + |y| = 1是一个菱形,四个顶点恰好落在坐标轴上。

为什么 L1 在机器学习里这么重要?因为它天然诱导稀疏性。想象一下,损失函数的等高线是一圈一圈的椭圆,正则化约束要求参数落在一个“球”内。L1 的单位球是带尖角的菱形,当椭圆边界和菱形相交时,切点更容易出现在坐标轴的尖角上,这意味着解中有一部分参数精确等于零。Lasso 回归用 L1 正则化,就是为了在上万维特征里挑出真正有用的少数特征。

从优化角度看,1-范数在零点不可导,因为|x_i|在 0 处左右导数不同。做梯度下降时,对|x_i|求导,除了零点外都是sign(x_i),零点需要专门处理,一般用次梯度或者软阈值操作。这里有个非常常见的坑:自己写 L1 正则化代码时,忘记处理零点的次梯度,训练过程会飘,loss 在后期来回跳。解决方法是明确在每个元素上使用sign(x)的次梯度,或者干脆用近端梯度法。

2.2 2-范数:欧几里得长度与最小二乘

2-范数的定义是||x||_2 = sqrt(Σx_i²),也就是最熟悉的欧氏距离。二维单位球是标准圆,高维单位球是超球面。它最突出的性质是旋转不变性:对向量做任意正交变换,2-范数不改变。因此最小二乘、PCA、白化处理等经典算法,几乎都默认使用 2-范数。

2-范数还有一个常被忽略的可微性细节。||x||_2本身在 x=0 处不可导,因为sqrt在 0 附近的切线是竖直的。但平方 2-范数||x||_2² = Σx_i²处处可导,梯度恰好是2x,形式非常简单。所以做优化时,我们经常用的是平方 L2,而不是 L2 本身。Ridge 回归里的正则项写的是||w||₂²,就是这个原因。

很多初学者误以为 L2 也会产生稀疏解,其实不会。L2 只是把权重整体按比例缩小,并不会把某一项精确变成零。如果做特征选择,L2 不是好工具;但如果你只想要一个稳定、不易过拟合的模型,L2 比 L1 更温和,梯度行为也更好。两种范数解决的是不同问题,不能互相替代。

2.3 ∞-范数:最大绝对值与最坏情况

∞-范数的定义是||x||_∞ = max_i |x_i|,也叫切比雪夫范数。它的单位球是正方形(二维)或超立方体(高维)。它衡量的不是整体大小,而是最大分量带来的最坏情况。在鲁棒优化、区间分析和对抗样本研究中,这个视角特别有用。

举个例子,假设一个预测系统的输出向量里,每个分量是一个传感器读数。你想知道系统在最坏情况下偏差多大,用 ∞-范数比用 2-范数更直观:2-范数会被其他小分量稀释,而 ∞-范数直接盯住最大误差。研究对抗样本时,很多攻击算法用 ∞-范数约束扰动幅度,因为一张图片每个像素改动很小,但整体最大扰动不超过某个阈值,这样生成的扰动在视觉上几乎无差别,却能骗过模型。

计算 ∞-范数非常便宜:先对所有分量取绝对值,再取最大值,复杂度只有 O(n)。它的缺点是忽略其他分量,在需要“整体大小”的场景里会显得过于粗糙。做范数选型时,本质是在回答“我到底关心平均值、能量还是最坏情况”,没有一个范数是绝对万能的。

2.4 从 p-范数看统一视角

把 1、2、∞ 三种向量范数统一起来,就是 p-范数:||x||_p = (Σ|x_i|^p)^(1/p)。p=1 时是 L1,p=2 时是 L2,p→∞ 时,最大绝对值项会主导整个求和,极限就是 ∞-范数。p 越大,范数越强调大分量;p 越小,各个分量对结果的贡献越平均。

这个统一视角有一个实用价值:理解有限维空间里范数等价性。对 n 维向量,存在常数 c1、c2,使得c1||x||_b ≤ ||x||_a ≤ c2||x||_b对所有范数 a、b 都成立。具体到常用组合,有||x||_∞ ≤ ||x||_2 ≤ sqrt(n)||x||_∞,以及||x||_2 ≤ ||x||_1 ≤ sqrt(n)||x||_2。这些不等式在做误差估计时非常有用,因为它们允许你从一种范数下的误差界,直接换算成另一种范数下的误差界,只多一个与维度相关的缩放因子。

3. 矩阵范数:不只是“把矩阵拉成向量”

3.1 为什么矩阵范数要单独定义

矩阵当然可以拉成向量,然后直接算向量范数,比如把所有元素平方和开根号。但这样做丢掉了矩阵作为线性变换的乘法结构。在数值线性代数里,我们更需要知道的是:这个矩阵作为变换,最多能把一个向量放大多少倍?

因此引入了诱导范数(operator norm):||A|| = max_{x≠0} ||Ax|| / ||x||。它可以理解成矩阵 A 对单位向量的最大拉伸倍数。这种定义的直接价值是给出一个无条件成立的不等式:对任意向量 x,都有||Ax|| ≤ ||A|| · ||x||。这就是相容性条件,是推导误差传播公式的基石。

举个例子,已知线性系统 Ax=b 中,输入 b 有扰动 δb,那么解 x 的扰动 δx 满足||δx|| ≤ ||A^{-1}|| · ||δb||。要进一步估计误差,就需要用到矩阵乘法范数不等式||AB|| ≤ ||A|| · ||B||。诱导范数天然满足这个次乘性,而随随便便定义的矩阵“长度”不一定具备这个性质。很多自制的矩阵范数之所以在误差分析里失效,就是缺了次乘性。

3.2 常用诱导矩阵范数:列和、行和与谱范数

三种最常用的诱导范数,分别由向量的 1、∞、2 范数诱导出来:

矩阵范数对应向量范数计算公式直观含义
矩阵1-范数向量1-范数`max_j Σ_ia_ij
矩阵∞-范数向量∞-范数`max_i Σ_ja_ij
矩阵2-范数向量2-范数sqrt(λ_max(A^T A))最大奇异值,又叫谱范数

为什么矩阵 1-范数是最大列和?从诱导定义出发,要让||Ax||_1 / ||x||_1最大,最有利的输入 x 会退化成某个坐标轴方向的单位向量,这时 Ax 正好是 A 的一列,取绝对值求和后,在所有列里挑最大的那个。矩阵 ∞-范数对应最大行和,推导思路类似。谱范数则需要借助奇异值分解,它度量的是在所有方向上最大的伸缩比例,物理意义最直观。

这里有一个特别容易混淆的点:矩阵 ∞-范数是最大行和,而不是元素最大绝对值。很多新手看到“∞”就以为是取最大绝对值,实际上max|a_ij|这个量连基本次乘性都不满足,容易在误差传播分析里给出错误结论。写代码和论文之前,必须先明确自己用的是哪一种矩阵范数。

3.3 F-范数:元素层面的欧氏长度

F-范数(Frobenius 范数)定义是||A||_F = sqrt(Σ|a_ij|²),也就是所有元素平方和再开根号。它等价于把矩阵当成一个长向量算 2-范数。优点是计算简单、处处可微,因此非常适合做优化目标。矩阵补全、低秩分解、神经网络的权重衰减,很多都默认用 F-范数。

但要注意,F-范数不是诱导范数。它不回答“矩阵最多把向量放大多少倍”,而回答“矩阵所有元素加起来的能量有多大”。不过 F-范数和谱范数之间有明确的不等式:||A||_2 ≤ ||A||_F ≤ sqrt(r) ||A||_2,其中 r 是矩阵的秩。也就是说,谱范数是 F-范数的下界,F-范数不会比谱范数小。

F-范数同样满足次乘性||AB||_F ≤ ||A||_F ||B||_F,这让它在级数收敛、矩阵指数等分析里也很有用。但由于它不是诱导范数,不能用它直接定义“最大拉伸倍数”。在我的经验里,F-范数适合做算法设计,谱范数适合做理论分析,两者经常配合着用。

3.4 谱范数与奇异值分解的关系

谱范数等于矩阵最大的奇异值。借助奇异值分解A = UΣV^T,其中 U、V 是正交矩阵,Σ 是对角矩阵,对角线元素 σ_i 是奇异值,且是非负数。因为正交变换不改变 F-范数,所以||A||_F = ||Σ||_F = sqrt(Σσ_i²);而谱范数同样因为正交不变性,恰好等于最大的奇异值σ_max。

这个关系在低秩近似里至关重要。Eckart–Young 定理说:要在 F-范数下用秩为 k 的矩阵逼近 A,最优解就是把最小的那些奇异值直接截断为零,逼近误差的平方等于被截断奇异值的平方和。在谱范数下,最优逼近误差则是最小的被截断奇异值 σ_{k+1}。换句话说,奇异值衰减越快,低秩近似越有效;如果奇异值衰减很慢,低秩逼近就注定效果有限。

实操中,求一个中小规模矩阵的谱范数,我直接调用 SVD;对大规模稀疏矩阵,则需要用幂迭代或 Lanczos 方法求最大奇异值,避免显式构造 A^T A。因为 A^T A 的条件数是 A 的条件数平方,数值上极度不稳定,这在后面会详细说。

4. 范数的等价性、正则化与条件数

4.1 有限维空间里的范数等价定理

在有限维线性空间里,任意两个范数都是等价的:存在正数 c1、c2,使得c1||x||_b ≤ ||x||_a ≤ c2||x||_b对一切 x 成立。这个结论可以理解为,不同范数虽然看起来差很多,但“互相之间不会被拉开无限远”。一个直接的推论是:在一个范数下收敛的序列,在任意范数下都收敛,有限维空间里的收敛性不依赖于范数选择。

但等价并不意味着可以随便换。等价常数与维度 n 密切相关,比如||x||_2 ≤ ||x||_1 ≤ sqrt(n)||x||_2,当 n 很大时,上界会变得非常大。高维数据里,同一组向量用 1-范数和 2-范数度量,数值可能差出几个数量级。做误差分析时,如果忽略等价常数,往往会得到看似严谨实际完全失真的界。

范数等价性还解释了为什么换一种正则化会改变解结构。收敛性不变是拓扑层面的,最优点、稀疏性、可微性这些几何属性却会随范数变化。这也是 L1 和 L2 正则化产生本质不同的解的原因之一。

4.2 正则化背后的范数几何

L1 正则化加的是 1-范数惩罚,L2 正则化加的是平方 2-范数惩罚。几何上可以想象:损失函数的等高线在参数空间里是椭圆,正则项约束把参数限制在某个“球”内。L1 的单位球是带尖角的菱形,L2 的单位球是光滑圆球。在约束边界上找损失最小的点时,菱形尖角更容易被选中,尖角对应大量坐标为 0,这就是稀疏解的几何来源。

优化的行为也不一样。L1 是非光滑的,近端梯度法会执行软阈值操作,直接把接近 0 的参数变成 0;L2 处处可导,梯度下降只让参数整体按比例缩小。实际项目里,特征数量很大但样本有限,我会先用 L1 快速筛掉无效特征,再用 L2 做精细训练。如果只用 L2,特征选择做不到;如果只用 L1,在某些平滑损失下可能引入偏差。Elastic Net 混合两者,就是为了兼顾稀疏和稳定。

我自己还有一个体会:当特征间相关性很强时,L1 只会随机挑其中一个,结果不稳定;L2 会把系数分散到相关特征上,更平滑。如果你发现同一个模型在不同随机种子下选出来的特征完全不同,多半是特征高度相关,这时要考虑 Elastic Net 或分组稀疏正则化,而不是单纯加大 L1 惩罚。

4.3 条件数:衡量矩阵的敏感度

线性方程组 Ax=b 里,如果 A 或 b 有微小扰动,解 x 的变化可能被放大很多倍。这个放大倍数就是条件数cond(A) = ||A|| · ||A^{-1}||。理论上说,条件数刻画了“输入误差到输出误差”的最大放大因子。数值线性代数里最常用的谱条件数是σ_max / σ_min,也就是最大奇异值除以最小奇异值。

条件数接近 1,矩阵就是良态的;条件数达到 1e12 以上,基本可以认为矩阵数值奇异。判断一个矩阵能不能安全求逆或分解,先算条件数是最高效的“体检”。在 Python 里,np.linalg.cond(A)默认计算的是 2-范数条件数,内部用 SVD 实现,这是最稳定的方式。

千万别用np.linalg.inv(A)算完再乘 A 去估计条件数。直接求逆本身就可能因为小奇异值导致数值溢出,算出来的“条件数”完全不可靠。我以前在复现论文时,为了图省事直接norm(A) * norm(inv(A)),遇到一个接近奇异的矩阵,得到的条件数有 1e20,比用 SVD 算出的真实值大好几个数量级,排查了整整一下午。

4.4 谱半径与范数的区别

谱半径定义为特征值模的最大值ρ(A) = max|λ_i|。它和范数关系紧密,但有本质区别。对任意诱导范数,总有ρ(A) ≤ ||A||;反过来,给定任何矩阵 A 和任意小量 ε,都存在一个诱导范数让||A|| ≤ ρ(A) + ε。也就是说,谱半径可以被某个范数任意逼近,但谱半径本身不满足三角不等式,所以它不是范数。

在迭代法里,谱半径是决定收敛性的关键:对基本迭代格式,ρ(A) < 1是收敛的充要条件。但计算谱半径需要解特征值问题,成本高;而找一个诱导范数让它小于 1,计算往往更便宜。所以工程实践中,我会先用范数判断收敛,范数小于 1 则直接保证收敛;范数大于 1 时再回头算谱半径做精确判断。这条经验在写 Jacobi、Gauss-Seidel 迭代时特别有用。

5. 实操中的选型、计算与避坑

5.1 用 NumPy 快速计算各类范数

实际写代码时,np.linalg.norm是最常用的接口。最容易翻车的是默认参数:np.linalg.norm(A)对矩阵默认算 F-范数,对向量默认算 2-范数。如果想算矩阵谱范数,必须显式传ord=2。下面这段是我日常使用的模板:

import numpy as np x = np.array([3, -4, 5]) print(np.linalg.norm(x, ord=1)) # 向量1-范数:12.0 print(np.linalg.norm(x, ord=2)) # 向量2-范数:约7.071 print(np.linalg.norm(x, ord=np.inf)) # 向量∞-范数:5.0 A = np.array([[1, 2], [3, 4]]) print(np.linalg.norm(A, ord=1)) # 矩阵1-范数:列和最大值6 print(np.linalg.norm(A, ord=np.inf)) # 矩阵∞-范数:行和最大值7 print(np.linalg.norm(A, ord='fro')) # F-范数:sqrt(30) print(np.linalg.norm(A, ord=2)) # 谱范数:最大奇异值

对大规模稀疏矩阵,不建议直接np.linalg.norm(A, ord=2),因为内部会把矩阵转成稠密格式做 SVD,内存和时间都吃不消。可以用scipy.sparse.linalg.svds求最大奇异值,或者自己写一个幂迭代。幂迭代只需要反复做矩阵向量乘法,每次迭代成本很低,十几轮就能得到足够用的谱范数近似值。在做 GAN 的谱归一化时,我基本都是这样算的。

5.2 范数选择的实用建议

这是一个我自己反复使用的选型清单:

  • 测量向量误差:误差服从接近高斯分布时用 2-范数最自然;数据里有明显离群值时用 1-范数做鲁棒估计;关心最坏偏差时用 ∞-范数。
  • 矩阵正则化:神经网络里的 weight decay 默认用 F-范数;GAN 的谱归一化必须用谱范数;低秩矩阵分解通常用 F-范数作为重建误差。
  • 线性方程组判断:先算谱条件数。如果条件数大于 1e14,矩阵基本数值奇异,硬解意义不大,要先做预处理或正则化。
  • 优化算法选型:L1 适合近端梯度、ADMM;L2 适合普通梯度下降、L-BFGS。不要拿普通梯度下降硬怼 L1 的非光滑点,收敛会非常慢。

这些建议不是死规则,但能覆盖大部分日常场景。我接到一个新项目时,会先在纸上写下问题:你到底是想要整体能量最小、绝对偏差最小,还是最坏分量最小?目标清楚了,范数就选对了一半。

5.3 常见陷阱与排查心得

整理几个我踩过不止一次的坑。

第一个是默认范数混淆。np.linalg.norm(A)默认 F-范数,不是谱范数。写论文或对外文档时,一定要写明使用的是 Frobenius 范数还是谱范数,否则别人复现结果时会把数值对不上。

第二个是矩阵 ∞-范数定义混淆。矩阵 ∞-范数是最大绝对行和,而所有元素的最大绝对值并不是范数,它连次乘性都不满足。如果拿它去估计条件数或误差界,结论会完全错误。

第三个是零点可微性问题。2-范数在零点不可导,但平方 2-范数可导;1-范数在零点不可导,要处理次梯度或软阈值。自定义损失函数时,如果不处理零点,梯度会出现 NaN 或者震荡。

第四个是谱范数计算方式。优先用 SVD,不要用 A^T A 的特征分解。A^T A 会平方条件数,特征值求解误差被放大,得到的结果不可靠。小矩阵用np.linalg.svd,大矩阵用稀疏 SVD 或幂迭代。

第五个是忽略范数等价常数。高维空间里 1-范数和 2-范数可能相差 sqrt(n) 倍。若做误差分析不写上等价常数,最后的界再漂亮也站不住脚。

5.4 范数在深度学习中的应用

谱范数最出名的应用是谱归一化。GAN 里判别器需要满足 Lipschitz 连续,一个简单有效的做法是每层权重矩阵除以它的谱范数,让最大奇异值等于 1。这样既稳定训练,又不会像其他归一化方法那样过度限制模型表达能力。

F-范数在模型量化里也经常出现:计算权重矩阵的 F-范数,可以估计量化误差的整体能量。1-范数和 ∞-范数则多用于稀疏化、剪枝和对抗扰动分析。可以说,这几类范数覆盖了深度学习理论分析里大半的度量需求。

我个人做了这么多年数值工作,最大的体会是:不要死记范数公式,而是在脑子里建立对应的几何图像。L1 是带尖角的菱形,L2 是光滑球,∞ 是立方体;矩阵里,列和、行和、谱范数、F 范数分别对应不同的“放大倍数”或“能量”语义。等你能把这些形状和实际场景对应起来,范数就不再是教科书里的抽象符号,而是你工具箱里随时能用的关键工具。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询