位置编码是大型语言模型 (LLM) 中用于编码序列中 token 顺序的一种机制。与循环神经网络 (RNN) 或卷积架构不同,Transformer(大多数 LLM 的骨干)并行处理所有 token,这意味着它们缺乏对 token 位置的内在感知。位置编码通过注入关于每个 token 在序列中位置的信息来解决这个问题。这使得模型能够区分诸如“The cat sat on the mat”(猫坐在垫子上)和“On the mat, the cat sat”(在垫子上,猫坐着)这样的句子,其中词序改变了含义。
位置编码有两种常见类型:绝对位置编码和学习位置编码。绝对位置编码为序列中的每个位置分配一个固定的向量。例如,最初的 Transformer 模型使用正弦函数根据数学模式生成唯一的位置向量。学习位置编码在 BERT 等模型中使用,将位置信息视为可训练参数。在训练期间,模型会调整这些向量以更好地捕捉位置之间的关系。例如,在“She didn’t go to the park because it was raining”(她没有去公园,因为下雨了)这样的句子中,即使“it”和“raining”之间相隔几个词,模型也会使用位置编码将它们关联起来。一些较新的模型还使用相对位置编码,它们侧重于 token 之间的距离而非绝对位置。这有助于更有效地处理更长的序列,例如在 T5 等架构中。
实现位置编码通常涉及在将 token embedding 输入到模型的层之前,将位置向量添加到 token embedding 中。例如,在代码中,学习位置编码层可能看起来像 nn.Embedding(max_length, hidden_dim)
,其中每个位置索引(0、1、2 等)映射到一个唯一的向量。挑战包括处理比模型训练时最大位置更长的序列,这可能导致分布外错误。一些模型通过外推或使用旋转位置编码 (RoPE) 等技术来解决这个问题,RoPE 通过旋转操作编码位置。如果没有位置编码,LLM 将难以完成需要句法结构(例如解析)或依赖上下文含义(例如指代消解)的任务,因此位置编码对于准确的语言理解至关重要。