上一篇博客提到了BN不适用于RNN等动态网络以及batchsize较小的时候,而LN可以。这篇博客就对LN做一个简单的介绍。
深度网络中的数据维度一般是[N, C, H, W]或者[N, H, W,C]格式,N是batch size,H/W是feature的高/宽,C是feature的channel,压缩H/W至一个维度,其三维的表示如上图,假设单个方格的长度是1,那么其表示的是[6, 6,*, * ]。LN避开了batch维度,归一化的维度为[C,H,W]。简单来说,对同一样本的不同特征做归一化。
背景
BN针对一个minibatch的输入样本,计算均值和方差,基于计算的均值和方差来对某一层神经网络的输入X中每一个case进行归一化操作。但BN有两个明显不足:
1、高度依赖于mini-batch的大小,实际使用中会对mini-Batch大小进行约束,不适合类似在线学习(mini-batch为1)情况;
2、不适用于RNN网络中normalize操作:BN实际使用时需要计算并且保存某一层神经网络mini-batch的均值和方差等统计信息,对于对一个固定深度的前向神经网络(DNN,CNN)使用BN,很方便;但对于RNN来说,sequence的长度是不一致的,换句话说RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其的sequence长很多,这样training时,计算很麻烦。
但LN可以有效解决上面这两个问题。
MLP中的LN
LN是一个独立于batch size的算法,所以无论样本数多少都不会影响参与LN计算的数据量,从而解决BN的两个问题。
先看MLP中的LN。设 H 是一层中隐层节点的数量, l 是MLP的层数,我们可以计算LN的归一化统计量 μ 和 σ :
注意上面统计量的计算是和样本数量没有关系的,它的数量只取决于隐层节点的数量,所以只要隐层节点的数量足够多,我们就能保证LN的归一化统计量足够具有代表性。
其中 ϵ是一个很小的小数,防止除0(论文中忽略了这个参数)。
在LN中我们也需要一组参数来保证归一化操作不会破坏之前的信息,在LN中这组参数叫做增益(gain)和偏置(bias)(等同于BN中的 γ 和β)。假设激活函数为f,最终LN的输出为:
合并公式(2),(3)并忽略参数 l,我们有:
RNN中的LN
在RNN中,我们可以非常简单的在每个时间片中使用LN,而且在任何时间片我们都能保证归一化统计量统计的是 H个节点的信息。对于RNN时刻 t 时的节点,其输入是 t-1时刻的隐层状态H t-1和 t 时刻的输入数据 X t ,可以表示为:
接着我们便可以在 a t 上采取和1.1节中完全相同的归一化过程:
总结
LN是和BN非常近似的一种归一化方法,不同的是BN取的是不同样本的同一个特征,而LN取的是同一个样本的不同特征。在BN和LN都能使用的场景中,BN的效果一般优于LN,原因是基于不同数据,同一特征得到的归一化特征更不容易损失信息。