L2归一化(L2 Normalization) 是一种数据预处理或特征转换技术,其核心是通过计算向量的L2范数(欧氏距离)对向量进行缩放,使处理后的向量L2范数为1。这一操作能帮助稳定训练过程、提升模型泛化能力,在特征匹配、相似度计算等场景中尤为常用。
一、核心定义与数学原理
对于一个d维向量 ( \mathbf{x} = [x_1, x_2, …, x_d] ):
-
L2范数(L2 Norm):向量各元素的平方和的平方根,公式为:
\mathbf{x}|_2 = \sqrt{x_1^2 + x_2^2 + … + x_d^2} -
L2归一化:将向量每个元素除以其L2范数,得到归一化后的向量 ( \hat{\mathbf{x}} ),公式为:
[
\hat{\mathbf{x}} = \frac{\mathbf{x}}{|\mathbf{x}|_2} = \left[ \frac{x_1}{|\mathbf{x}|_2}, \frac{x_2}{|\mathbf{x}|_2}, …, \frac{x_d}{|\mathbf{x}|_2} \right]
]
此时,( |\hat{\mathbf{x}}|_2 = 1 ),即向量被“标准化”到单位长度。
二、作用与应用场景
-
消除尺度影响
归一化后,向量的大小(幅度)被忽略,仅保留方向信息。例如,在图像特征匹配中,不同光照下的同一物体特征向量可能因亮度差异导致数值尺度不同,L2归一化后可更准确地衡量特征相似度。 -
稳定训练过程
在神经网络中,对输入特征或中间层输出进行L2归一化,可避免因特征数值范围差异过大导致的梯度爆炸/消失问题,加速模型收敛。 -
常见应用
- 特征预处理:如SVM、KNN等算法中,对样本特征归一化以提升性能。
- 神经网络层:如一些模型中会在全连接层或卷积层后添加L2归一化操作(类似Batch Normalization,但归一化方式不同)。
- 词向量/嵌入向量:在NLP中,对词嵌入进行L2归一化,使不同词向量的比较更聚焦于语义方向而非数值大小。
三、与L1归一化的对比
维度 | L2归一化 | L1归一化 |
---|---|---|
目标 | 使向量L2范数为1 | 使向量L1范数(各元素绝对值之和)为1 |
公式 | ( \hat{x}_i = x_i / \sqrt{\sum x_j^2} ) | ( \hat{x}_i = x_i / \sum |
特性 | 对异常值更稳健(平方项会放大异常值,但归一化后影响相对可控) | 对异常值敏感(绝对值对极端值更敏感) |
几何意义 | 将向量投影到单位球面上 | 将向量投影到单位菱形(L1球)上 |
四、代码示例(Python)
使用NumPy实现L2归一化:
import numpy as np
# 定义一个向量
x = np.array([1, 2, 3, 4], dtype=np.float32)
# 计算L2范数
l2_norm = np.linalg.norm(x, ord=2) # ord=2指定L2范数
# L2归一化
x_normalized = x / l2_norm
print("原始向量:", x)
print("L2范数:", l2_norm)
print("归一化后向量:", x_normalized)
print("归一化后L2范数:", np.linalg.norm(x_normalized, ord=2)) # 输出应为1.0