NLP中 batch normalization与 layer normalization

NLP中 batch normalization与 layer normalization

BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm总结

对于batch normalization实际上有两种说法,一种是说BN能够解决“Internal Covariate Shift”这种问题。简单理解就是随着层数的增加,中间层的输出会发生“漂移”。另外一种说法是:BN能够解决梯度弥散。通过将输出进行适当的缩放,可以缓解梯度消失的状况。

那么NLP领域中,我们很少遇到BN,而出现了很多的LN,例如bert等模型都使用layer normalization。这是为什么呢?

这要了解BN与LN之间的主要区别。

主要区别在于 normalization的方向不同!

Batch 顾名思义是对一个batch进行操作。假设我们有 10行 3列 的数据,即我们的batchsize = 10,每一行数据有三个特征,假设这三个特征是【身高、体重、年龄】。那么BN是针对每一列(特征)进行缩放,例如算出【身高】的均值与方差,再对身高这一列的10个数据进行缩放。体重和年龄同理。这是一种“列缩放”。

而layer方向相反,它针对的是每一行进行缩放。即只看一笔数据,算出这笔所有特征的均值与方差再缩放。这是一种“行缩放”。

细心的你已经看出来,layer normalization 对所有的特征进行缩放,这显得很没道理。我们算出一行这【身高、体重、年龄】三个特征的均值方差并对其进行缩放,事实上会因为特征的量纲不同而产生很大的影响。但是BN则没有这个影响,因为BN是对一列进行缩放,一列的量纲单位都是相同的。

那么我们为什么还要使用LN呢?因为NLP领域中,LN更为合适。

如果我们将一批文本组成一个batch,那么BN的操作方向是,对每句话的第一个词进行操作。但语言文本的复杂性是很高的,任何一个词都有可能放在初始位置,且词序可能并不影响我们对句子的理解。而BN是针对每个位置进行缩放,这不符合NLP的规律。

而LN则是针对一句话进行缩放的,且LN一般用在第三维度,如[batchsize, seq_len, dims]中的dims,一般为词向量的维度,或者是RNN的输出维度等等,这一维度各个特征的量纲应该相同。因此也不会遇到上面因为特征的量纲不同而导致的缩放问题。
在这里插入图片描述
假如我们的词向量是100(如图是立方体的高),batchsize是64(立方体中的N)。

BN:固定每句话的第一个位置,则这个切片是 (64, 100)维的矩阵。

LN:固定一句话,则切片是(seq_len, 100)维。

但是,BN取出一条 (1,64)的向量(绿色剪头方向)并进行缩放,LN则是取出一条(1, 100)维(红色箭头)进行缩放。

总体来看:

BN (64,j, k)

j代表一句话的某一位置 0 ~ seq_len 左闭右开。

k代表embedding dim范围 0 ~ 100维左闭右开。

因此,对于BN而言,batchsize的大小会影响BN效果。

如果我们输入batchsize = 128,即 BN (128,j, k)

则BN取出一条 (1,128)的向量并进行缩放。

LN (i, j, 100)

i代表 batchsize的范围, 0~64 左闭右开。

j代表一句话的某一位置 0 ~ seq_len 左闭右开。

因此batchsize的大小不影响LN。

但是如果我们换成了glove300d,则会影响~

### 批归一化层归一化的区别及其应用 #### 定义工作原理 批归一化(Batch Normalization, BN)是一种用于加速深层神经网络训练的技术,通过对每一批次的数据进行标准化处理,减少内部协变量偏移现象的发生[^2]。具体来说,在每次更新参数之前,BN会计算当前批次数据的均值和方差,并据此调整激活函数之前的输入。 相比之下,层归一化(Layer Normalization, LN)则是在单一样本的基础上操作,即针对每一个样本单独执行归一化过程,而不是基于整个mini-batch中的统计量。LN沿着特征维度计算平均数和标准偏差,从而确保同一层内不同位置上的节点具有相似分布特性[^4]。 #### 主要差异点 - **作用范围**:BN依赖于批量大小(batch size),当batch size较小时效果可能不佳;而LN不受限于此因素影响,适用于更广泛的情况。 - **稳定性**:由于BN涉及到跨样本次序的信息交换,因此对于序列型任务如RNN/LSTM等可能会引入额外噪声干扰长期依赖关系的学习效率。相反,LN可以更好地保持时间步之间的关联性不变形。 - **并行度支持**:在分布式环境中实施大规模模型训练时,BN需要同步各设备间产生的统计数据以维持一致性,增加了通信开销。然而,LN仅需关注局部区域内的数值变化情况即可完成相应变换,故而在多GPU/TPU集群部署方面具备一定优势。 #### 应用场景对比 - 对于计算机视觉领域常用的CNN架构而言,通常推荐采用BN机制来优化收敛速度及泛化性能表现。这是因为图像像素间的空间相关性强,利用全局信息有助于提升表征质量[^1]。 - 在自然语言处理(NLP)方向下构建Transformer之类的自注意力机制主导框架里,则更多倾向于选用LN方案。这类模型往往涉及较长距离上下文建模需求,LN能有效缓解梯度消失问题的同时还不会破坏原有语义结构完整性[^5]。 ```python import torch.nn as nn class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() # 使用BatchNorm的例子 self.conv = nn.Conv2d(3, 64, kernel_size=3) self.bn = nn.BatchNorm2d(64) # 使用LayerNorm的例子 self.fc = nn.Linear(1024, 512) self.ln = nn.LayerNorm(512) def forward(self, x): out_conv = F.relu(self.bn(self.conv(x))) flattened = out_conv.view(out_conv.size(0), -1) out_fc = F.relu(self.ln(self.fc(flattened))) return out_fc ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值