为了能到远方,脚下的每一步都不能|

KeanShi

园龄:1年7个月粉丝:4关注:0

【杂学】先进的 NLP 技术 —— 旋转位置编码(Rotary Position Embedding,RoPE)

Transformer 已经渐渐成为目前 LLM 最通用底层架构之一,其中的位置编码也显得极其重要,由于注意力分数本质上是每个 token 的 val 加权和,并没有考虑其中的空间信息,因此需要在自注意力模块之前就将位置信息融合进序列中。

绝对位置编码

绝对位置编码是一种将序列中的每个位置进行编码的方法,它为每个位置分配一个唯一的编码向量。其优势在于它不依赖于序列中的其他元素,可以独立地表示每个位置的信息,比较简单容易计算。

Transformer 所用的就是绝对位置编码策略,计算公式如下:

PE(pos,2i)=sin(pos/100002i/d)

PE(pos,2i+1)=cos(pos/100002i/d)

缺点也比较明显:

  1. 绝对位置编码无法反应不同词之间的相对关系,例如位置 1 和 2 跟 5 和 500 的差异是一样的
  2. 表示不了比预训练文本长度更长的位置向量表示,如果预训练最大长度为 512 的话,那么最多就只能处理长度为 512 的句子,再长就处理不了了

相对位置编码

相对位置编码不是关注词在句子中的绝对位置,而是关注词和词之间的距离。该方法不会直接向词向量添加位置向量。而是改变了注意力机制以纳入相对位置信息。
比较经典的是 T5 模型中所用的相对位置编码。具体来说,T5 并没有像 Transformer 一样使用 PE,而是在第一个 encoder 的 QKT 后(soflmax 之后)加入了一个 relative position embbedding:

e^ijh=eijh+rij

而其中的 r 是一个标量,共有 32 种取值。这 32 种取值进行分配的策略基于假设:位置离得近的更需要精细的编码,而比较远的相反。例如设 i,j 分别为两个词的位置,ij[5,5] 会使用 5 种编码,而在 [32,64] 区间用的都是同一种编码。

相对位置编码的缺点有:

  1. 增添了计算量,需要额外维护 r 矩阵
  2. 无法适用于 KV-cache 技术。使用 KV-cache 的一项要求是已经生成的单词的位置编码,在生成新单词时不改变,而相对位置编码会变化

旋转位置编码

如上所述,相对或绝对位置编码均有其局限性。旋转位置编码(RoPE)是一种全新的方法,巧妙地融合了传统方法的优点。

二维

二维的旋转位置编码可以理解为在二维平面上将不同的 token 进行不同角度的旋转。计算公式可以推导为如下形式:

fk(xm,m)=(cosmθsinmθ)sinmθcosmθ)(Wk(1,1)Wk(1,2)Wk(2,1)Wk(2,2))(xm(1)xm(2))=(cosmθsinmθ)sinmθcosmθ)(km(1)km(2))

其中 fq 为加入位置编码的 q 向量。同样可以定义 fk,进一步可以求得两个矩阵的内积:

g(xm,xn,mn)=(qm(1)qm(2))(cos((mn)θ)sin((mn)θ)sin((mn)θ)cos((mn)θ))(kn(1)kn(2))

扩展到多维

由于内积满足线性叠加性,因此对于偶数维度的 RoPE,我们可以基于二维进行叠加扩展:

RΘ,md=(cosmθ0sinmθ00000sinmθ0cosmθ0000000cosmθ1sinmθ10000sinmθ1cosmθ1000000cosmθd/21sinmθd/210000sinmθd/21cosmθd/21)Wm

Θ={θi=100002(i1)/d,i[1,2,,d/2]}

总结

RoPE 不仅解决了输入文本过长之后引起的上下文无法关联问题,并且还提高了训练和推理的速度。总的来说,RoPE 的 self-attention 操作的流程是:

  1. 对于 token 序列中的每个词嵌入向量,首先计算其对应的 query 和 key 向量
  2. 对每个 token 位置都计算对应的旋转位置编码
  3. 接着对每个 token 位置的 query 和 key 向量的元素按照两两一组应用旋转变换
  4. 最后再计算 query 和 key 之间的内积得到 self-attention 的计算结果。

本文作者:KeanShi

本文链接:https://www.cnblogs.com/keanshi/p/18540794

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   KeanShi  阅读(240)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起