携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情
批量归一化的加入,让网络效果更好,收敛更快。但批量归一化并不是适合所有类型的网络,例如 RNN,这是我们今天为什么要去介绍 layer normalization 的动机, 他可以解决批量归一化无法解决问题。
批量归一化存在着很多问题,例如不适合于序列数据,这是因为序列数据长度是变化,这样计算可变长度序列的均值和方差变得非常复杂。还有就是也不适合小批量的数据,过小批量数据的均值和方差无法反应数据集整体样本的均值和方差。
除了以上问题,因为批量归一化很难对网络进行并行计算。以上 3 问题都是因为批量归一化是依赖于批量处理,那么层归一化中不存在对批量的依赖,通过基于层而不是基于批量进行归一化
用一句话快速概括层归一化,就是对同一层的所有神经元的输入值,也就是一个样本数据进行归一化处理。同一层的所有神经元都有相同的归一化项,所以有相同的平均值和相同的方差,让我们看看这在实践中是如何工作的。
input = torch.tensor([
[5.,4,7,2],
[1,6,2,3],
[4,8,1,9]
])
mean,std = torch.mean(input,dim=0),torch.std(input,dim=0)
(input[:,] - mean)/std
在这样图中,通过2维空间来表示一个 batch, 每一列表示一个样本,每一行表示样本的特征,可以看出在左侧 BN 是在特征维度上进行归一化操作,而对于 LN 则是在列这个维度上进行归一化,也就是在输入神经网一层每一个样本进行归一化,这也就是为什么叫层归一化的原因。对于每一个样本来做归一化很好避免对了不同长度样本在特征维度做归一化带来问题。
由于层归一化是对每一个样本进行归一化,所以并不依赖于批量,所以可以做并行计算,也可以解决序列长短大小不一致的问题。同时因为是对于样本进行均值和方差,所以在训练和测试对于层归一化是没有区别的。
在上面图中列出当下一些归一化类型
- BN 也就是我们