Layer Normalization 层参数详解以及与BatchNorm的对比
normalized_shape:指定归一化的 最后几个维度的大小,而不是 batch 维度。eps:防止除零,默认为 1e-5,可以调大增加稳定性。True(默认):使用 learnable gamma 和 beta 参数。False:只做归一化,不引入 learnable 参数。device 和 dtype:控制计算设备和数据类型。
torch.nn.LayerNorm 是 PyTorch 实现的 Layer Normalization 层,它可以对输入数据的指定维度进行归一化,从而提高深度学习模型的稳定性。下面我们详细介绍 nn.LayerNorm 的参数。
1. nn.LayerNorm 定义
torch.nn.LayerNorm(normalized_shape, eps=1e-5, elementwise_affine=True, device=None, dtype=None)
2.参数详细解析
(1)normalized_shape(必填参数)
-
作用:指定要进行归一化的维度大小。LayerNorm 会在这些维度上计算均值和标准差。
-
类型:int 或者 tuple
-
示例:
ln = nn.LayerNorm(10) # 归一化最后一个维度大小为 10 x = torch.randn(3, 5, 10) # ( C, H, W) y = ln(x) # LayerNorm 作用在最后一个维度 10 上 print(y.shape) # (3, 5, 10) ln = nn.LayerNorm((5, 10)) # 归一化最后两个维度大小为 (5, 10) x = torch.randn(3, 5, 10) # ( C, H, W) y = ln(x) # LayerNorm 作用在 (5,10) 上 print(y.shape) # (3, 5, 10)
若是想在通道维度上进行归一化操作,这里的参数值可以设置为3
问题来了,这个参数是作用的顺序是从最后的维度开始的
所以我们需要对维度进行转换
这里可以使用permute操作
ln = nn.LayerNorm(3) # 归一化最后一个维度大小为 3
x = torch.randn(3, 5, 10) # ( C, H, W)
x = x.permute(1,2,0) #转换成( H, W,C)
y = ln(x) # LayerNorm 作用在最后一个维度 10 上
x = x.permute(2,0,1)
print(y.shape) # (3, 5, 10)
(2)eps(默认 1e-5)
-
作用:防止除0错误,避免数值不稳定。
-
类型:float
-
数学公式:
σ=1N∑(xi−μ)2+ϵ \sigma = \sqrt{\frac{1}{N} \sum (x_i - \mu)^2 + \epsilon} σ=N1∑(xi−μ)2+ϵ
其中 ϵ 使得分母不会变成零。 -
示例:
ln = nn.LayerNorm(10, eps=1e-3) # 设定较大的 eps 以增加稳定性
(3)elementwise_affine(默认 True)
-
作用:如果为 True,LayerNorm 会引入 可学习参数 gamma(缩放因子) 和 beta(平移因子)。如果为 False,LayerNorm 仅仅进行归一化,不添加 gamma 和 beta。
-
类型:bool
-
数学公式:
y=γ⋅x^+β y = \gamma \cdot \hat{x} + \beta y=γ⋅x^+β
其中:γ(weight)是可学习的缩放参数 ;β(bias)是可学习的偏移参数 -
示例:
ln = nn.LayerNorm(10, elementwise_affine=False) # 不使用 learnable 参数
(4)device(默认 None)
-
作用:指定 LayerNorm 层的计算设备(CPU/GPU)。
-
类型:torch.device 或 str
-
示例:
ln = nn.LayerNorm(10, device="cuda") # 在 GPU 运行
(5)dtype(默认 None)
-
作用:指定 LayerNorm 的数据类型,例如 float32、float16 等。
-
类型:torch.dtype
-
示例:
ln = nn.LayerNorm(10, dtype=torch.float16) # 16 位精度计算
3.重要特性
(1)LayerNorm 计算均值和方差时,不依赖 batch 维度,因此适用于 小 batch-size 和 Transformer 结构。
(2)LayerNorm 作用在最后几个维度,而 BatchNorm 作用在 Channel 维度。
(3)elementwise_affine=True 时,LayerNorm 有可学习参数,类似于 BatchNorm。
4.示例代码
使用可学习参数
import torch
import torch.nn as nn
x = torch.randn(2, 3, 4) # (batch, feature_dim1, feature_dim2)
ln = nn.LayerNorm(4) # 归一化最后一个维度
y = ln(x)
print(y.shape) # (2, 3, 4)
print(ln.weight.shape) # (4,) 可学习参数 γ
print(ln.bias.shape) # (4,) 可学习参数 β
不使用可学习参数:
ln = nn.LayerNorm(4, elementwise_affine=False)
y = ln(x)
print(y.shape) # (2, 3, 4)
5. LayerNorm 与 BatchNorm 对比
| 特性 | LayerNorm | BatchNorm |
|---|---|---|
| 归一化维度 | 特征维度(feature_dim) | 通道维度(C 维) |
| 计算方式 | 每个 样本独立计算 | 依赖 整个 batch 统计量 |
| 是否依赖 Batch Size | 不依赖 Batch Size | 依赖 Batch Size |
| 是否适用于 RNN/Transformer | 是 | 否 |
| 适用于 CNN | 较少 | 常用 |
6.总结
normalized_shape:指定归一化的 最后几个维度的大小,而不是 batch 维度。
eps:防止除零,默认为 1e-5,可以调大增加稳定性。
elementwise_affine:
-
True(默认):使用 learnable gamma 和 beta 参数。
-
False:只做归一化,不引入 learnable 参数。
device 和 dtype:控制计算设备和数据类型。
更多推荐



所有评论(0)