BatchNormalization和LayerNormalization的理解、适用范围、PyTorch代码示例

文章介绍了神经网络中归一化的重要性,对比了BatchNorm和LayerNorm的区别。BatchNorm适用于常规数据,对每个特征进行归一化,而LayerNorm针对NLP数据,对每条样本进行归一化,避免BN在处理序列数据时的问题。文中提供了PyTorch的代码示例来展示两种归一化的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


学习神经网络归一化时,文章形形色色,但没找到适合小白通俗易懂且全面的。学习过后,特此记录。

为什么要Normalization

当输入数据量级极大或极小时,为保证输出数据有效,参数必需被训练到一个极小或极大的区间,而这对初始化来说非常困难,且多层网络链式法则求导会导致梯度消失或爆炸的问题。

Reference:神经网络为什么要归一化
归一化的具体计算过程:优快云博客

BatchNorm

BN适用于大多数Dataframe样式的常规数据。
BN对每个特征进行归一化,如下图,分别计算身高归一化后的数据、体重归一化后的数据、年龄归一化后的数据。好理解。

LayerNorm

对于NLP数据,不适用于BN。
BN的逻辑是每个变量来自于某一特定分布,虽然每次只计算一个batch内的数据,但第一个batch(如前64名同学)的身高和第二个batch(后64名同学)的身高,大概率来自同样的分布。
而对文本数据来说,所有句子的第一个词不一定来自同一分布,第二个词也是。每个句子的长度也不同,对句子末尾几个词作BN就相当于对最长句子的最后一个词和一堆padding值作BN,没有意义。
这里就要用到LN,即对每条样本作归一化,即“横着”归一化。

torch代码示例

BatchNorm: 参考pytorch BatchNorm参数详解,计算过程

# BatchNorm
import torch.nn as nn
Class Net:
	def __ init__():
		self.bn = nn.BatchNorm1d(20,affine=True)
		pass
	def forward(x):
		# x:(N,L),对L个变量分别进行normalization
		out = self.ln(x)
		# out: (N,L)

LayerNorm: 参考pytorch 层标准化 LayerNorm 的用法

# LayerNorm
import torch.nn as nn
Class Net:
	def __ init__():
		self.ln = nn.LayerNorm(W,elementwise_affine=True)	# 只对最后一个维度
		self.ln = nn.LayerNorm([H,W],elementwise_affine = True)	# 对最后两个维度,即均值、方差一起求,拉伸成一个维度
		pass
	def forward(x):
		# x: (N, H ,W),对最后几个维度进行normalization
		out = self.ln1(x)
		out = self.ln2(x)
		# out: (N, seq_len, emb_dim),归一化不改变向量维度
<think>嗯,用户之前已经问过Layer Normalization的原理,现在又在问Layer NormBatch Norm的区别。看来他可能是在学习深度学习中的归一化技术,想要更深入理解两者的不同应用场景原理差异。我需要先回顾之前给他的回答,确保这次回答不重复但能补充新信息。 首先,用户可能已经了解了Layer Norm的基本步骤数学公式,现在需要对比两者的区别。需要从归一化的维度、适用场景、对批量大小的依赖、训练推理时的差异等方面展开。 要注意用户可能是学生或者刚入行的工程师,需要解释清楚技术术语,避免过于抽象。可能需要用例子或比喻来帮助理解,比如Batch Norm像在批量中比较,而Layer Norm则是单个样本内部调整。 另外,用户之前的问题提到了Batch Norm在CNN中的使用,而Layer Norm在Transformer中的应用,所以可以结合这些实际模型来举例,增强实用性。 还要检查是否有遗漏的关键点,比如Batch Norm在训练测试时的不同(使用移动平均),而Layer Norm则保持一致,这点很重要,应该包括进去。 最后,是否需要给出代码示例或可视化图表?用户之前的回答里有PyTorch代码,可能这次也可以简单提一下实现的不同,但重点放在区别上。需要保持结构清晰,分点列出,方便用户对比。</think>以下是 **Layer Normalization(层归一化)** 与 **Batch Normalization(批量归一化)** 的核心区别对比: --- ### 1. **归一化维度的本质区别** | **方法** | **归一化维度** | **数学表达式**(以输入张量 $X \in \mathbb{R}^{B \times D}$ 为例) | |---------------------|---------------------------------------------|--------------------------------------------| | **Batch Norm (BN)** | **批量维度(B)**:同一特征跨不同样本归一化 | 对每个特征维度$j$计算:<br>$$ \mu_j = \frac{1}{B} \sum_{i=1}^B x_{ij}, \quad \sigma_j^2 = \frac{1}{B} \sum_{i=1}^B (x_{ij} - \mu_j)^2 $$ | | **Layer Norm (LN)** | **特征维度(D)**:同一样本内不同特征归一化 | 对每个样本$i$计算:<br>$$ \mu_i = \frac{1}{D} \sum_{j=1}^D x_{ij}, \quad \sigma_i^2 = \frac{1}{D} \sum_{j=1}^D (x_{ij} - \mu_i)^2 $$ | --- ### 2. **依赖场景的差异** | **特性** | **Batch Norm** | **Layer Norm** | |----------------|-----------------------------------------|-----------------------------------------| | **依赖批量大小** | 需要较大的批量(如B=32+)保证统计稳定性 | 与批量大小无关,单样本也可计算 | | **训练/推理差异** | 推理时使用训练阶段的移动平均均值方差 | 训练与推理行为一致,无需存储移动平均 | | **适用模型** | CNN(图像类任务) | RNN、Transformer(序列模型) | --- ### 3. **直观对比示例** 假设输入数据为矩阵 $X$,形状为 $B \times D$(批量大小B,特征维度D): - **BN** 的计算: - 纵向计算(按列):每一列(特征)跨所有样本计算均值方差。 - **问题**:若批量中样本差异大(如不同类别),统计量可能不准确。 <div align=center><img src="https://i.imgur.com/dh4Vd5H.png" width="40%"></div> - **LN** 的计算: - 横向计算(按行):每一行(样本)内部所有特征计算均值方差。 - **优势**:对变长序列(如自然语言)更鲁棒。 <div align=center><img src="https://i.imgur.com/AM7u0rN.png" width="40%"></div> --- ### 4. **关键区别总结** | **维度** | **Batch Norm** | **Layer Norm** | |----------------|-----------------------------------------|-----------------------------------------| | **统计量来源** | 依赖同一批次内不同样本的同一特征 | 依赖同一样本内不同特征 | | **适用场景** | 固定长度的数据(如图像) | 变长数据(如文本、语音) | | **对批量的敏感性** | 小批量时性能下降明显 | 对批量大小不敏感 | | **训练稳定性** | 对噪声敏感(批量内样本差异大时不稳定) | 更稳定(仅依赖样本自身特征) | --- ### 5. **典型应用场景** 1. **Batch Norm**: - 图像分类(CNN中广泛使用) - 固定长度的数据(如ResNet、VGG) - 需要足够大的批量(通常B≥32) 2. **Layer Norm**: - 自然语言处理(Transformer中的核心组件) - 循环神经网络(RNN/LSTM缓解梯度消失) - 强化学习(小批量或单样本训练) --- ### 6. **代码实现对比(PyTorch)** ```python # Batch Norm(适用于图像) batch_norm = nn.BatchNorm1d(num_features=D) # 对D维特征进行BN output = batch_norm(input_tensor) # input_tensor形状为[B, D] # Layer Norm(适用于序列) layer_norm = nn.LayerNorm(normalized_shape=D) output = layer_norm(input_tensor) # input_tensor形状为[B, D] ``` --- ### 总结 - **Batch Norm**:通过跨样本归一化同一特征,依赖批量统计量,适合图像等**固定长度数据**。 - **Layer Norm**:通过样本内特征归一化,不依赖批量大小,适合**序列模型****动态输入**场景。 两者本质区别在于**归一化的维度选择**,需根据任务特点灵活使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值