一、什么是范数?
范数是向量空间中对向量(或矩阵)的“长度/大小/模”的一种量化度量,是欧几里得空间中向量模长的推广(欧几里得模长是范数的特殊情况)。
严格来说,一个函数 ∣∣⋅∣∣:V→R+||\cdot||: V \to R^+∣∣⋅∣∣:V→R+(VVV 是向量空间,R+R^+R+ 是非负实数)要被称为范数,必须满足以下3条公理(非负性、齐次性、三角不等式):
- 非负性:∣∣x∣∣≥0||x|| \ge 0∣∣x∣∣≥0,且仅当 xxx 为零向量时,∣∣x∣∣=0||x|| = 0∣∣x∣∣=0;
- 齐次性:对任意标量 α\alphaα,∣∣αx∣∣=∣α∣⋅∣∣x∣∣||\alpha x|| = |\alpha| \cdot ||x||∣∣αx∣∣=∣α∣⋅∣∣x∣∣;
- 三角不等式:对任意两个向量 x,yx,yx,y,∣∣x+y∣∣≤∣∣x∣∣+∣∣y∣∣||x+y|| \le ||x|| + ||y||∣∣x+y∣∣≤∣∣x∣∣+∣∣y∣∣。
核心本质:范数给向量/矩阵赋予了**“距离感”和“大小感”**,让我们能比较两个向量“谁大谁小”、衡量向量“离原点有多远”,是数值分析、线性代数、机器学习的基础工具。
范数主要分为向量范数(应用最广)和矩阵范数(机器学习中较少直接使用,多由向量范数诱导),机器学习中99%的场景用的是向量范数,下文重点讲解。
二、常见的范数类型
最常用的范数是**LpL^pLp 范数**(ppp-范数),属于向量范数,定义为:
对于nnn维向量 x=[x1,x2,...,xn]Tx = [x_1, x_2, ..., x_n]^Tx=[x1,x2,...,xn]T,其LpL^pLp范数为:
∣∣x∣∣p=(∑i=1n∣xi∣p)1p||x||_p = \left( \sum_{i=1}^n |x_i|^p \right)^{\frac{1}{p}}∣∣x∣∣p=(i=1∑n∣xi∣p)p1
其中p≥1p \ge 1p≥1(p<1p<1p<1时不满足三角不等式,不是严格范数)。
当ppp取特定值时,会得到机器学习中最核心的几种范数,此外还有无穷范数(p→∞p \to \inftyp→∞的极限),下面逐一讲解:
1. L0L^0L0 范数(伪范数)
注意:L0L^0L0 不满足范数的齐次性,因此是伪范数,但机器学习中习惯称其为L0L^0L0范数。
定义:$||x||_0 = $ 向量xxx中非零元素的个数。
(并非公式(∑i=1n∣xi∣0)0\left( \sum_{i=1}^n |x_i|^0 \right)^0(∑i=1n∣xi∣0)0,因为000^000无意义,是人为定义的统计规则)。
2. L1L^1L1 范数(曼哈顿范数/出租车范数)
p=1p=1p=1时的LpL^pLp范数,因计算方式类似曼哈顿街区的行走距离而得名。
定义:∣∣x∣∣1=∑i=1n∣xi∣||x||_1 = \sum_{i=1}^n |x_i|∣∣x∣∣1=i=1∑n∣xi∣
即向量所有元素的绝对值之和。
3. L2L^2L2 范数(欧几里得范数)
p=2p=2p=2时的LpL^pLp范数,就是我们最熟悉的欧几里得空间向量模长。
定义:∣∣x∣∣2=∑i=1nxi2||x||_2 = \sqrt{\sum_{i=1}^n x_i^2}∣∣x∣∣2=i=1∑nxi2
即向量所有元素的平方和开平方根。
衍生:L2L^2L2范数的平方(∣∣x∣∣22=∑i=1nxi2||x||_2^2 = \sum_{i=1}^n x_i^2∣∣x∣∣22=∑i=1nxi2)在机器学习中更常用,因为求导更简单(无平方根),且单调性与L2L^2L2范数一致(比较大小结果相同)。
4. L∞L^\inftyL∞ 范数(无穷范数/最大范数)
p→∞p \to \inftyp→∞时LpL^pLp范数的极限,核心是取向量元素的最大绝对值。
定义:∣∣x∣∣∞=max1≤i≤n∣xi∣||x||_\infty = \max_{1 \le i \le n} |x_i|∣∣x∣∣∞=1≤i≤nmax∣xi∣
推导逻辑:当p→∞p \to \inftyp→∞时,向量中绝对值最大的元素会在求和中占据主导,其余元素可忽略,最终开ppp次方后结果趋近于该最大绝对值。
5. 其他常用范数(了解即可)
- LpL^pLp范数(1<p<21<p<21<p<2或p>2p>2p>2):如L1.5L^{1.5}L1.5、L3L^3L3,介于L1L^1L1和L2L^2L2之间,兼顾两者特性;
- Frobenius范数(F范数):矩阵范数,是矩阵的“L2L^2L2范数”,定义为∣∣A∣∣F=∑i=1m∑j=1naij2||A||_F = \sqrt{\sum_{i=1}^m \sum_{j=1}^n a_{ij}^2}∣∣A∣∣F=∑i=1m∑j=1naij2(矩阵所有元素的平方和开平方根),机器学习中用于衡量矩阵的大小;
- 核范数:矩阵的奇异值之和,用于矩阵低秩近似。
三、机器学习中各种范数的核心作用
机器学习中范数的核心应用场景有3个:正则化(防止过拟合)、特征归一化、损失函数/距离度量,其中正则化是最核心的用途。
下面结合每种范数的特性,讲解其在机器学习中的具体作用,重点是L0L^0L0、L1L^1L1、L2L^2L2(无穷范数主要用于梯度裁剪)。
1. L0L^0L0 范数:特征选择(稀疏化)
核心作用:统计非零参数/特征的个数,实现特征稀疏化(让向量中尽可能多的元素为0)。
- 机器学习中,若模型的权重向量用L0L^0L0范数约束,会让大部分权重为0,只有少数核心特征对应的权重非零,本质是自动特征选择(保留重要特征,剔除无用特征);
- 缺陷:L0L^0L0范数是非凸、不连续的,直接优化L0L^0L0范数是NP难问题(计算量极大,无法直接求解),因此机器学习中几乎不会直接使用L0L^0L0正则化,而是用L1L^1L1范数近似替代。
2. L1L^1L1 范数:稀疏正则化(Lasso回归)+ 鲁棒性
L1L^1L1范数是机器学习中实现稀疏性的核心工具,同时对异常值有更好的鲁棒性,核心应用有2个:
(1)L1L^1L1 正则化(Lasso Regularization)
在模型损失函数中加入L1L^1L1范数惩罚项,即:
Ltotal=Lbase+λ⋅∣∣w∣∣1\mathcal{L}_{total} = \mathcal{L}_{base} + \lambda \cdot ||w||_1Ltotal=Lbase+λ⋅∣∣w∣∣1
其中Lbase\mathcal{L}_{base}Lbase是基础损失(如MSE、交叉熵),www是模型权重,λ≥0\lambda \ge 0λ≥0是正则化系数(控制惩罚强度)。
核心效果:让模型的权重向量变得稀疏(大量权重为0),实现自动特征选择。
- 原理:L1L^1L1范数的等值线是菱形,与损失函数的等高线相交时,极易相交在坐标轴上(对应某个权重为0),随着λ\lambdaλ增大,更多权重会被压缩为0;
- 典型应用:Lasso回归(替代线性回归的L2L^2L2正则化)、稀疏感知机、特征选择算法(如基于Lasso的特征筛选)。
(2)鲁棒的距离/损失度量
L1L^1L1范数对异常值不敏感(鲁棒性强),因为其计算的是绝对值和,异常值的极端值不会被平方放大(与L2L^2L2对比)。
- 例如:用L1L^1L1范数衡量两个样本的距离(曼哈顿距离),适合处理含异常值的数据集;
- 典型应用:绝对损失(MAE,L1L_1L1 Loss)L=∣∣y−y^∣∣1L = ||y-\hat{y}||_1L=∣∣y−y^∣∣1,比均方损失(MSE,L2L_2L2 Loss)更适合异常值多的场景。
3. L2L^2L2 范数:权重衰减(Ridge回归)+ 防止梯度爆炸
L2L^2L2范数是机器学习中使用最广泛的范数,核心作用是权重衰减(Weight Decay),防止模型过拟合,同时可用于梯度裁剪,核心应用有2个:
(1)L2L^2L2 正则化(Ridge Regularization/权重衰减)
在损失函数中加入L2L^2L2范数的平方惩罚项(求导更方便),即:
Ltotal=Lbase+λ⋅∣∣w∣∣22\mathcal{L}_{total} = \mathcal{L}_{base} + \lambda \cdot ||w||_2^2Ltotal=Lbase+λ⋅∣∣w∣∣22
核心效果:让模型的权重尽可能小(接近0,但不会为0),避免单个特征对模型产生过大影响(防止过拟合)。
- 原理:L2L^2L2范数的等值线是圆形,与损失函数等高线相交时,会将权重压缩到原点附近,但不会落在坐标轴上(因此权重不会为0,仅会变小);
- 本质:给权重添加高斯先验,假设权重服从均值为0的高斯分布;
- 典型应用:Ridge回归、逻辑回归、神经网络的权重衰减(PyTorch中优化器的
weight_decay参数本质就是L2L^2L2正则化)。
(2)梯度裁剪/范数归一化
- 梯度裁剪:神经网络训练中,计算出的梯度向量若过大,会导致梯度爆炸,通过限制梯度的L2L^2L2范数(如将梯度的L2L^2L2范数裁剪到最大阈值maxnorm\max_normmaxnorm),可有效防止梯度爆炸;
- 范数归一化:如批量归一化(BN)、层归一化(LN)的底层逻辑,或对特征向量做L2L^2L2归一化(让特征向量的模长为1),常用于人脸识别、推荐系统(如余弦相似度计算前的特征归一化)。
4. L∞L^\inftyL∞ 范数:梯度裁剪+对抗学习
核心应用:
(1)梯度裁剪
限制梯度向量的最大绝对值,确保梯度不会出现极端值,适合对梯度的“单个维度极端值”敏感的模型;
(2)对抗学习
生成对抗样本时,常用L∞L^\inftyL∞范数约束扰动的大小(如扰动的每个维度绝对值不超过ϵ\epsilonϵ),确保对抗样本与原样本的视觉差异极小(如FGSM对抗攻击)。
5. 范数的其他通用作用
- 特征归一化:将特征向量做L1/L2L^1/L^2L1/L2归一化,消除量纲影响,让不同特征的权重具有可比性(如SVM、KNN、聚类算法中必须做特征归一化);
- 距离度量:由范数诱导距离(如欧几里得距离d(x,y)=∣∣x−y∣∣2d(x,y)=||x-y||_2d(x,y)=∣∣x−y∣∣2,曼哈顿距离d(x,y)=∣∣x−y∣∣1d(x,y)=||x-y||_1d(x,y)=∣∣x−y∣∣1),是分类、聚类、检索算法的基础;
- 模型评估:用范数衡量预测值与真实值的偏差(如MAE是L1L^1L1范数,MSE是L2L^2L2范数的平方)。
四、PyTorch中的范数运算
PyTorch提供了通用的范数函数torch.norm()(适用于张量/向量/矩阵),以及按维度的范数计算、优化器/梯度裁剪的范数接口,同时对常用的L1/L2L^1/L^2L1/L2范数有简化实现。
核心前提
PyTorch中所有范数运算的操作对象是张量(Tensor),向量是1维张量,矩阵是2维张量,高维张量(如神经网络的特征图N×C×H×WN \times C \times H \times WN×C×H×W)可按指定维度计算范数。
1. 通用范数函数:torch.norm()
语法(PyTorch 1.10+,最新版已统一接口):
torch.norm(input, p='fro', dim=None, keepdim=False, out=None, dtype=None)
关键参数:
input:输入张量(任意维度);p:范数类型,可选1,2,np.inf,'fro'(Frobenius范数,矩阵专用),默认'fro';dim:指定计算范数的维度,None表示对所有元素计算范数(得到标量);keepdim:是否保留计算范数的维度,True则维度不变(变为1),False则压缩该维度,默认False。
注意:
- 对向量(1维张量),
p=1/L1、p=2/L2、p=inf/Linf分别对应L1L^1L1、L2L^2L2、L∞L^\inftyL∞范数; - 对矩阵(2维张量),
p='fro'是Frobenius范数,等价于将矩阵展平为向量后的L2L^2L2范数; - 对高维张量(如4维特征图),需通过
dim指定计算范数的维度(如dim=[2,3]对H/W维度计算范数)。
2. 向量范数的PyTorch实现(1维张量)
最基础的场景,计算单个向量的L0L^0L0(伪范数)、L1L^1L1、L2L^2L2、L∞L^\inftyL∞范数:
import torch
import numpy as np
# 定义1维张量(向量)
x = torch.tensor([1, -2, 3, 0, -4], dtype=torch.float32)
print("原始向量:", x)
# 1. L0范数:非零元素个数(手动实现,PyTorch无直接接口)
l0 = torch.nonzero(x).size(0)
print("L0范数(非零个数):", l0) # 输出:4
# 2. L1范数:p=1
l1 = torch.norm(x, p=1)
print("L1范数:", l1.item()) # 输出:1+2+3+4=10.0
# 3. L2范数:p=2
l2 = torch.norm(x,

3万+

被折叠的 条评论
为什么被折叠?



