1. 为什么需要位置编码
在NLP任务中,一个单词的位置和它在句子中的语义是息息相关的,比如“我爱你”和“你爱我”,单词的顺序和位置发生了改变,整个句子的语义也发生了改变。
在RNN或者LSTM中,模型本身就包含了时序信息,RNN的循环结构使得模型在处理序列数据时,能够自然地捕捉到序列中的顺序关系。每个时间步的输出都依赖于前一个时间步的隐藏状态,这种依赖关系使得模型能够记住并利用序列中元素的顺序信息。
但是对于Transformer模型来说,它本身是一个完全基于自注意力机制(Self-Attention)的模型,它在处理输入序列时,是把所有的单词看作一个集合,而不是一个序列,也就是说,它无法直接捕捉到单词之间的顺序关系。
为了解决这个问题,Transformer引入了位置编码(Positional Encoding),它的主要作用就是给模型提供关于单词位置的信息。
2. 绝对位置编码
在原始的Transformer论文《Attention Is All You Need》中,作者提出了一种基于sinsinsin和coscoscos函数的绝对位置编码方法。这种方法为输入序列中的每个位置生成一个固定维度的向量,然后将这个向量与对应的词嵌入向量相加,作为模型的输入。

具体的公式如下:
PE(pos,2i)=sin(pos/100002i/dmodel)PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{\text{model}}})PE(pos,2i)=sin(pos/100002i/dmodel)
PE(pos,2i+1)=cos(pos/100002i/dmodel)PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{\text{model}}})PE(pos,2i+1)=cos(pos/100002i/dmodel)
其中:
- pospospos 是单词在句子中的位置。
- iii 是位置编码向量中的维度索引。
- dmodeld_{\text{model}}dmodel 是模型的维度,也就是词嵌入的维度。
通过这个公式,我们可以为每个位置生成一个dmodeld_{\text{model}}dmodel维的位置编码向量。这个向量的每个维度都由一个正弦或余弦函数生成,并且频率随着维度的增加而降低。
为什么这种方法有效呢?
主要是在每个位置上都生成了一个唯一的位置编码向量,这个向量包含了单词在句子中的绝对位置信息。且sinsinsin和coscoscos的值域在[−1,1][-1, 1][−1,1]之间,这有助于稳定模型的训练。
3. 旋转位置编码(RoPE)
尽管绝对位置编码在很多任务上都取得了不错的效果,但它也存在一些问题。因为训练集中的短文本更多,导致绝对位置中长文本的位置编码信息被忽略,模型无法利用到长文本的位置信息。
由此引入相对位置编码,它希望对在计算自注意时,能够利用到单词之间的相对位置关系。只要在计算自注意力时,有相对位置信息参与了计算,模型就能够利用到单词之间的相对位置关系(如两个token位置分别是iii和jjj,那么它们的相对位置就是i−ji-ji−j)。
为了解决这些问题,旋转位置编码(Rotary Positional Embedding, RoPE)被提出来了。RoPE的核心思想是通过旋转操作来表示相对位置关系。
具体来说,RoPE不再是将位置信息直接加到词嵌入上,而是在自注意力机制的计算过程中,将位置信息融入到Query和Key向量中。
再引入RoPE之前,必须先了解一下旋转矩阵的基础。
3.1 旋转矩阵基础
什么是旋转矩阵,假设我们有一个点AAA,我们将其以原点为中心,逆时针旋转β\betaβ角度,得到新的点A′A'A′。那么其旋转矩阵是如何得到的?

根据旋转矩阵的意义,我们再看下它的特点:

3.2 RoPE介绍
RoPE将这个思想应用到了高维的Query和Key向量上。因为旋转矩阵是一个二维矩阵,所以它将ddd维的向量两两配对,然后在每个二维子空间中进行旋转。因此构建一个巨大的旋转矩阵,它的构建方式如下:

这里ttt是token的位置,θ\thetaθ是固定的角度值(是固定值,不需要学习),HHH是向量的维度。
这个矩阵参考书籍《大语言模型》。
这个矩阵特殊构造成这个形式的,是固定预先生成好的,不需要模型学习。大家了解下就行,关键是了解它是如何参与注意力计算的,以及为什么它能够引入相对位置信息。
对于位置为mmm的Query向量qm\mathbf{q}_mqm和位置为nnn的Key向量kn\mathbf{k}_nkn,RoPE通过以下方式将位置信息融入进去:
f(q,m)=RΘ,mdqf(\mathbf{q}, m) = \mathbf{R}_{\Theta, m}^d \mathbf{q}f(q,m)=RΘ,mdq
f(k,n)=RΘ,ndkf(\mathbf{k}, n) = \mathbf{R}_{\Theta, n}^d \mathbf{k}f(k,n)=RΘ,ndk
其中RΘ,md\mathbf{R}_{\Theta, m}^dRΘ,md是一个旋转矩阵。经过这样的变换后,我们再计算它们的内积:
<f(q,m),f(k,n)>=(RΘ,mdq)T(RΘ,ndk)=qT(RΘ,md)TRΘ,ndk<f(\mathbf{q}, m), f(\mathbf{k}, n)> = (\mathbf{R}_{\Theta, m}^d \mathbf{q})^T (\mathbf{R}_{\Theta, n}^d \mathbf{k}) = \mathbf{q}^T (\mathbf{R}_{\Theta, m}^d)^T \mathbf{R}_{\Theta, n}^d \mathbf{k}<f(q,m),f(k,n)>=(RΘ,mdq)T(RΘ,ndk)=qT(RΘ,md)TRΘ,ndk
由于旋转矩阵是正交矩阵,我们有(RΘ,md)T=(RΘ,md)−1=RΘ,−md(\mathbf{R}_{\Theta, m}^d)^T = (\mathbf{R}_{\Theta, m}^d)^{-1} = \mathbf{R}_{\Theta, -m}^d(RΘ,md)T=(RΘ,md)−1=RΘ,−md。因此:
<f(q,m),f(k,n)>=qTRΘ,−mdRΘ,ndk=qTRΘ,n−mdk<f(\mathbf{q}, m), f(\mathbf{k}, n)> = \mathbf{q}^T \mathbf{R}_{\Theta, -m}^d \mathbf{R}_{\Theta, n}^d \mathbf{k} = \mathbf{q}^T \mathbf{R}_{\Theta, n-m}^d \mathbf{k}<f(q,m),f(k,n)>=qTRΘ,−mdRΘ,ndk=qTRΘ,n−mdk
从这个结果可以看出,内积的结果只与相对位置n−mn-mn−m有关,而与绝对位置mmm和nnn无关。这就是RoPE的精髓所在。
像RoPE这种相对位置编码,它的优势在于每个位置学习的是相对位置信息,而不是绝对位置信息。这使得模型能够更好地学习到token之间的相对位置关系,从而提高了模型的性能。使模型在大量短序列文本中训练完成后,在量级较少的长文本序列上进行微调,就能很好的处理长文本序列。
1575

被折叠的 条评论
为什么被折叠?



