Layer Normalization原理介绍
1. 引言
前面介绍了Batch Normalization的原理,我们知道,BN层在CNN中可以加速模型的训练,并防止模型过拟合和梯度消失。但是,如果将BN层直接应用在RNN中可不可行呢,原则上也是可以的,但是会出现一些问题,因为我们知道Batch Normalization是基于mini batch进行标准化,在文本中,不同的样本其长度往往是不一样的,因此,如果在每一个时间步也采用Batch Normalization时,则在不同的时间步其规范化会强行对每个文本都执行,因此,这是不大合理的,另外,在测试时,如果一个测试文本比训练时的文本长度长时,此时Batch Normalization也会出现问题。因此,在RNN中,我们一般比较少使用Batch 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}
ht−1,记
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=Whhht−1+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=1∑Hait
σ
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=1∑H(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更优,可以更快、更好地达到最优效果。

3. 总结
以上就是对Layer Normalization的原理介绍,如果前面有学过Batch Normalization,则会发现其实Layer Normalization并没有什么新奇的地方,只是两者计算均值和标准差的对象不一样。最后还是总结一下:
- Layer Normalization可以提高模型的训练速度和精度,使得模型更加稳健。
- Layer Normalization可以适用于单样本的情况,在RNN中效果比Batch Normalization更优。