深度学习

层归一化(layer normalization)

/ LAY-ur nor-muh-luh-ZAY-shun /

层归一化干的是和批归一化一样的「稳定」活儿——防止网络内部的数值漂移到极端的尺度——但它衡量「正常」范围的方式截然不同。批归一化是横跨一个批里的许多样本,来判定什么算正常。层归一化则是在单个样本之内、横跨该输入在某一层产出的所有数值,把它们自顾自地稳住。它问的其实是「就这一句话而言,我的这些数还算均衡吗?」,而不是「跟批里其余的相比怎样」。

何必另起一套配方?因为批归一化对「批」的依赖,恰恰在现代语言模型所栖身之处成了软肋。在循环模型或 Transformer 里,天然的单位是一条长度可变的序列,批可能很小,而且你常常一次只处理一个样本——这些情形下,批的统计量要么摇摇晃晃,要么根本拿不到。层归一化把这些全绕开了:既然它是把每个样本各自归一化,那么无论你的批是一个还是一千个,它的行为都一模一样,训练时和推断时也一模一样。正是这种一致性,让它成了 Transformer 内部默认的归一化方式。

和批归一化一样,层归一化也是把数值居中、重新缩放,再施加两个学出来的数(一个缩放、一个平移),好让网络去调整结果。该有的老实说法不是「谁比谁好」,而是它们适合不同形状的问题。批归一化往往在卷积视觉网络里大放异彩——那里批大而齐整;层归一化则在序列与语言模型里称王——那里你需要的,正是不依赖于批。

某一层对一个输入产出向量 [12, 18, 6, 24]。层归一化只在这四个数自己之间——只用这一个样本——把它们重新居中、重新缩放成类似 [−1.0, 0.3, −1.8, 1.5] 的样子。批里别的样本一概不参考。

在单个样本之内归一化——于是批的大小再也无关紧要。

一字之差在于「方向」:批归一化是横跨样本(沿着批的方向)归一化,层归一化是横跨特征(在单个样本之内)归一化。正是这一个选择,让坐在每个 Transformer 内部的是层归一化,而不是批归一化。

又称
layer normLN层归一化層正規化层标准化