LayerNorm

部署运行你感兴趣的模型镜像

MXnet LayerNorm

在这里插入图片描述

 

pytorch LayerNorm

说明

LayerNorm中不会像BatchNorm那样跟踪统计全局的均值方差,因此train()和eval()对LayerNorm没有影响。

LayerNorm参数

torch.nn.LayerNorm(
        normalized_shape: Union[int, List[int], torch.Size],
        eps: float = 1e-05,
        elementwise_affine: bool = True)

normalized_shape

如果传入整数,比如4,则被看做只有一个整数的list,此时LayerNorm会对输入的最后一维进行归一化,这个int值需要和输入的最后一维一样大。

  • 假设此时输入的数据维度是[3, 4],则对3个长度为4的向量求均值方差,得到3个均值和3个方差,分别对这3行进行归一化(每一行的4个数字都是均值为0,方差为1);LayerNorm中的weight和bias也分别包含4个数字,重复使用3次,对每一行进行仿射变换(仿射变换即乘以weight中对应的数字后,然后加bias中对应的数字),并会在反向传播时得到学习。

如果输入的是个list或者torch.Size,比如[3, 4]或torch.Size([3, 4]),则会对网络最后的两维进行归一化,且要求输入数据的最后两维尺寸也是[3, 4]。

  • 假设此时输入的数据维度也是[3, 4],首先对这12个数字求均值和方差,然后归一化这个12个数字;weight和bias也分别包含12个数字,分别对12个归一化后的数字进行仿射变换(仿射变换即乘以weight中对应的数字后,然后加bias中对应的数字),并会在反向传播时得到学习。
  • 假设此时输入的数据维度是[N, 3, 4],则对着N个[3,4]做和上述一样的操作,只是此时做仿射变换时,weight和bias被重复用了N次。
  • 假设此时输入的数据维度是[N, T, 3, 4],也是一样的,维度可以更多。

注意:显然LayerNorm中weight和bias的shape就是传入的normalized_shape。

eps

归一化时加在分母上防止除零。

elementwise_affine

如果设为False,则LayerNorm层不含有任何可学习参数。

如果设为True(默认是True)则会包含可学习参数weight和bias,用于仿射变换,即对输入数据归一化到均值0方差1后,乘以weight,即bias。

LayerNorm前向传播(以normalized_shape为一个int举例)

  1. 如下所示输入数据的shape是(3, 4),此时normalized_shape传入4(输入维度最后一维的size),则沿着最后一维(沿着最后一维的意思就是对最后一维的数据进行操作)求E[x]Var[x],并用这两个结果把batch沿着最后一维归一化,使其均值为0,方差为1。归一化公式用到了eps(\epsilon),即y=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon }}
    tensor = torch.FloatTensor([[1, 2, 4, 1],
                                [6, 3, 2, 4],
                                [2, 4, 6, 1]])
    此时E[x]=[2.0, 3.75, 3.25]Var[y]_{biased}=[1.5000, 2.1875, 3.6875](有偏样本方差),归一化后的值如下,举例说明:第0行第2列的数字4,减去第0行的均值2.0等于2,然后除以\sqrt{1.5+\epsilon }=\sqrt{1.50001}=1.224749即2/1.224749≈1.6330。
    [[-0.8165,  0.0000,  1.6330, -0.8165],
     [ 1.5213, -0.5071, -1.1832,  0.1690],
     [-0.6509,  0.3906,  1.4321, -1.1717]]

 

  1. 如果elementwise_affine==True,则对归一化后的batch进行仿射变换,即乘以模块内部的weight(初值是[1., 1., 1., 1.])然后加上模块内部的bias(初值是[0., 0., 0., 0.]),这两个变量会在反向传播时得到更新。
  2. 如果elementwise_affine==False,则LayerNorm中不含有weightbias两个变量,只做归一化,不会进行仿射变换。

 

内容部分来自 :https://blog.youkuaiyun.com/weixin_39228381/article/details/107939602

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

Layer Normalization(LN)是一种在神经网络中标准化激活值的技术,旨在解决Batch Normalization(BN)在某些模型结构中的局限性。LN的核心思想是对每个样本的特征进行标准化,而不是像BN那样对批量中的每个特征进行标准化。 ### 原理 在Batch Normalization中,标准化是基于批量(batch)进行的,即对每个特征通道计算均值和方差,然后对批量中的样本进行标准化。然而,这种方法在处理变长序列时(如RNN中的不同长度句子)存在局限性,因为批量的大小和序列的长度可能会变化,导致BN的效果不稳定。Layer Normalization通过在特征维度上计算均值和方差来解决这一问题。具体来说,对于每个样本,LN会计算其所有特征的均值和方差,并使用这些统计量对特征进行标准化。这种处理方式使得LN在处理变长序列和小批量数据时表现更优。 ### 公式 假设输入数据为 $x$,其中 $x \in \mathbb{R}^{N \times D}$,$N$ 是批量大小,$D$ 是特征维度。对于每个样本 $x_i \in \mathbb{R}^D$,LN 的计算步骤如下: 1. **计算均值**: $$ \mu_i = \frac{1}{D} \sum_{d=1}^D x_{i,d} $$ 2. **计算方差**: $$ \sigma_i^2 = \frac{1}{D} \sum_{d=1}^D (x_{i,d} - \mu_i)^2 $$ 3. **标准化**: $$ \hat{x}_{i,d} = \frac{x_{i,d} - \mu_i}{\sqrt{\sigma_i^2 + \epsilon}} $$ 其中 $\epsilon$ 是一个很小的常数,用于防止除以零的情况。 4. **可学习参数**: $$ y_{i,d} = \gamma \cdot \hat{x}_{i,d} + \beta $$ 其中 $\gamma$ 和 $\beta$ 是可学习的参数,用于缩放和偏移标准化后的数据,以恢复模型的表达能力。 ### 实现方法 在实际应用中,Layer Normalization 可以通过深度学习框架(如 PyTorchTensorFlow)轻松实现。以下是一个使用 PyTorch 实现 Layer Normalization 的示例: ```python import torch import torch.nn as nn # 定义一个简单的全连接层,并应用 Layer Normalization class SimpleModel(nn.Module): def __init__(self, input_dim): super(SimpleModel, self).__init__() self.linear = nn.Linear(input_dim, input_dim) self.ln = nn.LayerNorm(input_dim) # 定义 Layer Normalization 层 def forward(self, x): x = self.linear(x) x = self.ln(x) # 应用 Layer Normalization return x # 创建模型实例 model = SimpleModel(input_dim=10) # 创建输入数据(批量大小为 3,特征维度为 10) input_data = torch.randn(3, 10) output = model(input_data) print("输入数据:") print(input_data) print("输出数据:") print(output) ``` 在这个示例中,`nn.LayerNorm` 被用来对每个样本的特征进行标准化。通过调整输入数据的维度,可以将 Layer Normalization 应用于不同的模型结构,如 RNN 或 Transformer。 ### 适用场景 Layer Normalization 特别适合以下场景: - **序列模型**:如 RNN 和 Transformer,其中输入序列的长度可能变化。 - **小批量训练**:由于 BN 依赖于批量统计信息,当批量较小时,BN 的效果会下降,而 LN 不受批量大小的影响。 - **图像处理中的 Transformer**:随着 Vision Transformer 等模型的兴起,LN 在图像处理领域也得到了广泛应用。 Layer Normalization 通过减少梯度爆炸或消失问题,提高了模型的稳定性和训练效率,尤其在处理序列数据时表现出色[^2]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值