夜雨聆风学习资料网

ARTICLE · 1110014

AI的“位置编码”是什么:把词序也算进去,它才分得清“我打他”和“他打我”

AI的“位置编码”是什么:把词序也算进去,它才分得清“我打他”和“他打我”

一、先说个你多半遇到过的事

“我打他”和“他打我”。

两句各三个字,用的字一模一样,就是把头一个字和末尾那个字换了个位置,意思正好拧过来。

人不用想,一眼就明白。可我刚学 AI 那阵子,心里冒出来一个疑问:在机器眼里,这两句不都是那几个字吗?它凭什么分得清谁打谁。

这个问题,我在《AI的“注意力机制”是什么》那篇里顺口带过一句——它的注意力天生不看前后,位置得另外告诉它。当时没展开。这篇就把它说清楚:位置是怎么“告诉”它的,老办法、新办法有啥不一样,咱们普通人用不用管。

这条概念线写到这儿已经一串了,上一篇是注意力机制,这篇就接在它后头。

二、一句话点破:光有字还不够,还得有次序

先往前退一步。

AI 看一句话,头一步是把字变成一串数字,也就是向量——这个我在《AI的“向量”是什么》那篇讲过,每个字,说得准确点是每个词块,对应一串数。

问题就来了:一串数字摆在那儿,它是一排,不是一个站好队的队列。谁在前、谁在后,它没感觉。

Transformer 那篇原始论文写得很直白,原话是:“Since our model contains no recurrence and no convolution, in order for the model to make use of the order of the sequence, we must inject some information about the relative or absolute position of the tokens in the sequence.”

翻成大白话:我们这套结构既不循环、也不卷积,想让模型用上“顺序”这个信息,就得额外把每个词块的位置塞进去。

塞进去的那样东西,就叫位置编码。

说白了,位置编码就是给每个位置发一张身份证。位置 1 一张,位置 2 一张,各不相同,模型一看就知道哪个字站在前头、哪个字站在后头。

三、老办法:给每个位置算一套“指纹”

2017 年这篇论文给的办法是这样的:用不同频率的正弦、余弦函数算出一串数。

原文那句是“In this work, we use sine and cosine functions of different frequencies”。论文的公式写着,位置 pos 的第 2i 维用正弦,第 2i+1 维用余弦,两个式子里面都带着 pos 和 10000 这个数。

数学我不装懂,我理解的就是这么个意思:位置越往后,算出来这串数就换个样子;挨着的两个位置数很接近,隔得老远的,数就岔开了。

论文自己交代了为什么挑这个函数,原话是:“We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k...”大意是:用这套函数,模型容易琢磨出“相对位置”这回事——不管站在哪个位置,往后挪固定的几步,算出来的数之间都是固定的关系。

好处有三个:不用训练,公式一算就有;句子想多长都行,位置多长都能算;不同位置天然不撞车。

四、新办法:把位置“拧”进向量里

同一篇论文里还留了另一条路,原句是“There are many choices of positional encodings, learned and fixed”——位置编码有好几种做法,可以像前面那样用公式固定算,也可以让模型自己在训练里学出一张表,一个位置配一份参数。

这两条路后来都用过。再往后,又出了第三招。

2021 年有篇论文叫《RoFormer》,提出一种叫旋转位置编码的做法,英文缩写 RoPE,念起来就是“绳子”那个词。它的原文是这么说的:把绝对位置编成一个旋转矩阵,同时把“相对位置的依赖”直接写进注意力那套算法里。

说人话:前面那种老办法,是“在向量旁边加一块位置信息”;RoPE 是“按位置把向量拧一下”。位置不一样,拧的角度不一样;两个向量之间差多少角度,本身就把“离多远”这件事带在身上了。

RoFormer 那篇的摘要里还列了它带来的几个性质,我照着原文翻:序列长度可以灵活变;两处之间的距离越远,它们之间的关联就越衰减;还能配到线性注意力上做相对位置编码。

这招是真上过战场的。2023 年那篇 LLaMA 的论文里有一句原话:“We remove the absolute positional embeddings, and instead, add rotary positional embeddings (RoPE)”——把绝对位置编码拿掉,换成旋转位置编码。

五、一张表,两种思路放一起看

做法
怎么做的
出处
好处
代价
固定正弦余弦
用不同频率的正弦余弦算一串数,加到词向量上
2017 年 Transformer 论文
不用训练、位置多长都能算
“相对位置”要靠模型自己去琢磨
让模型自己学
每个位置配一份参数,跟着训练一起学出来
同一篇论文列的另一条路
直白、好实现
位置表长度是定死的,超了要另想办法
旋转(RoPE)
按位置的角度把向量“拧”一下
2021 年 RoFormer 论文提出,2023 年 LLaMA 采用
相对位置直接进算法,长度灵活
实现更绕,不是拿来就能用

六、这套原理,我自己用得上什么

第一,语序别乱,别绕。位置信息是按一个个小单位去算的,我要是把“你、我、先、再、不要”这些词东一句西一句地摆,它就得费劲猜谁管谁。同样的意思,按正常话序说一遍,答案稳得多。

第二,“不要”“除了……以外”这类限定,紧挨着它管的那句话写。这是我自己吃亏吃出来的——我原来习惯把条件全堆在最后,前头那一大段,它就跟没听见一样。

第三,要紧的内容别跟它隔太远。RoFormer 那篇摘要里写着,距离越远,两处之间的关联会衰减。所以我现在的习惯是:长材料分成几段喂;要问的问题,就贴在材料后面,中间别夹别的。

再补一句实在话:这三条是我自己摸索的用法,不是标准答案,也不是教谁的课。

七、结论:它解决的只是“次序”这一件事

位置编码干的事,就是把“谁在前、谁在后”告诉模型。它让一句话里所有字都能按位置排好队、各就各位;代价是:位置信息得额外算,句子越长这笔账越大,位置表或者位置算法本身也各有各的边界。

我这几个月拆概念,越拆越觉得是同一个意思:AI 里没有哪一招是万能的,每个办法都是拿一样代价换一样好处。看懂这一层,比记住名词有用。

我是老刘,一个正在从零学习 AI 的 70 后普通人。


资料来源说明(每条都对着原文核过,核实日期 2026-09-28)

· 位置编码的定义原文、正弦余弦的做法与公式、为什么挑这个函数、以及固定与可学习两条路:论文《Attention Is All You Need》(Vaswani 等,2017 年 6 月 12 日提交),arXiv:1706.03762,https://arxiv.org/abs/1706.03762。原文摘录:“Since our model contains no recurrence and no convolution, in order for the model to make use of the order of the sequence, we must inject some information about the relative or absolute position of the tokens in the sequence. To this end, we add “positional encodings” to the input embeddings at the bottoms of the encoder and decoder stacks.”;“In this work, we use sine and cosine functions of different frequencies”;公式 PE(pos,2i)=sin(pos/10000^(2i/d_model)) 与 PE(pos,2i+1)=cos(pos/10000^(2i/d_model));“We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k, PE_pos+k can be represented as a linear function of PE_pos.”;“There are many choices of positional encodings, learned and fixed”。上面的中文表述是本人对原文的翻译,不是逐字直译。

· 旋转位置编码(RoPE)的做法与三个性质:论文《RoFormer: Enhanced Transformer with Rotary Position Embedding》(arXiv:2104.09864,2021 年 4 月 20 日提交),https://arxiv.org/abs/2104.09864。摘要原文:“the proposed RoPE encodes the absolute position with a rotation matrix and meanwhile incorporates the explicit relative position dependency in self-attention formulation. Notably, RoPE enables valuable properties, including the flexibility of sequence length, decaying inter-token dependency with increasing relative distances, and the capability of equipping the linear self-attention with relative position encoding.”

· LLaMA 改用旋转位置编码:论文《LLaMA: Open and Efficient Foundation Language Models》(arXiv:2302.13971,2023 年 2 月 27 日提交),https://arxiv.org/abs/2302.13971。原文摘录:“We remove the absolute positional embeddings, and instead, add rotary positional embeddings (RoPE)”。

· 本文里的本机数据:CPU 为 i5-10400F,内存 16G,显卡为 AMD Radeon R5 220。本文没有训练过任何模型,也没有亲手跑过旋转位置编码,上面这些都是对着论文原文核出来的,属于我自己的学习笔记。

AI 技术更新快,具体以各家官方最新公布为准。本文是老刘的普通学习笔记,不构成推荐建议。

相关学习资料