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:控制计算设备和数据类型。

Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐