BatchNorm 与 LayerNorm

今天重看Transformer,发现里面提到了BatchNorm和LayerNorm两种归一化方法,在这儿做一下总结和整理。

1. BatchNorm批量归一化

在这里插入图片描述

BatchNorm把 同一个batch中,通一通道的所有特征(红色区域) 视为一个分布(有多少个通道就有多少个分布),并将其标准化。

  • 不同图片的同一通道的相对关系是保留的,特征是可以比较的
  • 同一图片的不同通道的特征失去了可比性

【用于CV的通俗理解】

有一些可解释性方面的观点认为,feature的每个通道都对应一种特征(如低维特征的颜色,纹理,亮度等,高维特征的人眼,鸟嘴特征等)。

BatchNorm后不同图片的同一通道的特征是可比较的,或者说A图片的纹理特征和B图片的纹理特征是可比较的;而同一图片的不同特征则是失去了可比性,或者说A图片的纹理特征和亮度特征不可比较。


2. LayerNorm层归一化

在这里插入图片描述

LayerNorm把 一个样本的所有词向量(如上图红色部分) 视为一个分布(有几个句子就有几个分布),并将其标准化。

  • 同一个句子中的词向量(图中的 v 1 v_1 v1 v 2 v_2 v2,…, v L v_L vL)的相对大小是保留的,或者说LayerNorm 不改变词向量的方向,只改变它的模。
  • 不同句子的词向量则失去了对比性。

【用于NLP的通俗理解】

考虑两个句子:

  • 教练,我想打篮球!
  • 老板,我要一打啤酒。

通过比较两个句子中 “打” 的词义我们可以发现,词义并非客观存在的,而是由上下文的语义决定的

因此进行标准化时不应该破坏同一句子中不同词义向量的可比性,而BatchNorm则是不满足这一点的。且不同句子的词义特征也不应具有可比性,LayerNorm也是能够把不同句子间的可比性消除。


3. BatchNorm 和 LayerNorm 对比

1d Norm:
在这里插入图片描述
2d Norm:

在这里插入图片描述

Batch Normalization是针对特征feature的某一个具体维度,计算它在seq的所有维度(即全部token)和batch的所有维度(即全部样本)上的均值和方差,即将这个二维平面内的所有元素展平然后计算均值和方差,最后得到的是长度为feature_len的一个一维tensor,一般会进行扩维变成(1,1,feature_len),这样就可以通过广播机制自我复制来对输入x进行归一化处理了。

在这里插入图片描述

Layer Normalization是针对batch中的单一样本(即一个句子)中的单一token(t_i),计算它在feature的所有维度(即全部d)上的均值和方差,最后得到的是形为(batch_size, seq_len)的一个二维张量同样会扩维变成(batch_size, seq_len, 1),使得可以通过广播机制自我复制来对输入x进行归一化处理。

【关于LayerNorm:上图基本是基于李沐的讲解,沐神讲的是两种norm都对应一个切面,BatchNorm是纵切面,LayerNorm是横切面,但是LayerNorm的代码实现基本都是dim=-1,这样就不再是一个切面而是一条直线。】


1. 作用方式不同

BatchNorm:对 每个特征mini-batch 数据上进行归一化。

LayerNorm:对 每个样本所有特征 进行归一化。

2. 计算方式不同

BatchNorm:均值和方差是在每个批次上计算的,依赖于批次中的所有样本。BatchNorm会维护每个特征通道的均值和方差,用来归一化每个样本中的每个特征。

LayerNorm:均值和方差是在每个样本上计算的,独立于批次。LayerNorm计算每个样本的每个特征通道的均值和方差,并用来归一化该样本在每一层上的所有特征。

3. 应用场景不同

BatchNorm:更适用于CV领域。比如3维特征的图像在做BN时,相当于对不同样本的同一通道内的特征做标准化。

LayerNorm:更适用于NLP领域。因为NLP或者序列任务来说,一条样本的不同特征,其实就是时序上字符取值的变化,样本内的特征关系是非常紧密的。

4. BatchNorm 和 LayerNorm 怎么选择

在这里插入图片描述

1)对于BatchNorm,我们所需要计算均值和方差的是一个[batch_size × seq_len]的平面,在这个平面中,对于batch中的每一个样本,他们的seq_len都是不同的,有的长有的短,只不过最后都用0来补齐了。
这样当我们计算均值和标准差时,就会因为这些存在的许多的0使得均值和标准差不能很好地反映有效数据的真实分布,造成偏差。

2)采用LayerNorm的方式,每个样本单独考虑自己内部的分布,自己样本的seq_len是多少就计算多少个token,padding填充的不需要再考虑,因此更能反映数据的真实分布特性。

比如说对于第一个样本sample 1,他有3个有效token,分别是token 1-3,这三个token每个在底层都由一个长为feature_len的向量表示,LayerNorm就是这3个token每一个token在自己的feature_len上面(类比一下Transformer中一个token用d_model=512维度的向量表示)计算均值和方差,然后做更新。

这样做的本质意义在于,把有效元素的规范化过程限制在有效元素内部,规避掉无效元素的干扰


References

  1. Batch Norm 与 Layer Norm 比较
  2. layerNorm和batchNorm
  3. 关于BatchNorm和LayerNorm的实现细节讨论
### Batch Normalization Layer Normalization 的区别 Batch Normalization (BN) 是一种用于加速深层网络训练的技术,通过减少内部协变量偏移来提高模型性能[^1]。具体来说,在每个 mini-batch 中对每一层神经元的输入进行标准化处理,使其均值接近于零,方差接近于一。 相比之下,Layer Normalization (LN) 则是在单一样本上操作,针对同一时间步下的特征维度做归一化。这意味着 LN 不依赖 batch size 或者数据分布的变化,因此更适合序列建模任务以及较小批次大小的情况[^5]。 #### 主要差异: - **作用范围不同** - BN 对整个 mini-batch 内的数据一起计算统计量并实施变换; - LN 只考虑当前样本内的各个通道/位置上的数值关系来进行调整。 - **适用场景有别** - 当批尺寸较大且稳定时,BN 能够提供更好的效果;但如果遇到动态变化较大的环境,则可能不如 LN 表现得那么稳健。 - 在自然语言处理领域中的 RNN/LSTM 结构里,由于其固有的长期依赖特性决定了每一步的状态更新都至关重要,所以采用 LN 更有利于保持这种稳定性。 ```python import torch.nn as nn # 定义带有BN层的简单卷积模块 class ConvBlockWithBN(nn.Module): def __init__(self, in_channels, out_channels): super(ConvBlockWithBN, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) # 使用LN的例子可以应用于Transformer架构中 from transformers import BertModel model = BertModel.from_pretrained('bert-base-uncased') for name,param in model.named_parameters(): if 'layer_norm' in name: print(f"{name}: {param.shape}") ``` #### 应用实例分析 对于图像识别任务而言,通常会优先选用 BN 来增强模型收敛速度泛化能力;而在文本生成、机器翻译等涉及长程记忆的任务中,LN 显示出了独特的优势,因为它能够更好地适应变长输入的特点,并有助于缓解梯度消失问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值