批量归一化(BN)是深度学习中常用的一种技术,它通过对迷你批次中的激活值进行归一化,能有效处理内部协变量偏移问题。然而,它对批次统计量的依赖有时可能成为一个限制。例如,当迷你批次大小非常小时,BN的表现可能下降,因为批次统计量对真实总体统计量而言变得嘈杂。此外,将BN直接应用于循环神经网络(RNNs)可能很麻烦,因为每个时间步的统计量需要不同地计算。层归一化(LN)提供了一种替代方法,可以克服这些具体限制。层归一化不是在批次维度上进行归一化,而是为单个训练样本在同一层的所有隐藏单元中计算平均值和方差。层归一化如何运作设想由单个输入样本 $x$ 生成的特定层 $l$ 的激活值 $a$。令 $H$ 为该层中隐藏单元的数量。层归一化使用该单个样本中该层神经元的所有求和输入来计算平均值 $ \mu $ 和方差 $ \sigma^2 $:$$ \mu = \frac{1}{H} \sum_{i=1}^{H} a_i $$$$ \sigma^2 = \frac{1}{H} \sum_{i=1}^{H} (a_i - \mu)^2 $$请注意,这些计算是为每个训练样本独立进行的,不涉及批次间的交互。计算出平均值和方差后,该层中每个隐藏单元 $i$ 的激活值 $a_i$ 将被归一化:$$ \hat{a}_i = \frac{a_i - \mu}{\sqrt{\sigma^2 + \epsilon}} $$这里,$ \epsilon $ 是一个用于数值稳定的小常数,其作用类似于批量归一化中的用法。最后,与批量归一化一样,层归一化引入了可学习参数:一个神经元尺度因子 $ \gamma $ (gamma) 和一个偏移因子 $ \beta $ (beta)。这些参数允许网络学习归一化激活值的最佳尺度和平均值,如果需要,甚至可以恢复原始激活值:$$ \text{LN}(a_i) = \gamma_i \hat{a}_i + \beta_i $$这些参数 $ \gamma $ 和 $ \beta $ 在训练期间与网络的其他权重一起学习。区别与优势主要区别在于归一化轴:批量归一化:在批次维度上进行归一化,每个特征/通道独立进行。统计量取决于迷你批次。层归一化:在特征/隐藏单元维度上进行归一化,每个样本独立进行。统计量与迷你批次无关。这种差异使得层归一化具有一些重要特性:批次大小独立性:LN的计算在训练和推理期间相同,不依赖于迷你批次大小。这使其适用于需要小批次(例如,由于内存限制)或批次大小可能变化的场景。在RNNs中的有效性:LN通常比BN在循环网络中更直接地应用且更有效。由于归一化是针对每个时间步的每个样本在隐藏单元中完成的,它能自然处理可变序列长度,无需复杂的修改。无需运行统计量:与BN不同,LN在推理时不需要维护平均值和方差的运行平均值,这简化了其实现。下面的图示说明了不同的归一化维度:digraph G { rankdir=LR; node [shape=plaintext]; subgraph cluster_bn { label = "批量归一化"; style=dashed; color="#adb5bd"; bn_table [label=< <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> <TR><TD BGCOLOR="#e9ecef">特征 1</TD><TD BGCOLOR="#e9ecef">特征 2</TD><TD BGCOLOR="#e9ecef">...</TD><TD BGCOLOR="#e9ecef">特征 H</TD></TR> <TR><TD BGCOLOR="#a5d8ff">值</TD><TD>值</TD><TD>...</TD><TD>值</TD></TR> <TR><TD BGCOLOR="#a5d8ff">值</TD><TD>值</TD><TD>...</TD><TD>值</TD></TR> <TR><TD BGCOLOR="#a5d8ff">值</TD><TD>值</TD><TD>...</TD><TD>值</TD></TR> <TR><TD BGCOLOR="#a5d8ff">...</TD><TD>...</TD><TD>...</TD><TD>...</TD></TR> <TR><TD BGCOLOR="#a5d8ff">值</TD><TD>值</TD><TD>...</TD><TD>值</TD></TR> </TABLE> >]; bn_desc [label="在每个列(特征)中\n跨所有样本(批次维度)\n归一化值"]; bn_table -> bn_desc [style=invis]; } subgraph cluster_ln { label = "层归一化"; style=dashed; color="#adb5bd"; ln_table [label=< <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> <TR><TD BGCOLOR="#e9ecef">特征 1</TD><TD BGCOLOR="#e9ecef">特征 2</TD><TD BGCOLOR="#e9ecef">...</TD><TD BGCOLOR="#e9ecef">特征 H</TD></TR> <TR><TD BGCOLOR="#96f2d7">值</TD><TD BGCOLOR="#96f2d7">值</TD><TD BGCOLOR="#96f2d7">...</TD><TD BGCOLOR="#96f2d7">值</TD></TR> <TR><TD>值</TD><TD>值</TD><TD>...</TD><TD>值</TD></TR> <TR><TD>值</TD><TD>值</TD><TD>...</TD><TD>值</TD></TR> <TR><TD>...</TD><TD>...</TD><TD>...</TD><TD>...</TD></TR> <TR><TD>值</TD><TD>值</TD><TD>...</TD><TD>值</TD></TR> </TABLE> >]; ln_desc [label="在每个行(样本)中\n跨所有特征(层维度)\n归一化值"]; ln_table -> ln_desc [style=invis]; } }批量归一化(蓝色,按批次按列)与层归一化(绿色,按特征按行)的归一化维度比较。尽管BN通常是卷积神经网络(CNNs)的默认选择,但LN在涉及Transformer和RNN的自然语言处理任务中,以及在批次统计量可能不可靠的情况下,已证明特别有用。它作为稳定并可能加速深度神经网络训练的另一个有价值的工具。我们在此不会像对批量归一化那样细致地讨论实现细节,但大多数深度学习框架提供了添加层归一化层的简单方法。