【AI大模型】Transformer架构位置编码

Transformer 架构中的 位置编码 (Positional Encoding) 是其核心设计之一,用于解决一个关键问题:Self-Attention 机制本身对输入元素的顺序是“无感知”的 (permutation invariant)

问题:为什么需要位置编码?

  1. Self-Attention 的本质缺陷: Self-Attention 通过计算所有元素对之间的关联来工作。然而,它只关心元素 是什么 (x_i 的内容),完全不关心元素 在哪里 (元素在序列中的位置 i)。打乱输入序列的顺序,Self-Attention 的输出(不考虑位置编码)会完全一样。

  2. 序列数据依赖顺序: 自然语言、时间序列等数据中,元素的顺序至关重要。例如,“猫追老鼠”和“老鼠追猫”含义完全不同。模型必须能够区分元素的绝对位置和相对位置。

解决方案:注入位置信息

Transformer 的设计者通过 位置编码 将序列中元素的顺序信息显式地注入到模型中。具体做法是:

  1. 添加到输入嵌入: 对于输入序列 X = [x1, x2, ..., xn] (其中 xi 是第 i 个元素的 d_model 维词嵌入向量),生成一个同样形状的位置编码矩阵 P = [p1, p2, ..., pn] (其中 pi 是第 i 个位置的 d_model 维位置向量)。

  2. 元素级相加: 将词嵌入向量 xi 和对应的位置编码向量 pi 按元素相加,形成最终的输入表示:

    • z_i = x_i + p_i

  3. 输入到模型: 这个融合了词义信息和位置信息的向量 z_i 被送入 Transformer 的编码器或解码器。

Transformer 的原始位置编码:正弦/余弦函数

原论文 Attention Is All You Need 提出了一种基于正弦和余弦函数的固定编码方案(非学习得到的)。这种编码有两个关键特性:

  1. 唯一性 (Unique): 每个位置 pos (0 ≤ pos < max_length) 都有一个唯一的编码向量 p_pos

  2. 相对位置关系 (Relative Position): 对于任何固定的偏移量 k,位置 pos + k 的编码 p_{pos+k} 可以表示为位置 pos 的编码 p_pos 的一个线性函数。这使得模型能够轻松地学习到相对位置信息(例如,“关注前一个词”或“关注后两个词”)。

具体公式

对于一个位置 pos 和编码向量的维度索引 i (0 ≤ i < d_model):

  • 如果 i 是偶数: p(pos, i) = sin(pos / 10000^{i / d_model})

  • 如果 i 是奇数: p(pos, i) = cos(pos / 10000^{(i-1) / d_model})

公式解读
  1. 波长 (Wavelength): 分母项 10000^{2i/d_model} 控制着正弦/余弦波的波长

    • i 较小(维度索引低)时,指数 2i/d_model 小,10000^{2i/d_model} 大,波长很长(频率低),变化缓慢。

    • i 较大(维度索引高)时,指数 2i/d_model 接近 2,10000^{2i/d_model} 非常大,波长极短(频率高),变化剧烈。

  2. 维度交替 (Alternating Dimensions): 偶数和奇数维度分别使用 sin 和 cos 函数,为每个位置 pos 提供了一个完整的、独特的编码模式。

  3. 线性关系 (关键): 对于相对位置 k,可以证明存在一个线性变换矩阵 M,使得 p_{pos+k} = M_k * p_pos。这个性质使得模型仅通过点积操作就能捕捉相对位置信息。

可视化

想象一个 d_model 维的向量。每个维度对应一个不同频率的正弦波或余弦波(低频波占据低维度,高频波占据高维度)。位置 pos 的编码向量 p_pos 就是这个向量在 pos 时刻的采样值。不同的 pos 会得到不同的采样值组合。

其他位置编码方案

虽然正弦/余弦编码是原始方案并被广泛使用,但也存在其他替代方案:

  1. 可学习的位置编码 (Learned Positional Embeddings):

    • 将位置索引 pos 当作一个普通的 token,为其学习一个 d_model 维的嵌入向量 p_pos

    • 优点: 简单直接,模型可以学习最优的位置表示。

    • 缺点:

      • 需要额外的参数。

      • 在训练时见过的最大序列长度之外无法泛化(模型没见过 pos = 1000 的编码,就不知道如何处理)。而正弦编码理论上可以外推到任意长度(因为公式定义)。

      • 可能不如正弦编码那样显式地编码相对位置关系。

    • 应用: BERT 等模型早期版本常采用此方案。

  2. 相对位置编码 (Relative Positional Encodings):

    • 核心思想是不编码绝对位置 pos,而是编码元素之间的相对距离 pos_i - pos_j

    • 实现方式多样:

      • 修改 Attention Score 计算:在计算 q_i · k_j^T 时,额外加入一个只依赖于 i-j 的偏置项 a_{i-j} 或 b_{i-j}

      • 在 Value 或 Key 中注入相对位置信息。

    • 优点: 理论上更符合语言建模中“关注邻近词”的直觉,能更好地处理长序列,对绝对位置不敏感。

    • 缺点: 实现通常更复杂,计算开销可能略高。

    • 应用: Transformer-XL, T5, DeBERTa 等模型采用了不同的相对位置编码变体。

  3. 旋转位置编码 (Rotary Position Embedding, RoPE):

    • 一种近年来非常流行的方案。

    • 核心思想:对 Query 和 Key 向量进行旋转操作,旋转的角度取决于它们各自的位置 m 和 n。点积 q_m^T * k_n 的结果会自然包含相对位置信息 m-n

    • 优点:

      • 保持向量范数不变(旋转是正交变换)。

      • 显式地融入了相对位置信息。

      • 在长文本任务(如LLM)上表现优异。

    • 应用: LLaMA, GPT-NeoX, PaLM, 百川, 通义千问等众多现代大语言模型采用。

位置编码在 Transformer 中的关键作用

  1. 赋予位置感知能力: 使原本位置无关的 Self-Attention 能够区分序列中元素的顺序。

  2. 捕捉顺序依赖: 模型利用位置编码学习元素之间的顺序关系(谁在前,谁在后)。

  3. 建模距离: 模型可以利用位置编码感知元素之间的相对距离(相隔多远)。

  4. 影响注意力分布: 位置信息直接影响 Self-Attention 计算出的权重 alpha(i, j),使得模型更倾向于关注邻近或有特定位置关系的元素(尤其是在解码器中)。

总结

  • 核心目的: 解决 Self-Attention 机制对输入顺序不敏感的问题,向模型注入序列元素的位置信息(绝对位置和/或相对位置)。

  • 原始方案: 固定、预定义的正弦/余弦函数编码。具有唯一性和相对位置线性可表示性,能外推到训练时未见过的序列长度。

  • 其他方案: 可学习的位置嵌入(简单但泛化性受限)、相对位置编码(更自然但实现复杂)、旋转位置编码(RoPE,现代大模型主流,效果优异)。

  • 实现方式: 与词嵌入向量相加后作为 Transformer 层的输入。

  • 不可或缺: 位置编码是 Transformer 能够有效处理序列数据(如语言)的基石之一,没有它,Transformer 的性能会大打折扣。

你可能感兴趣的:(学习AI记录,人工智能,神经网络,ai,AI编程)