Layer Normalization原理介绍

1. 引言

前面介绍了Batch Normalization的原理,我们知道,BN层在CNN中可以加速模型的训练,并防止模型过拟合和梯度消失。但是,如果将BN层直接应用在RNN中可不可行呢,原则上也是可以的,但是会出现一些问题,因为我们知道Batch Normalization是基于mini batch进行标准化,在文本中,不同的样本其长度往往是不一样的,因此,如果在每一个时间步也采用Batch Normalization时,则在不同的时间步其规范化会强行对每个文本都执行,因此,这是不大合理的,另外,在测试时,如果一个测试文本比训练时的文本长度长时,此时Batch Normalization也会出现问题。因此,在RNN中,我们一般比较少使用Batch Normalization,但是我们会使用一种非常类似的做法,即Layer Normalization,本文将具体介绍一下该方法的原理。

  • 论文地址:《Layer Normalization》

2. Layer Normalization原理介绍

Layer Normalization的思想与Batch Normalization非常类似,只是Batch Normalization是在每个神经元对一个mini batch大小的样本进行规范化,而Layer Normalization则是在每一层对单个样本的所有神经元节点进行规范化。

对于RNN的每个时间步,其输入都会包含两部分,即当前的输入 x t x^{t} xt和上一个时刻的隐藏状态 h t − 1 \mathbf{h}^{t-1} ht1,记 a t = W h h h t − 1 + W x h x t \mathbf{a}^{t}=W_{h h} h^{t-1}+W_{x h} \mathbf{x}^{t} at=Whhht1+Wxhxt,其中, W h h W_{h h} Whh W x h W_{x h} Wxh为对应的权重矩阵,则在每一个时刻,Layer Normalization对每一个样本都分别计算所有神经元的均值和标准差如下:
μ t = 1 H ∑ i = 1 H a i t \mu^{t}=\frac{1}{H} \sum_{i=1}^{H} a_{i}^{t} μt=H1i=1Hait
σ t = 1 H ∑ i = 1 H ( a i t − μ t ) 2 \sigma^{t}=\sqrt{\frac{1}{H} \sum_{i=1}^{H}\left(a_{i}^{t}-\mu^{t}\right)^{2}} σt=H1i=1H(aitμt)2
其中, H H H为RNN层的维度,接着,对各个神经元的输出进行规范化并传入非线性激活函数:
h t = f [ g σ t ⊙ ( a t − μ t ) + b ] \mathbf{h}^{t}=f\left[\frac{\mathbf{g}}{\sigma^{t}} \odot\left(\mathbf{a}^{t}-\mu^{t}\right)+\mathbf{b}\right] ht=f[σtg(atμt)+b]
其中, g g g b b b为引入的自适应增益和偏置参数,其作用与Batch Normalization中的参数一样,为了保留模型的非线性能力, g g g b b b的维度均为 H H H,值得注意的是,在每个时间步, g g g b b b都是共享的。作者在实验中发现,Layer Normalization对 g g g b b b的初始化不敏感,一般默认将 g g g初始化为1,将 b b b初始化为0。

作者通过实验发现,在RNN中,使用Layer Normalization的效果要比Batch Normalization更优,可以更快、更好地达到最优效果。
Layer Normalization原理介绍_第1张图片

3. 总结

以上就是对Layer Normalization的原理介绍,如果前面有学过Batch Normalization,则会发现其实Layer Normalization并没有什么新奇的地方,只是两者计算均值和标准差的对象不一样。最后还是总结一下:

  • Layer Normalization可以提高模型的训练速度和精度,使得模型更加稳健。
  • Layer Normalization可以适用于单样本的情况,在RNN中效果比Batch Normalization更优。

你可能感兴趣的:(文本生成)