浅谈深度学习中的L2归一化(L2 Normalization)

Source

L2归一化(L2 Normalization) 是一种数据预处理或特征转换技术,其核心是通过计算向量的L2范数(欧氏距离)对向量进行缩放,使处理后的向量L2范数为1。这一操作能帮助稳定训练过程、提升模型泛化能力,在特征匹配、相似度计算等场景中尤为常用。

一、核心定义与数学原理

对于一个d维向量 ( \mathbf{x} = [x_1, x_2, …, x_d] ):

  1. L2范数(L2 Norm):向量各元素的平方和的平方根,公式为:
    \mathbf{x}|_2 = \sqrt{x_1^2 + x_2^2 + … + x_d^2}

  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 ),即向量被“标准化”到单位长度。

二、作用与应用场景

  1. 消除尺度影响
    归一化后,向量的大小(幅度)被忽略,仅保留方向信息。例如,在图像特征匹配中,不同光照下的同一物体特征向量可能因亮度差异导致数值尺度不同,L2归一化后可更准确地衡量特征相似度。

  2. 稳定训练过程
    在神经网络中,对输入特征或中间层输出进行L2归一化,可避免因特征数值范围差异过大导致的梯度爆炸/消失问题,加速模型收敛。

  3. 常见应用

    • 特征预处理:如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