L2 范数归一化 概述tf.nn.l2_normalize(inputs, axisself.axis) 的作用是对输入张量inputs 沿着指定的轴 axis 进行L2 范数归一化。具体来说对于给定轴上的每一个切片例如若 axis0则每一列是一个切片。若 axis1则每一行是一个切片计算该切片所有元素的平方和再开平方得到 L2 范数然后将该切片中的每个元素除以这个范数使得每个切片的 L2 范数都变为 1。公式对于输入张量 x沿着轴 axis 的每个切片 v归一化后的结果为vnormv∥v∥2,∥v∥2∑ivi2 v_{\text{norm}} \frac{v}{\|v\|_2}, \quad \|v\|_2 \sqrt{\sum_i v_i^2}vnorm​∥v∥2​v​,∥v∥2​i∑​vi2​​数值推导例子假设我们有一个 2×3 的矩阵 inputsinputs[123456] \text{inputs} \begin{bmatrix} 1 2 3 \\ 4 5 6 \end{bmatrix}inputs[14​25​36​]情况 1axis1按行归一化第一行[1,2,3]L2 范数:12223214914≈3.7417\sqrt{1^2 2^2 3^2} \sqrt{1 4 9} \sqrt{14} \approx 3.7417122232​149​14​≈3.7417归一化后:114≈0.2673\frac{1}{\sqrt{14}} \approx 0.267314​1​≈0.2673,214≈0.5345\frac{2}{\sqrt{14}} \approx 0.534514​2​≈0.5345,314≈0.8018\frac{3}{\sqrt{14}} \approx 0.801814​3​≈0.8018第二行[4,5,6]L2 范数:16253677≈8.7750\sqrt{162536} \sqrt{77} \approx 8.7750162536​77​≈8.7750归一化后:477≈0.4558\frac{4}{\sqrt{77}} \approx 0.455877​4​≈0.4558,577≈0.5698\frac{5}{\sqrt{77}} \approx 0.569877​5​≈0.5698,677≈0.6838\frac{6}{\sqrt{77}} \approx 0.683877​6​≈0.6838最终结果矩阵axis1[0.26730.53450.80180.45580.56980.6838] \begin{bmatrix} 0.2673 0.5345 0.8018 \\ 0.4558 0.5698 0.6838 \end{bmatrix}[0.26730.4558​0.53450.5698​0.80180.6838​]情况 2axis0按列归一化第一列[1,4]L2 范数:11617≈4.1231\sqrt{1 16} \sqrt{17} \approx 4.1231116​17​≈4.1231归一化后:117≈0.2425\frac{1}{\sqrt{17}} \approx 0.242517​1​≈0.2425,417≈0.9701\frac{4}{\sqrt{17}} \approx 0.970117​4​≈0.9701第二列[2,5]L2 范数:42529≈5.3852\sqrt{4 25} \sqrt{29} \approx 5.3852425​29​≈5.3852归一化后:229≈0.3714\frac{2}{\sqrt{29}} \approx 0.371429​2​≈0.3714,529≈0.9285\frac{5}{\sqrt{29}} \approx 0.928529​5​≈0.9285第三列[3,6][0.24250.37140.44720.97010.92850.8944] \begin{bmatrix} 0.2425 0.3714 0.4472 \\ 0.9701 0.9285 0.8944 \end{bmatrix}[0.24250.9701​0.37140.9285​0.44720.8944​]验证每一列的平方和等于 1。作用与应用特征归一化将特征向量缩放到单位长度消除尺度影响。余弦相似度归一化后的向量内积等于余弦相似度常用于文本或图像检索。防止梯度爆炸在神经网络中有时对嵌入向量进行 L2 归一化有助于稳定训练。代码示例importtensorflowastf inputstf.constant([[1.,2.,3.],[4.,5.,6.]])# 按行归一化output_rowtf.nn.l2_normalize(inputs,axis1)# 按列归一化output_coltf.nn.l2_normalize(inputs,axis0)print(按行归一化:\n,output_row.numpy())print(按列归一化:\n,output_col.numpy())注意axis -1当 axis -1 时tf.nn.l2_normalize 会沿着最后一个维度即最内层维度 进行 L2 归一化。这是 Python 中通用的负数索引约定-1 表示张量形状中的最后一个轴。inputs[[1,2,3],[4,5,6]]# shape (2, 3)最后一维是 3所以 axis -1 等价于 axis 1。归一化按行进行即每行单独归一化结果与之前 axis1 的推导完全相同[[0.2673, 0.5345, 0.8018], [0.4558, 0.5698, 0.6838]]