transformer(4)图解layernorm是怎么完成的

1. 为什么需要归一化

为了保持模型的训练稳定性,常常要对特征进行归一化,深层网络当层数叠加过多时,中间层的数据分布如果不稳定,会导致整个模型训练过程中梯度消失或爆炸的问题。
可以说是只要是训练深层网络,不可能不考虑归一化这一步。

2. layernorm 是怎么做的

  • 为了讲解归一化怎么做的,我们先给一个简单的例子,这一个某一个层的输入数据

在这里插入图片描述

  • 为了归一化数据,我们常常的做法是Batch Normalization(BN),它的做法是对每个样本的特征进行归一化,即对每个特征维度上的所有样本值进行归一化。

在这里插入图片描述

  • 在计算机视觉任务里面常常使用Batch Normalization(BN),但是在文本领域其实是不能使用的
  • 因为在文本领域,每个样本的长度是不固定的,里面可能有很多padding的token,这些token是没有实际意义的,但是如果对它们进行归一化,会影响到模型的性能。

具体参考我的往期内容: 《为什么Transformer使用LayerNorm而不是BatchNorm?》

  • 所以文本领域的做法是Layer Normalization(LN),它的做法是对每个样本的所有特征进行归一化,即对每个样本的所有特征维度上的所有样本值进行归一化。

在这里插入图片描述

3. LayerNorm实现以及变种

LayerNorm 实现

  • 在每个样本内计算所有特征的均值和方差,然后对每个特征进行归一化。

对一个单独的样本 xxx,其中 xix_ixi表示第 iii 个位置上的特征向量

  • 计算特征维度上的均值 μ\muμ 和方差 σ2\sigma^2σ2

μ=1d∑i=1dxi \mu = \frac{1}{d} \sum_{i=1}^d x_i μ=d1i=1dxi

σ2=1d∑i=1d(xi−μ)2 \sigma^2 = \frac{1}{d} \sum_{i=1}^d (x_i - \mu)^2 σ2=d1i=1d(xiμ)2

  • 对每个特征进行归一化:

x^i=xi−μσ2+ϵ⋅γ+β \hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}} \cdot \gamma + \beta x^i=σ2+ϵxiμγ+β

  • 其中,ϵ\epsilonϵ 是一个小的常量,用于防止除0错误。
  • γ\gammaγβ\betaβ 是可学习的参数,用于对归一化后的特征进行缩放和平移。

RMSNorm

  • 单纯为了简化计算,RMSNorm 只计算每个样本的特征维度上的均方根(RMS),而不计算均值。
  • 对每个特征进行归一化:

x^i=xi1d∑i=1dxi2+ϵ⋅γ \hat{x}_i = \frac{x_i}{\sqrt{\frac{1}{d} \sum_{i=1}^d x_i^2 + \epsilon}} \cdot \gamma x^i=d1i=1dxi2+ϵxiγ

  • 其中,ϵ\epsilonϵ 是一个小的常量,用于防止除0错误。
  • γ\gammaγ 是可学习的参数,用于对归一化后的特征进行缩放。

DeepNorm

  • DeepNorm 理论推导相对复杂,简单讲讲,为了设计超大层网络,微软研究人员严格研究了超多层网络之间的数据分布问题,它考虑到了每层应该如何初始化,残差连接对数据的分布影响等,避免梯度消失或爆炸的问题。
  • 其论文为《DeepNet: Scaling Transformers to 1,000 Layers》。看论文名字就知道,它希望将Transformer模型扩展到1000层。
  • 这里给出一个简单的公式说明,参考《大语言模型》

DeepNorm(x)=LayerNorm(α⋅x+SubLayer(x)) DeepNorm(x) = LayerNorm(\alpha \cdot x + SubLayer(x)) DeepNorm(x)=LayerNorm(αx+SubLayer(x))

  • SubLayer(x) 表示残差连接的子层,例如前馈神经网络(FFN)或多头注意力机制(Multi-Head Attention)。
  • α\alphaα 是一个可学习的参数,用于控制残差连接的权重。
  • 但是这个公式也只是简单表达了DeepNorm的基本思想,抛砖引玉,更复杂的推导可以参考论文。

4. 归一化模块的位置

  • 归一化模块的位置设计我这里只谈两种基本形式
    • 层前归一化(Pre-Normalization):先进行归一化,再进行子层计算。
    • 层后归一化(Post-Normalization):先进行子层计算,再进行归一化。
  • 示例图说明

在这里插入图片描述

  • 简单说下两种方式的区别吧
    • 如果你的语言模型较为简单,相对而言不是那么大,那么优先选择层前归一化(Pre-Normalization)。它更好训练。
    • 从图中可以看到,即使是数据从输入到输出,始终保持一份原始数据流对模型的影响,不会被归一化模块所改变。使得模型的训练更加稳定。
    • 层后归一化(Post-Normalization)的归一化不在残差模块中,而是在子层计算之后。这使得模型的训练可以更加复杂,学习到更多的特征表示,但是训练难度也会增加。一般用于更大的语言模型中。
    • 所以层后归一化一般是比层前归一化能力要强的

在这里插入图片描述

我这里对语言模型使用哪种结构用了相对模糊的相对大与小这种说法,只是给了一种启发式的思路,具体还需要根据具体情况以及实验来确定。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布鲁格若门

对你有用的话真是太好了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值