NLP经典论文:Layer Normalization 笔记
- 论文
- 介绍
- 模型结构
- batch normalization 和 layer normalization 的相同点
- batch normalization 和 layer normalization 的不同点
- 相关视频
- 文章部分翻译
- Abstract
- 1 Introduction
- 2 Background
- 3 Layer normalization
- 3.1 Layer normalized recurrent neural networks
- 5 Analysis
- 5.1 Invariance under weights and data transformations
- 5.2 Geometry of parameter space during learning
- 5.2.1 Riemannian metric
- 5.2.2 The geometry of normalized generalized linear models
- Supplementary Material
- Application of layer normalization to each experiment
- 相关的笔记
- 相关代码
- pytorch
- tensorflow
- keras
- pytorch API:
- tensorflow API
论文
NLP论文笔记合集(持续更新)
原论文:《Layer Normalization》
CV经典论文:Batch Normalization 笔记
介绍
2016-07发表的文章,提出了 layer normalization 方法。batch normalization 是一种减少训练时间的方法,详细参考CV经典论文:Batch Normalization 笔记。在NLP任务中,如果将该方法应用于RNN网络,则需要为每一个时间步训练 batch normalization 的参数。但这样会出现问题,因为输入的句子长度并不固定,使得基于数据集计算用于 normalization 的均值 和方差
,在实际中效果并不好,而且预测时,对于输入句子长度比训练时要长的情况,在长了的句段,RNN在该时间步上也没有用于normalization 的均值和方差。为解决这个问题,该文章提出了 layer normalization 方法。
模型结构

来源:mingo_敏
图中 C 代表句子长度 seqlen,H,W 代表 embedding 的维度,N 代表 batch-size。
batch normalization 和 layer normalization 的相同点
batch normalization 和 layer normalization 都是先通过计算均值 和方差
来 normalize 输入
,再将 normalized 输入
传入仿射函数:
, 其中自适应增益
和偏置
normalization + 仿射的计算如下:
在RNN中,结构可参考NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记,一层的隐藏单元数量为 ,对于 batch normalization 和 layer normalization 来说,需要学习的
和
的参数数量都为
在 Transformer 中,结构可参考NLP经典论文:Attention、Self-Attention、Multi-Head Attention、Transformer 笔记,layer normalization 层需要学习的 和
的参数数量都为
batch normalization 和 layer normalization 的不同点
他们不同的地方在于计算均值 和方差
的方式不一样。batch normalization 按照绿色箭头方向计算,共计算得到
个均值
和方差
,这些值会保留在网络当中用于预测;layer normalization 则按照红色箭头方向计算,共计算得到
个均值
和方差
,这些值不会会保留在网络当中,在预测时会重新计算。
相关视频
文章部分翻译
Abstract
(注:summed input 指的是 中的
,其中
是该层的输入,
训练最先进的深度神经网络在计算上非常高成本的。减少训练时间的一种方法是 normalize 神经元的激活。最近引入的一种称为 batch normalization 的技术,使用 mini-batch 训练样例对一个神经元的 summed input 的分布,计算均值和方差,然后使用均值和方差 normalize 每个训练样例对该神经元的 summed input。这大大缩短了前馈神经网络的训练时间。然而,batch normalization 的效果取决于 mini-batch size,如何将其应用到RNN中也并不显而易见。在本文中,我们从单个训练样例在一个层中对所有神经元的 summed inputs,计算出用于 normalization 的均值和方差,来将 batch normalization 转换为 layer normalization。与 batch normalization 一样,我们也为每个神经元提供其自身的自适应偏置和增益,这些偏置和增益应用于 normalization 之后,于非线性激活之前。与 batch normalization 不同,layer normalization 在训练和测试时执行完全相同的计算。通过在每个时间步分别计算 normalization 统计量,也可以直接应用于RNN。layer normalization 对于稳定循环网络中的隐藏状态的动态过程非常有效。实验上,我们表明,与先前发布的技术相比,layer normalization 可以显著减少训练时间。
1 Introduction
在计算机视觉[Krizhevsky et al.,2012]和语音处理[Hinton et al.,2012]的各种监督学习任务中,使用某种形式的随机梯度下降训练的深度神经网络已被证明大大优于以前的方法。但是最先进的深层神经网络通常需要很多天的训练。通过在不同机器上计算不同训练样例子集的梯度或将神经网络本身拆分到多台机器上,可以加快学习速度[Dean等人,2012],但这可能需要大量通信和复杂软件。随着并行化程度的增加,它也会导致训练收益的迅速减少。正交方法是修改在神经网络前向传递中执行的计算,以使学习更容易。最近,提出了 batch normalization [Ioffe和Szegedy,2015],通过在深度神经网络中加入额外的 normalization 阶段来减少训练时间。normalization 使用训练数据中的平均值和标准偏差对每个 summed input 进行 normalization。使用 batch normalization 训练的前馈神经网络,即使使用简单的SGD也能更快地收敛。除了训练时间的改进外,batch 的统计量的随机性在训练期间也起到了正则化的作用。
尽管 batch normalization 很简单,但它需要 summed input 的统计量的运行平均值。在具有固定深度的前馈网络中,每个隐藏层很容易存储各自的统计量。然而,在循环神经网络(RNN)中,循环神经元的 summed input 通常随序列长度的变化而变化,因此对RNN应用 batch normalization 似乎需要不同时间步的不同统计信息。此外,batch normalization 不能应用于在线学习任务,也不能应用于 mini-batch 必须很小的超大分布式模型。
本文介绍了一种简单的 normalization 方法——layer normalization,以提高各种神经网络模型的训练速度。与 batch normalization 不同,该方法直接从隐层神经元的 summed inputs 估计 normalization 统计量,因此 normalization 不会在训练样例之间引入任何新的依赖关系。我们证明了 layer normalization 对于RNN非常有效,并且改进了现有几种RNN模型的训练时间和泛化性能。
2 Background
前馈神经网络是从输入样例 到输出向量
的非线性映射。考虑深度前馈神经网络中的第
个隐藏层,并且让
为该层中对所有神经元的 summed inputs 的矢量表示。通过线性投影计算 summed inputs,加权矩阵
和自底向上输入
如下所示:
其中
是对应元素逐个相乘的非线性函数,
是第
个隐藏单元的传入权重,
(注:我们将训练过程中深层网络内部节点分布的变化称为 Internal Covariate Shift。)
深度学习的挑战之一是,一层中权重的梯度高度依赖于前一层神经元的输出,特别是当这些输出以高度相关的方式变化时。batch normalization [Ioffe和Szegedy,2015]是为了减少这种不希望得到的“covariate shift”。该方法 normalize 了训练样例中每个隐藏单元的 summed inputs。具体地说,对于第 层中的第
个 summed input,batch normalization 方法根据其在数据分布下的方差重新缩放 summed input
其中,
是第
层中的第
个隐藏单元的 normalized summed input,
是在非线性激活函数之前缩放 normalized 激活的增益参数。注:期望值是在整个训练数据集分布下的。准确计算公式(2)中的期望值通常是不切实际的,因为它需要使用当前这组权重的整个训练数据集的向前传播。相反,使用当前 mini-batch 的实验样本估算
和
。这就限制了 mini-batch 的大小,很难应用于循环神经网络。
3 Layer normalization
我们现在考虑 layer normalization 方法,其目的是克服 batch normalization 的缺点。
请注意,一层输出的变化往往会导致下一层的 summed inputs 发生高度相关的变化,特别是那些使用ReLU的单元,它的输出可能发生很大变化。这表明,可以通过固定各层内 summed inputs 的平均值和方差来减少“covariate shift”问题。因此,我们计算同一层中所有隐藏单元的 layer normalization 统计量,如下所示:其中
表示层中隐藏单元的数量。等式(2)和等式(3)之间的区别在于,在 layer normalization 下,层中的所有隐藏单元共享相同的归一化项
和
,但不同的训练样例具有不同的 normalization 项。与 batch normalization 不同,layer normalization 不会对 mini-batch 的大小施加任何约束,它可以用于 batch size 为1的纯在线系统。
3.1 Layer normalized recurrent neural networks
最近的 sequence to sequence 模型[Sutskever等人,2014]利用紧凑的循环神经网络来解决自然语言处理中的序列预测问题。在NLP任务中,对于不同的训练样例,有不同的句子长度是很常见的。这在RNN中很容易处理,因为在每个时间步使用相同的权重。但是,当我们以明显的方式对RNN应用 batch normalization 时,我们需要为序列中的每个时间步计算和存储单独的统计信息。如果测试序列比任何训练序列都长,这是有问题的。layer normalization 没有这样的问题,因为它的 normalization 项只依赖于当前时间步对于层的 summed inputs。它也只有一组在所有时间步上共享的增益和偏置参数。
在标准RNN中,根据当前输入 和先前隐藏状态向量
计算循环层中的 summed inputs,计算为
。该层使用类似于等式(3)的额外归一化项重新中心化与缩放其激活:
其中
是循环的 hidden-to-hidden 的权重,
是自底向上 input-to-hidden 的权重。
是两个向量之间的元素相乘。
和
定义为与
在标准RNN中,循环单元的 summed inputs 的平均幅度在每个时间步都有增长或收缩的趋势,导致梯度爆炸或消失。在 layer normalized RNN中,normalization 项使得在一个层中的对所有 summed inputs 的重新缩放保持不变,从而产生更稳定的 hidden-to-hidden 的动态过程。
5 Analysis
在本节中,我们将研究不同 normalization 方案的不变性。
5.1 Invariance under weights and data transformations
提出的 layer normalization 与 batch normalization 和权重 normalization 有关。尽管它们的 normalization 标量的计算方式不同,但这些方法可以概括为通过两个标量 和
对神经元的总输入
进行 normalization。在 normalization 后,他们还学习每个神经元的自适应偏置
和增益
。
注意,对于 layer normalization 和 batch normalization,
和
根据公式2和3计算。在权重 normalization 中,
为0,
。

表1突出显示了三种 normalization 方法的不变性结果。
Weight re-scaling and re-centering:首先,观察在 batch normalization 和权重 normalization 下,对单个神经元传入权重 的任何重新缩放对神经元的 normalized summed inputs 没有影响。精确地说,在 batch normalization 和权重 normalization 下,如果权重向量按
缩放,那么两个标量
和
也将按
缩放。normalized summed inputs 在缩放前后保持不变。因此,batch normalization 和权重 normalization 对权重的重新缩放是不变的。另一方面,layer normalization 对于单个权重向量的单独缩放不是不变的。相反,layer normalization 对整个权重矩阵的缩放是不变的,对权重矩阵中所有传入权重的平移量是不变的。假设有两组模型参数
,
,其权重矩阵为
和
是不一样的,
通过比例因子
缩放并且所有传入权重也被一个常数向量
平移,即
. 在 layer normalization 下,两个模型有效地计算相同的输出:
请注意,如果 normalization 仅应用于权重之前的输入,那么模型将不会对权重的重新缩放和重新居中保持不变。
Data re-scaling and re-centering:通过证实神经元的 summed inputs 在变化下保持不变,我们可以证明所有的 normalization 方法对重新缩放数据集是不变的。此外,layer normalization 对于单个训练样例的重新缩放是不变的,因为等式(3)中的 normalization 标量 和
仅依赖于当前输入数据。让
是一个新的数据点,通过
重新缩放
获得。那么我们有,
很容易看出,在 layer normalization 下,重新缩放单个数据点不会改变模型的预测。与 layer normalization 中权重矩阵的重新中心化类似,我们还可以证明 batch normalization 对数据集的重新中心化是不变的。
5.2 Geometry of parameter space during learning
我们研究了模型预测在参数重新中心化和缩放下的不变性。然而,在不同的参数化下,学习的行为可能会非常不同,即使模型表达了相同的底层功能。在本节中,我们将通过参数空间的几何和流形来分析学习行为。我们证明了 normalization 标量
5.2.1 Riemannian metric
统计模型中的可学习参数形成一个光滑流形,由模型的所有可能输入输出关系组成。对于输出为概率分布的模型,度量此流形上两点的分隔的自然方法是其模型输出分布之间的 Kullback-Leibler 散度。在 KL 散度度量下,参数空间是黎曼流形。
黎曼流形的曲率完全由其黎曼度量所获得,黎曼度量的二次型表示为 。这是参数空间中某一点在切线空间中的无穷小距离。直观地说,它沿切线方向测量参数空间中模型输出的变化。之前曾研究过 KL 下的黎曼度量[Amari,1998],并使用 Fisher 信息矩阵证明其在二阶泰勒展开下具有良好的近似性:

其中,
5.2.2 The geometry of normalized generalized linear models
我们将几何分析的重点放在广义线性模型上。以下分析的结果可以很容易地应用于理解深度神经网络,该网络具有 Fisher 信息矩阵的块对角近似,其中每个块对应于单个神经元的参数。
广义线性模型(GLM)可被视为使用权重向量 和偏置标量
对指数族的输出分布进行参数化。为与前面章节一致,GLM 的对数似然可使用 summed inputs
写成如下:

式中, 是神经网络中模拟非线性的传递函数,
是传递函数的导数,
是实值函数,
是对数配分函数。
是缩放输出方差的常数。假设
维输出向量
使用
个独立的 GLM 和
建模。设
为权重矩阵,其行为单个 GLM 的权重向量,
表示长度
的偏置向量,
表示 Kronecker 向量算子。多维 GLM 关于其参数
的 Fisher 信息矩阵只是数据特征和输出协方差矩阵的预期 Kronecker 乘积:

我们通过将 normalization 方法获得多个 normalized GLM,该方法通过 和
应用于原始模型中的 summed inputs
。在不丧失一般性的情况下,我们将
表示为 normalized 多维GLM下的 Fisher 信息矩阵,带有额外增益参数
:

Implicit learning rate reduction through the growth of the weight vector:请注意,与标准 GLM 相比,沿权重向量 方向的块
由增益参数和 normalization 标量
缩放。如果权重向量
的范数增长两倍大,即使模型的输出保持不变,Fisher 信息矩阵也将不同。沿
方向的曲率将变为1/2倍,因为
Learning the magnitude of incoming weights:在标准化模型中,传入权重的大小由增益参数显式参数化。在学习过程中,我们比较了在 normalized GLM 中更新增益参数和在原始参数化下更新等效权重的大小之间模型输出的变化。沿
Supplementary Material
Application of layer normalization to each experiment
本节描述了如何将 layer normalization 应用到每一篇论文的实验中。为了便于记法,我们将 layer normalization 定义为具有两组自适应参数(增益 和偏差
)的函数映射
。
其中,
是向量
的第
相关的笔记
模型优化之Layer Normalization
相关代码
pytorch
Docs > torch.nn > LayerNorm
torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True, device=None, dtype=None)
如本文Layer Normalization所述,对一个 mini-batch 的输入应用 Layer Normalization

计算最后 D 个维度的均值和标准差,其中 D 是 normalized_shape 的维度。例如,如果 normalized_shape 为(3,5)(二维形状),则计算输入的最后两个维度的均值和标准差(即 input.mean((-2, -1)) )。如果 elementwise_affine = True,则 和
注意:
与 Batch Normalization 和 Instance Normalization 不同,Batch Normalization 和 Instance Normalization 使用 affine 选项为每个通道/平面应用标量比例因子和偏置,Layer Normalization 使用 elementwise_affine 选项为每个元素应用比例因子和偏置。
该层使用从训练和 evaluation 模式中的输入数据计算的统计量。
Parameters:normalized_shape (int or list or torch.Size) —— 输入形状从预期输入的大小为
。如果使用单个整数,它将被视为一个单例列表,并且该模块将在最后一个维度上进行 normalization,该维度预计是该特定大小的维度。
eps —— 为数值稳定性增加分母的值。默认值:1e-5,公式中的
elementwise_affine —— 一个布尔值,当设置为 True 时,此模块将每元素的可学习的仿射参数初始化为1(用于权重)和0(用于偏置)。默认值:True。
Variables:~LayerNorm.weight —— 形状为 normalized_shape 的模块的可学习权重当 elementwise_affine 设为 True。这些值被初始化为1。
~LayerNorm.bias —— 形状为 normalized_shape 的模块的可学习偏置当 elementwise_affine 设为 True。这些值被初始化为0。
Shape:Input: (N, *)
Output: (N, *)(same shape as input)

tensorflow
keras
pytorch API:
tensorflow API
















