Transformer一次看见许多词元,注意力会比较它们彼此有多相关。若模型只拿到词元本身,却不知道谁在前、谁在后,同一批词换个顺序,计算很难分清差别。位置编码负责把顺序送进模型。RoPE的办法很特别,它不另加一串位置数字,而是按位置旋转查询向量和键向量。

我把 RoFormer 原论文、Hugging Face 的实现说明和 LongRoPE 论文放在一起看。旋转这一步很简洁,后来的长上下文方案却远不止改一个最大长度。频率怎样缩放、模型见过多长的训练样本、短文能力能否保住,都要另外处理。

位置怎样进入注意力

RoPE把查询和键向量的维度两两配成一组。词元处在不同位置,每一组就按对应频率转过不同角度。两个向量做内积时,它们共同转过的绝对角度会抵消一部分,剩下的关系取决于位置差。模型因此能在注意力分数里直接感知两个词元隔了多远。

不同维度使用不同频率也有实际作用。变化快的部分能区分相邻位置,变化慢的部分负责更长距离。RoFormer 论文还讨论了距离增大时相关性衰减,以及把相对位置信息带进线性注意力的可能。论文实验覆盖长文本分类任务,支持这种位置处理方法有效,却没有证明任意模型都能无限外推。

Hugging Face 现在把多种 RoPE 方案做成配置。默认版本以外,还有线性缩放、动态缩放、YaRN、LongRoPE 和 Llama 3 使用的变体。配置里会出现缩放倍数、原始最大位置和不同频率区间等参数。能把参数填进去,只说明程序可以运行,模型在新长度上的答案质量仍是另一项结果。

上下文变长以后要验什么

LongRoPE利用不同位置和不同维度不应采用同一缩放幅度这一点,搜索一组非均匀插值参数。论文报告,不微调时可扩展约八倍;它再采用分阶段训练,先到 256k,随后扩到 2048k,并对短上下文重新调整。这里已经包含搜索、训练和短文恢复,不能缩成改一行配置。

实际验收时,我会把长度分档。短输入先跑原有测试,确认常用问答没有退步。长输入再放入位置不同的事实,分别测开头、中间和结尾能否找回,并记录首字延迟、总耗时和显存。模型能接收十万词元,只代表请求没有被拒绝。若中间材料经常漏掉,那个长度对当前任务仍然不可用。

RoPE解决了顺序怎样进入注意力。上下文窗口扩到多长,则是训练、缩放和评测共同给出的结果。购买模型服务或改本地配置时,先拿自己的长文任务试一遍,比盯着参数表里的最大数字可靠。

参考资料