序列模型与Transformer
位置编码(positional encoding)
/ puh-ZISH-un-ul en-KOH-ding /
位置编码,是 Transformer 用来知道每个词坐在哪里的办法,因为注意力本身对顺序是盲的。在自注意力眼里,一句话就是一袋无序的词元——「狗咬人」和「人咬狗」会无从分辨。位置编码通过给每个词元盖上一个关于它在队列中位置的信息,来弥补这一点,让模型分得清第一个、第二个与最后一个。
它有几种花样。最初的 Transformer 给每个词元的向量加上固定的、波浪般的图案——不同频率的正弦与余弦——这套巧妙的方案无需训练,还能延伸到从未见过的长度。许多后来的模型则改为从数据中为每个位置学一个位置向量。当今领先的模型常用旋转位置编码(RoPE),它按词元所在位置依赖的一个角度,轻轻旋转查询与键向量来编码位置,使注意力看到的是词元之间的相对距离,而非一个绝对地址。
位置编码小,却是承重的:把它去掉,Transformer 对语法与意义的把握就会崩塌,因为词序占了语言的一半。它还悄悄决定着模型能伸多远。编码绝对位置的方案,在被要求处理比训练时更长的序列时往往会失灵;而相对与旋转方案泛化得更好——这也是为何你选哪种方法,会直接影响模型可用的上下文长度。
两句话用了相同的词:「只有她告诉了他」对「她只告诉了他」。单靠自注意力分不开它们。位置编码给两个「只」盖上不同的位置戳,模型便知道它限定的是哪个词。
相同的词,不同的顺序——只有位置戳能把它们分开。
位置如何编码,直接限制了模型能读多远。绝对方案常在超过训练长度后急剧退化;相对与旋转方案延伸得更从容——但没有一种是魔法,「长上下文」的宣称,永远应拿在那个长度上实测的准确率来核对,而不是只看广告里的数字。
又称
另见