numpy.linalg.norm
函数是NumPy库中的一个函数,用于计算各种范数(Norm)或其他类型的矢量/矩阵量度。在处理多维数组时,这个函数可以用来计算向量的长度或者矩阵的某种“大小”。
对于一维数组(也就是向量):
np.linalg.norm(vector, ord=None, axis=None, keepdims=False, ...)
计算的是该向量的范数。
-
vector
是要计算范数的一维数组。 -
ord
参数可选,指定计算哪种范数,默认是 L2 范数,即向量元素绝对值平方和的平方根。- 如果
ord
等于 None 或 2,计算的是 L2 范数: - 若
ord
等于 1,计算的是 L1 范数(曼哈顿距离): - 其他整数
p
将计算 Lp 范数: - 当
ord
为无穷大(np.inf
),则计算的是最大绝对值:
- 如果
对于二维以上的数组(比如矩阵或多维数组),如果没有指定 axis
参数,np.linalg.norm
会先将其扁平化成一维,然后计算整个数组的范数。如果指定了 axis
,它会沿着指定轴分别计算各列或各行的范数。
在进行行归一化时,我们通常会对权重矩阵沿行方向计算 L2 范数,这样可以得到每行的长度,随后通过除以这些长度完成归一化。
举个栗子,计算矩阵 W
每一行 L2 范数:
import numpy as np
# 假设 W 是一个 (m, n) 形状的权重矩阵
W = np.array([...]) # 这里是具体的权重数据
# 计算每行的 L2 范数
row_norms = np.linalg.norm(W, ord=2, axis=1, keepdims=True)
# 对原始矩阵 W 的每一行进行归一化
W_normalized = W / row_norms
这里的 keepdims=True
保证了计算出来的 row_norms
仍与 W
保持相同的形状,便于后续直接进行点除运算。同时,为了避免除以零的情况,在实际操作中可能会添加一个小于 1 的正值(如 1e-8
)来避免分母为零的错误。