transformer实战——encoder内的residual connection和Layer normalization

124 阅读3分钟

1 encoder的结构

  1. encoder由6层相同的层组成

    image.png

  2. 每一层分别由两部分组成:

    • 第一部分是一个multi-head self-attention mechanism
    • 第二部分是一个position-wise feed-forward network,是一个全连接层 image.png
  3. 这两个部分之后,都有一个残差连接(residual connection),然后接着一个层归一化(Layer Normalization) image.png

2residual connection

2.1 理论理解

  1. 残差连接示意图如下:

image.png

  1. 假设网络中某个层对输入x作用后的输出是F(x),那么增加residual connection之后,就变成了:F(x)+x。
  2. 这个+x操作就是一个shortcut。transformer架构图中的Add & Norm中的Add也就是指的这个shortcut。

2.2 代码

  1. 代码片段
  def residual(sublayer_fn,x):
      return sublayer_fn(x)+x
  1. 子层操作 (sublayer_fn(x),例如多头注意力或前馈网络)
  2. 残差连接 (sublayer_fn(x)+x,将子层的输入 x 加到子层的输出上)

3 Layer normalization

3.1 理论理解

3.1.1 normalization

  1. Normalization有很多种,但是它们都有一个共同的目的,那就是把输入转化成均值为0方差为1的数据。我们在把数据送入激活函数之前进行normalization(归一化),因为我们不希望输入数据落在激活函数的饱和区。
  2. 注意区分
    • 归一化(Normalization):这是一种将特征值线性缩放到一个固定范围(通常是 [0, 1])的方法。

      image.png

    • 标准化(Standardization):这是一种将特征值转换为服从零均值、单位方差的标准正态分布的方法。

      image.png

    • 批量归一化(Batch Normalization)的底层数学操作确实是标准化(Standardization),但它之所以被称为“归一化”,主要是因为“Normalization”这个词在深度学习领域被作为一个更宽泛的术语来使用,泛指任何能将数据分布调整到更稳定的方法。

3.1.2 batch normalization

  1. 求均值和方差
    1. 假设有一个批次包含10张图片,每张图片有4个通道。
    2. BatchNorm把一个batch中同一通道的所有特征(红色区域)视为一个分布,并将其标准化。
    3. 例如,计算所有10张图片的红色通道特征的均值和方差(μB​ and σB²),用这些值对每张图片的红色通道特征进行归一化。 image.png
    4. 有几个通道就有几个分布
  2. 缩放与偏移(scale and shift)
    1. 缩放参数 γ 和偏移参数 β 是可学习参数(learnable parameters),它们的数量取决于归一化的“目标维度”大小(即:对哪些特征做缩放和平移)。
    2. 因为对每个通道 C 做归一化,所以每个通道有一组 γ 和 β
    3. γ 和 β 的维度=(C,)→ 共 2 × C 个参数
  3. 整体公式

image.png

3.1.3 Layer normalization

  1. 求均值和方差
    1. 考虑一个句子被表示为一个词向量序列。
    2. LayerNorm会对每个词向量的所有维度进行归一化。
    3. 对每个红色的向量 Vi,计算它自己的均值和标准差,然后对它内部的每个特征做归一化处理。 image.png
    4. 总共会有 N × L 个归一化分布
  2. 缩放与偏移(scale and shift)
    1. LayerNorm 的目标是稳定每个 token 向量的数值尺度
    2. γ 和 β 只依赖 d(每个词向量维度)
    3. 所以它们是长度为 D 的向量(形状 (D,),其中D表示每个 token 的向量维度(hidden size))-> 参数量为 2×D。
  3. 整体公式

image.png

  1. 计算流程
    1. 假设需要layer nomalization的输入是[2,3,512](输入张量形状是 [B, L, D],B:batch 中有多少个句子、L:每个样本里有多少个 token(词)、D:每个 token 的向量维度) image.png
    2. 计算每个词向量的均值和方差
      image.png
    3. 共有维度D个γ 和 β image.png
    4. 更新每个值,例如0.2 image.png

参考

  1. Transformer 模型的 PyTorch 实现
  2. The Annotated Transformer
  3. LayerNorm和BatchNorm的归一化方式有以下主要区别
  4. BatchNorm和LayerNorm——通俗易懂的理解
  5. Simplest explanation of Layer Normalization in Transformers