旋转位置编码ROPE

问题背景

一个长度为N的输入序列可以记为$S_N=\{w_i\}^N_{i=1}$

每一个字需要转化为embedding才能进行计算$s_n$转化为embedding后的结果可以记为

$$ E_N=\{w_i\}^N_{i=1} $$

自注意力的公式为

$$ attention(Q,K,V)=softmax(\frac{QK^\top}{\sqrt{d_k}}) $$

这里的QKV是输入的X分别对$w_k,w_q,w_v$做了一个映射。它们都是科学系的参数。

那么原始的注意力机制有什么问题吗?

就是当我们调换token出现位置之后这个位置编码是不变的。因为自注意力在计算的时候并没有考虑到序列中每个元素的位置信息。

$$ E_N=\{w_i\}^N_{i=1} =>E_N=\{f(x_i,i)\}^N_{i=1} $$

所以我们需要找到一个函数对这俩个信息进行融合,作为注意力计算的结果。

Transformer中这个函数就是绝对位置编码

$$ \begin{align} 偶数位:p_i=PE_{(pos, 2i)} &= \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) \\ 奇数位:p_i=PE_{(pos, 2i+1)} &= \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) \end{align} $$

其中方法里面定义了div位置的编码。

位置编码的目的是,将位置信息,附加到原始的信息上。

位置编码中pos表示里词语在句子中的位置索引,也就是0,1,2,3。d表示了位置编码向量的总维度数。位置编码和词向量矩阵有相同的维度。对于单词序列的每个维度。我们都要编码。i是维度索引的一半,分别使用余弦正弦实现。

那么为什么可以直接将词向量和位置编码相加,这样的操作有什么实际意义吗?它不会破坏词向量本身的信息吗?

答案是不会。因为我们使用远大于词向量+位置编码的训练数据:训练并整个词向量+位置编码的信息。模型能够理解在没有位置编码之前的权重在语境中的含义。实际上我们是在训练词向量+位置信息的新特征,极大丰富了输入特征。

因为有足够多的训练。任意词语abc的任意位置xyz 的情况都会在训练数据中出现。此外足够多的神经网络会对参数信息进行理解。

BERT在Transformer的基础上增加了可学习的位置编码

其中$x'_i=(x_i+p_i)$。除了绝对位置编码以外还有可学习的位置编码。

$$ x^i_i=(x_i+p_{wi}) $$

在bert中这个$p_w$就是512x768即512个位置,每个位置用768维向量来表示。gpt2使用了763维的词向量。gpt3使用了12288维的词向量。

rope

旋转位置编码Rotary position embedding RPE是一种用于处理序列数据的技术,在Transformer模型中引入位置信息。

旋转操作的目的是将输入的向量(如注意力机制中的Query和Key向量)通过旋转嵌入到特征空间中,从而使得位置之间的相对距离能通过旋转角度来体现。这种方式可以让模型自动捕捉序列中不同位置之间的相对关系,而不仅仅依赖于绝对关系。

而rope的实现为

$$ x'_i=x_ie^{im\theta} $$

为了方便这里用token级别的公式来表示

$$ x'_i=f(x,i) $$

旋转矩阵是一种用于表示在二维或者三维空间中旋转操作的矩阵。

在二维空间中,旋转矩阵通常表示为(顺时针)

$$ R(\theta) = \begin{pmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{pmatrix} $$

其中的$\theta$ 是旋转角度(弧度制)。这个矩阵能够将一个点或向量绕原点旋转$\theta$度。

如果我们想进行逆时针的旋转矩阵可以表示为(调换了俩个sin的位置)下文都使用这个公式。

$$ R(\theta) = \begin{pmatrix} \cos(\theta) & \sin(\theta) \\ -\sin(\theta) & \cos(\theta) \end{pmatrix} $$

旋转矩阵会有个特性计算

$$ R(\theta_1)R(\theta_2)=R(\theta_1+\theta_2) $$

此外

$$ R(\theta^\top)=R(-\theta) $$

带来位置编码的矩阵就是

$$ q\times k=qk^\top $$

旋转后再点乘那就是

$$ qR(m)\times kR(n)=qR(m)=R(n)^\top k^\top \\ =qR(m)R(-n)k^\top =qR(m-n)k^\top $$

那么如何扩展到高维空间呢?答案是让特征俩俩一组进行旋转。比如qk的特征长度为8,那就让特征俩个一组,一共四组。每组在这俩个特征组成的子空间内进行旋转。具体哪俩个一组是无所谓的,任意都可以。

上图中m是文字在第几个位置。f代表的是sin和cos的频率。频率最大的是第一个二维子空间,频率为1,频率越大波长越短,频率越小波长越长。这里给不同的二维子空间不同的旋转频率很好理解。

因为sin函数和cos函数都是中心函数。频率快的是秒针,精准很容易重复,时钟慢但不容易重复。

总结一下就是:对向量旋转需要乘以旋转矩阵,这个矩阵对向量内每俩个维度构成的子向量在它们的子控件内进行旋转。其中每个子空间旋转的频率不同。

如图左边是频率小的子空间。

传统位置编码:通常的 Transformer 位置编码使用固定的正弦/余弦函数,将每个位置映射到唯一的编码。虽然它为每个位置提供了独特的编码,但它是绝对位置的,不容易直接捕捉相对位置信息

RoPE:通过将位置嵌入旋转到不同的角度,RoPE 在序列的相对位置上具有对称性,使得相对位置信息能够自然地被模型学习到。相对位置信息在很多自然语言处理任务(如翻译、摘要等)中尤为重要,因为词语之间的相对顺序往往比它们的绝对位置更有意义。

Last modification:October 15, 2024
如果觉得我的文章对你有用,请随意赞赏