最后更新于
最后更新于
Batch Normalization一个很关键的问题是, 均值方差等都是在一个batch中进行的, 如果一个batch中样本的数据量较少, 得到的统计值可能不能反映全局的统计情况. 因此Batch Normalization需要较大的batch size才能较好的work. 但是如果在有限的资源中运行越来越庞大的模型, 大的batch size很可能会导致内存的溢出.
此外, BN在动态网络中, 例如RNN网络中就难以使用.
Layer Normalization的做法是在单个样本进行归一化, 对于每个样本独立进行归一化, 与batch无关, 摆脱了batch size的限制.
与BN对于每个神经元进行Normalization的做法不同, Layer Normalization换了个方向, 对于网络中的一层, 每个样本使用同一个均值和方差, 然后对该层上所有的神经元的输入进行Normalization, 使输入在这一层上的分布得到调整, 对于第层, 有:
这里得到的统计量和是标量, 且与batch中样本的数量没有关系, 它只取决于隐层神经元节点的数量.
归一化后的值为:
Layer Normalization也需要一组可训练参数来保证输入不会均质化, 在LN中被称为增益(gain)和偏置(bias), 等同于BN中的和. 假定激活函数是, 最终这一层的输出为:
即:
这里的, 向量都是长度为的向量, 即对该层中每个神经元进行调整.
LN虽然不能像BN那样, 做到每个神经元输入归一化到相同的分布, 但至少做到了将每个训练样本都归一化到相同的分布上, 依然能够减轻ICS, 并平滑损失平面, 加速了收敛
事实上, 所有的Normalization都能够起到相同的作用.
在CNN中使用LN, 与使用BN类似, 存在参数共享的现象.
但是, 在CNN中使用LN, 一般效果不如BN, 在CNN中一般还是使用BN.
然后就可以采用与FNN中一样的方法进行归一化了:
一般来说, BN的效果仍然是由于LN的, 说明同一特征得到的归一化特征更不容易损失信息. 但有些场景是不能使用BN的, 如:
较小的batch size
RNN
优点
LN是针对单个训练样本进行的, 不受batch size大小的影响
LN是针对单个训练样本进行的, 因此也无序保留batch中的均值和方差, 节省了一些内存
能够在动态网络, 如RNN上使用
缺点
在CNN中效果不如BN
LN对同一层所有的神经元进行归一化, 一层中所有的神经元使用同样的转换, 如果输入的特征差异较大, 可能会出现降低模型表达能力的情况
这里有实验映衬了这种说法: .
假设卷积后, 进入激活函数之前, 此时的feature map的大小为, 其中是batch size, 为通道数量, 和分别为高和宽. Layer Normalization在维度上计算均值和标准差, 即每个样本在每层上使用一个均值和标准差标量. 因此, 对于第个样本, 其均值和标准差公式为:
要特别注意, LN中的去归一化参数, 增益, 偏置的维度等于进行归一化的大小(normalized shape), 在FNN中对应的是长度等于该层神经元数量的向量, 在CNN中的大小应为, 与之对比的是BN在CNN中的去归一化参数维度为.
能够在RNN中使用, 是LN很大的优点. 现在, 可以非常简单的在每个时间片中使用LN, 无论是水平方向还是垂直方向上. 对于时刻, 其输入为:
其中的是隐层中神经元的数量.