Note
Transformer 为什么需要位置编码?
介绍位置信息的作用,对比正弦余弦编码与可学习的绝对位置编码。
什么是位置编码?在 Transformer 中,为什么它是必需的?请列举至少两种实现方式。
什么是位置编码?
位置编码(Positional Encoding, PE)是一个与词嵌入维度相同的向量,其目的是向模型注入关于词元在输入序列中绝对或相对位置的信息。它会与词元的词嵌入(Token Embedding)相加,然后一同输入到Transformer的底层。
为什么它是必需的?
Transformer的核心机制——自注意力,在计算时处理的是一个集合(Set)而非序列(Sequence)。它本身不包含任何关于词元顺序的信息,是 置换不变(Permutation-invariant) 的。这意味着,如果打乱输入序列中词元的顺序,自注意力层的输出也会相应地被打乱,但每个词元自身的输出向量(在不考虑softmax归一化的情况下)是相同的。这显然不符合自然语言的特性,因为语序至关重要(例如“我打你”和“你打我”含义完全相反)。因此,必须通过一种外部机制,将位置信息显式地提供给模型,这就是位置编码的作用。
至少两种实现方式:
-
正弦/余弦位置编码(Sinusoidal Positional Encoding): 这是原始Transformer论文《Attention Is All You Need》中使用的方法。它使用不同频率的正弦和余弦函数来生成位置编码,其公式如下:
其中,
pos是词元在序列中的位置,i是编码向量中的维度索引, 是嵌入维度。- 优点:
- 可外推性: 能够处理比训练中最长序列还要长的序列。
- 相对位置信息: 模型可以轻易地学习到相对位置关系,因为对于任何固定的偏移量
k,PE_{pos+k}都可以表示为PE_{pos}的一个线性函数,这使得模型更容易捕捉相对位置的依赖。
- 优点:
-
可学习的绝对位置编码(Learned Absolute Positional Encoding): 这种方法将位置编码视为模型参数的一部分,通过训练学习得到。具体来说,会创建一个形状为
(max_sequence_length, embedding_dimension)的位置编码矩阵。在处理序列时,根据每个词元的位置索引,从这个矩阵中查找对应的编码向量,并加到词嵌入上。BERT和GPT-2等模型采用了这种方式。- 优点: 模式更加灵活,可以让模型自己学习出最适合数据的位置表示。
- 缺点: 无法泛化到超过预设
max_sequence_length的长度。如果需要处理更长的序列,就需要对位置编码进行微调或采用其他策略。