LLM/MLLM中的位置编码

位置编码是目前大模型所涉及到的基础概念之一,本文将从位置编码满足的条件,分析常见的两种编码方式:绝对位置编码和旋转位置编码,及其在多模态大模型中的直接拓展。 位置编码需要满足的条件 位置编码的根本目的是为序列中的每个token引入位置信息,否则自注意力机制对序列是「无序」的。一个好的位置编码方法需要满足以下条件: 唯一性:每个位置有唯一表示,避免不同位置混淆。 可区分性:相邻位置编码差异明显,模型能感知局部顺序。 可组合性:能有效表达位置间的相对关系。 泛化性:能处理比训练时更长的序列。 二进制编码 其实,根据上面的条件,很容易想到的一个方案就是二进制编码。显而易见,二进制编码一定是唯一的。但是不具有可区分性,泛化性和可组合性。 二进制编码的可区分性 上面已经论述过,对于二进制编码,其是one-to-one的映射,每个位置都会有一个唯一的二进制串。因此在理论上,它不会出现两个位置相同的编码,完全满足可区分性。但在向量空间的相似性上,它并不理想:比如 7 = 0111 和 8 = 1000 的二进制差异非常大,汉明距离为4,实际上它们相邻,但编码却完全不相似。这意味着“局部邻近性”缺失,不利于捕捉局部顺序信息。 二进制编码的可组合性 在二进制编码中,位置差必须依赖模型学会“二进制到整数”的解码,再做减法。例如 0101 (5) 和 1000 (8),模型需要先恢复数值才能得出差=3。 二进制编码的泛化性 训练时序列的最长长度为$L$,那把位置 $pos$ 转成二进制串所需的比特数为: $$ \lceil \log_2(L) \rceil $$ 比如,训练时最大序列长度为 256,那么会使用8位二进制。在测试时,假设位置 $=300$: 300 的二进制是 $100101100$,需要 9 位。 但训练时 embedding 只有 8 维(每一位有一个 embedding),此时二进制编码体系不够用了。在训练长度之外会直接“溢出”,不能自然推广。 绝对位置编码 $$PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right)$$ $$PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right)$$ $PE(pos) = [\sin(\omega_0 \cdot pos), \cos(\omega_0 \cdot pos), \sin(\omega_1 \cdot pos), \cos(\omega_1 \cdot pos), \dots, \sin(\omega_{d_{model}/2-1} \cdot pos), \cos(\omega_{d_{model}/2-1} \cdot pos)]$ ...

August 31, 2025