在文献中 层归一化 (Layer Normalization) 一般被定义为: 对单样本进行归一化 (计算单样本所有元素的均值和方差, 用其对该样本的所有元素做 zscore 归一化), 然后利用可学习的 beta 和 gamma 参数对归一化的样本进行 affine 运算 (形如 gamma * x + beta, beta 和 gamma 参数的尺寸一般等于通道数, 不过 PyTorch 中的实现有点特别, beta 和 gamma 参数的尺寸与归一化尺寸 normalized_shape
相同).
假设输入数据尺寸为 (batch_size, sequence_len, embedding_size), 按照上述定义, 层归一化是在第二和第三维度上做的, 然而在 Transformer 中, 层归一化只在最后一个维度上 (即通道维度上) 进行 (如 transformers.BertModel
中), 与一般定义不符. 严格意义上这种只在通道维度上进行的归一化称为通道归一化 (Channel Normalization) 更为恰当, 不过已经约定俗成了, 不妨将其视为层归一化的一种变形形式.
参考:
- [2016] Layer Normalization
- [2021 ICCVW] Leveraging Batch Normalization for Vision Transformers
- tf.contrib.layers.layer_norm
- torch.nn.LayerNorm
修改历史
- 20240416 发布
版权声明
署名-非商业性使用-相同方式共享 4.0 国际许可协议