3.3 位置编码:为什么顺序信息必须显式注入
自注意力机制有一个根本性的特征:它是置换等变的(Permutation Equivariant)。这意味着,如果打乱输入序列中元素的顺序,注意力机制的输出也会按照相同的规律被打乱,但是,针对序列中任意一个特定元素,它最终计算出的表示向量(接收到的加权信息)的数值完全不变。
3.3.1 为什么注意力看不到顺序
回顾注意力的计算:$\text{Attention}(Q, K, V) = \text{softmax}(QK^T / \sqrt{d_k})V$。注意力权重 $\alpha_{ij}$ 只取决于 $q_i$ 和 $k_j$ 的点积,与 $i$ 和 $j$ 的绝对位置无关。
换句话说,如果没有位置信息,对于注意力机制而言,“我爱你”和“你爱我”中每个词计算出的表示特征是一模一样的(只是由于输入顺序不同,它们在输出序列里的排列位置跟着变了)。词“我”在这两个短语中对“爱”和“你”的注意力权重分配完全相同,导致它输出的上下文向量也完全相同。但显然,自然语言中词的先后顺序决定了截然不同的语义。
这与 RNN 和 CNN 形成了鲜明对比:
RNN:通过顺序处理天然编码了位置信息——先处理的是位置 1,后处理的是位置 2
CNN:滤波器的位置是固定的,不同位置的卷积结果自然不同
Transformer 放弃了循环和卷积后,必须通过其他方式将位置信息注入模型。
位置编码(Positional Encoding)正是解决方案。
3.3.2 位置编码的基本思路
最直接的方式是为每个位置分配一个与位置相关的向量,然后与词嵌入相加:
Inputi=Embed(xi)+PE(i)
为什么是相加而不是拼接(Concatenation)?相加的好处是不增加模型维度——输入维度始终是 $d_{\text{model}}$,后续所有层的计算量不变。虽然相加会导致词义信息和位置信息的混合,但实践证明模型有足够的能力从混合表示中分离出这两种信息。
3.3.3 正弦位置编码初探
原始 Transformer 使用的是正弦位置编码(Sinusoidal Positional Encoding),通过不同频率的正弦和余弦函数为每个位置生成一个唯一向量:
PE(pos,2i)=sin(100002i/dmodelpos)
PE(pos,2i+1)=cos(100002i/dmodelpos)
其中 $pos$ 是位置索引,$i$ 是维度索引。直觉上,不同维度对应不同的“频率”——低维度变化快(编码细粒度的位置差异),高维度变化慢(编码粗粒度的位置模式)。这类似于二进制计数器中低位快速翻转、高位缓慢翻转的原理。
正弦编码的一个重要特性是:任意两个位置之间的相对距离可以通过线性变换表示。 即 $\text{PE}(pos + k)$ 可以表示为 $\text{PE}(pos)$ 的线性函数,这使得模型有可能学习到关注“相对位置”而非仅仅“绝对位置”。
关于正弦编码、可学习位置编码、旋转位置编码(RoPE)等不同方案的深入对比和设计哲学,将在第四章中详细讨论。此处只需理解关键点:Transformer 必须显式注入位置信息,否则它无法区分不同顺序的序列。
最后更新于
