1llama源码学习·model.py[3]ROPE旋转位置编码(1)原理

零:(导学)Transformer位置编码

(1)为什么需要位置编码

位置编码描述序列中实体的位置信息,为每个位置分配唯一的表示。

Transformer使用智能位置编码方案,其中每个位置/索引都映射到一个向量。因此,位置编码层的输出是一个矩阵,其中矩阵的每一行表示序列的编码对象与其位置信息的总和

(2)Transformer中的位置编码

假设有一个长度为 L L L 的输入序列,并要求位置 k k k 为该序列中的对象,位置编码由不同频率的正弦和余弦函数给出:

P ( k , 2 i ) = sin ⁡ k n 2 i d P(k, 2i) = \sin{\frac{k}{n^{\frac{2i}{d}}}} P(k,2i)=sinnd2ik

P ( k , 2 i + 1 ) = cos ⁡ k n 2 i d P(k, 2i+1) = \cos{\frac{k}{n^{\frac{2i}{d}}}} P(k,2i+1)=cosnd2ik

  • k k k 输入序列中对象的位置 0 ≤ k < L 0 \leq k < L 0k<L
  • d d d 位置向量的维度
  • P ( k , j ) P(k, j) P(k,j) 位置函数,用于将输入序列中的位置 k k k 映射到位置矩阵的索引 ( k , j ) (k, j) (k,j)
  • n n n 用户自定义的标量,在《Attention Is All You Need》 中作者设置为 10000 10000 10000

在上面的表达式中,可以看到偶数位置对应正弦函数,奇数位置对应余弦函数

(3)举例

假设输入序列为 “I lovw deep learning”, n = 100, d = 4。

1llama源码学习·model.py[3]ROPE旋转位置编码(1)原理_第1张图片

一、ROPE旋转位置编码

ROPE使用一个可学习的旋转向量输入向量进行旋转

(1)ROPE与自注意力机制

在Transformers的自注意力机制中,主要有三个部分:查询( Q Q Q),键( K K K)和值 ( V V V)。在应用自注意力机制时,我们计算查询与键之间的点积: A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}}) Attention(Q,K,V)=softmax(dk QKT)(分子上面就是查询与键之间的点积 Q K T QK^T QKT),然后使用这个点积来加权值。为了引入位置信息,ROPE特别地对查询和键进行旋转。

(2)ROPE实现步骤

第一步:旋转嵌入生成

  1. 先为每个位置生成一个旋转向量。通常是通过学习一个频率向量来完成,该向量定义了如何为每个位置生成旋转角度。
  2. 给定一个位置索引 p o s pos pos 和频率向量 f r e q freq freq, 用下面的公式来计算旋转角度 θ = p o s × f r e q \theta = pos \times freq θ=pos×freq

第二步:应用旋转

  1. 使用第一步得到的旋转角度 θ \theta θ ,用来旋转查询和键

  2. 通常这可以通过在复数域中进行乘法来完成,但在实际实现中,可以用正弦函数和余弦函数在实数域中实现

  3. 给定一个向量 v v v 和旋转角度 θ \theta θ ,可以使用下面的公式进行旋转
    KaTeX parse error: Undefined control sequence: \matrix at position 15: v^, = \left[ \̲m̲a̲t̲r̲i̲x̲{ \cos{\theta…

第三步:在自注意力中使用旋转

旋转后的查询和键用于计算注意力分数。这样,模型就可以捕捉输入序列中的相对位置信息。

你可能感兴趣的:(学习)