为什么需要位置编码?

以自然语言处理为例: • 句子中的单词顺序至关重要,例如 “猫追狗”“狗追猫” 含义不同。 • Transformer的注意力机制是“无序”的,无法区分 “猫” 在第1位“猫” 在第3位 的差异。

在视觉任务中(如ViT): • 图像被分割成多个块(patches),这些块的空间排列关系(如“左上方块”和“右下方块”)影响语义理解。

位置编码通过为每个元素(单词、图像块)添加位置信息,使模型能够感知顺序或空间结构。


位置编码的常见方法

1. 正弦/余弦函数编码(原始Transformer)

公式:对位置 的每个维度 计算:

特点: • 可处理任意长度的序列。 • 不同位置的编码具有唯一性,且能捕捉相对位置关系(如距离较近的位置编码相似)。

2. 可学习的位置编码(如ViT)

• 直接为每个位置分配一个可学习的向量(参数),通过训练优化。 • 特点: • 更灵活,但需要固定序列长度(如ViT中图像块数量固定)。


示例说明

场景1:自然语言处理(句子)

句子:“I love cats” • 位置编码过程

  1. 将每个单词转换为词嵌入向量(如维度=4): ◦ “I” → [0.2, 0.5, -0.1, 0.3] ◦ “love” → [0.7, -0.2, 0.4, 0.6] ◦ “cats” → [-0.3, 0.8, 0.1, -0.5]
  2. 为每个位置生成编码(假设维度=4): ◦ 位置0(“I”)→ [0.1, 0.2, -0.3, 0.4] ◦ 位置1(“love”)→ [0.5, -0.1, 0.2, 0.3] ◦ 位置2(“cats”)→ [-0.2, 0.6, 0.0, 0.7]
  3. 将位置编码与词嵌入相加: ◦ “I” 最终输入 → [0.2+0.1, 0.5+0.2, -0.1-0.3, 0.3+0.4] = [0.3, 0.7, -0.4, 0.7] ◦ “love” 最终输入 → [0.7+0.5, -0.2-0.1, 0.4+0.2, 0.6+0.3] = [1.2, -0.3, 0.6, 0.9] ◦ “cats” 最终输入 → [-0.3-0.2, 0.8+0.6, 0.1+0.0, -0.5+0.7] = [-0.5, 1.4, 0.1, 0.2]

场景2:视觉任务(ViT图像分块)

图像:假设图像被分割为 2×2 的块(4个块)。 • 位置编码过程

  1. 每个块通过线性投影得到嵌入向量(假设维度=4): ◦ 块1(左上)→ [0.4, -0.2, 0.5, 0.1] ◦ 块2(右上)→ [0.3, 0.6, -0.1, 0.4] ◦ 块3(左下)→ [-0.2, 0.7, 0.3, 0.5] ◦ 块4(右下)→ [0.5, 0.1, 0.2, -0.3]
  2. 为每个块的位置分配可学习编码(假设维度=4): ◦ 位置 (0,0) → [0.1, 0.2, -0.1, 0.3] ◦ 位置 (0,1) → [0.4, -0.3, 0.2, 0.1] ◦ 位置 (1,0) → [-0.2, 0.5, 0.1, 0.4] ◦ 位置 (1,1) → [0.3, 0.0, -0.2, 0.5]
  3. 将位置编码与块嵌入相加: ◦ 块1最终输入 → [0.4+0.1, -0.2+0.2, 0.5-0.1, 0.1+0.3] = [0.5, 0.0, 0.4, 0.4] ◦ 块2最终输入 → [0.3+0.4, 0.6-0.3, -0.1+0.2, 0.4+0.1] = [0.7, 0.3, 0.1, 0.5] ◦ 其他块同理。

位置编码的作用

  1. 绝对位置感知:区分不同位置的元素(如ViT中左上角块和右下角块)。
  2. 相对位置感知:通过编码的相似性,模型能捕捉相邻或远距离的关系。
  3. 跨模态对齐:在图文任务中,帮助对齐图像块和对应文本的位置。

没有位置编码会怎样?

• 模型无法区分顺序或空间关系: • 句子中单词乱序时含义可能不变(如 “cats love I” 被误认为合法)。 • 图像块的位置混乱可能导致错误分类(如将天空块放在地面位置)。


总结

位置编码是Transformer模型理解序列或空间结构的关键组件。 • 核心思想:通过数学方法或可学习参数,为每个元素添加位置信息。 • 实际应用:无论是处理文本、图像还是多模态数据,位置编码都是必不可少的。