Note

Transformer 为什么需要位置编码?

介绍位置信息的作用,对比正弦余弦编码与可学习的绝对位置编码。

什么是位置编码?在 Transformer 中,为什么它是必需的?请列举至少两种实现方式。

什么是位置编码?

位置编码(Positional Encoding, PE)是一个与词嵌入维度相同的向量,其目的是向模型注入关于词元在输入序列中绝对或相对位置的信息。它会与词元的词嵌入(Token Embedding)相加,然后一同输入到Transformer的底层。

为什么它是必需的?

Transformer的核心机制——自注意力,在计算时处理的是一个集合(Set)而非序列(Sequence)。它本身不包含任何关于词元顺序的信息,是 置换不变(Permutation-invariant) 的。这意味着,如果打乱输入序列中词元的顺序,自注意力层的输出也会相应地被打乱,但每个词元自身的输出向量(在不考虑softmax归一化的情况下)是相同的。这显然不符合自然语言的特性,因为语序至关重要(例如“我打你”和“你打我”含义完全相反)。因此,必须通过一种外部机制,将位置信息显式地提供给模型,这就是位置编码的作用。

至少两种实现方式:

  1. 正弦/余弦位置编码(Sinusoidal Positional Encoding): 这是原始Transformer论文《Attention Is All You Need》中使用的方法。它使用不同频率的正弦和余弦函数来生成位置编码,其公式如下:

    PE(pos,2i)=sin⁡(pos100002i/dmodel)PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)

    PE(pos,2i+1)=cos⁡(pos100002i/dmodel)PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)

    其中, pos 是词元在序列中的位置, i 是编码向量中的维度索引, dmodeld_{\text{model}} 是嵌入维度。

    • 优点:
      • 可外推性: 能够处理比训练中最长序列还要长的序列。
      • 相对位置信息: 模型可以轻易地学习到相对位置关系,因为对于任何固定的偏移量 k , PE_{pos+k} 都可以表示为 PE_{pos} 的一个线性函数,这使得模型更容易捕捉相对位置的依赖。
  2. 可学习的绝对位置编码(Learned Absolute Positional Encoding): 这种方法将位置编码视为模型参数的一部分,通过训练学习得到。具体来说,会创建一个形状为 (max_sequence_length, embedding_dimension) 的位置编码矩阵。在处理序列时,根据每个词元的位置索引,从这个矩阵中查找对应的编码向量,并加到词嵌入上。BERT和GPT-2等模型采用了这种方式。

    • 优点: 模式更加灵活,可以让模型自己学习出最适合数据的位置表示。
    • 缺点: 无法泛化到超过预设 max_sequence_length 的长度。如果需要处理更长的序列,就需要对位置编码进行微调或采用其他策略。