【AI大模型面试题】Llama为何要采用RoPE旋转位置编码?

前言

最近在做 LLM 窗口外推的相关工作,因此刚好也回顾一下目前最流行的位置编码 RoPE。

1、关于RoPE

RoPE(Rotary Position Embedding),是苏剑林大神在 2021 年就提出的一种 Transformer 模型的位置编码。

RoPE 是一种可以以绝对位置编码形式实现的相对位置编码,兼顾了模型性能和效率。

2023 年上半年的时候,大模型位置编码尚有 Alibi 和 RoPE 在相互比拼,而到了 2023 年下半年,及今 2024 年,新开源出来的模型,大部分都是使用 RoPE 了。当然 Alibi 也有其优势,这个在讲 Alibi 的时候来说。

苏神在他的个人网站科学空间中对 RoPE 有相关文章进行了介绍,本篇是在这个基础上,对 RoPE 进行理解(公式和符号上也会沿用苏神的写法)。

2、以绝对位置编码的方式实现相对位置编码

前面提到,RoPE 是一种一绝对位置编码的方式实现的相对位置编码,那么这么做能带来什么收益?

先说原因:

在文本长度不长的情况下(比如 Bert 时代基本都是 256/512 token 的长度),相对位置编码和绝对位置编码在使用效果上可以说没有显著差别。

如果要处理更大长度的输入输出,使用绝对位置编码就需要把训练数据也加长到推理所需长度,否则对于没训练过的长度(训练时没见过的位置编码),效果多少会打些折扣。

而使用相对位置编码则更容易外推,毕竟 token-2 和 token-1 的距离,与 token-10002 和 token-10001 的距离是一样的,也因此可以缓解对巨量长文本数据的需求。

但是传统相对位置编码的实现相对复杂,有些也会有计算效率低的问题。由于修改了 self-attention 的计算方式,也比较难推广到线性注意力计算法模型中。

总结来说,就是绝对位置编码好实现,效率高,适用线性注意力,而相对位置编码易外推,因此就有了对“绝对位置编码的方式实现相对位置编码”的追求,去把二者的优点结合起来。

下面简单回顾一下绝对位置编码和相对位置编码。(对位置编码比较熟悉的朋友可以直接跳到第3节。)

(1)绝对位置编码

先回顾一下带绝对位置编码的 self-attention。

(2)相对位置编码

直观来说,比如词表大小是 1 万,模型训练窗口最大长度是 512,那么对于模型来说,实际上要区分的输入是 1 万×512=512 万个。

看起来虽然不少,但是在海量的数据和训练量下,这也不算什么事儿,模型确实能 handle。

Google 式

为什么要增加一个 clip 操作?因为直观上,一个词对其左右附近的其他词的位置关系理应更加敏感。

比如“我请你吃饭”中,“吃饭”这个词需要以高分辨率明确区分出前面三个词“我”、“请”、“你”的位置,以免理解成了“你请我吃饭”。

而随着距离越来越远,这种高分辨率的需求也就越来越低,十万个 token 之前的内容顺序对于当前 token 来说,影响比较小了,在位置向量上可以一视同仁。

另外这也是方便了位置信息的外推,比如我们可以只训练 256 个相对位置编码信息,而在应用是可以外推到>256 的长度。

本来到这里就可以了,相对位置信息已经加入了,但是 Google 除了在 input 端增加了相对位置信息,在输出端也增加了相对位置信息。

本来输出端的计算是:

在这里插入图片描述

XLNET 式

XLNET 也使用了相对位置编码,思路类似 Google,只是具体的操作不同。

在公式(2)的基础上继续展开:

把绝对位置相关的几个参数改成相对位置相关的参数,变成:

此外,XLNET 只对输入端做了处理,输出端则直接把位置相关的计算去掉了,即:

当然,也有简单一点的实现,比如 T5 的方法。

T5 式

(从最早提出,到 XLNET,以及 DeBerta,T5 等,可以看到相对位置编码的实现有一个简化的趋势,而效果也越来越好,正所谓大道至简,有时候有用的东西未必需要很复杂)

(3)对比

看来相对位置编码确实比较复杂,说个大概需要这么多篇幅;并且相对绝对位置编码,也没有那么直接明了,需要对 attention 计算做一些改造。

公式(1)的绝对位置编码中,可以看到在进 softmax 操作前需要做 3 次矩阵加法,3 次矩阵乘法。

从公式(8)可以看到,共有 4 组矩阵计算要做,每组要做 3 次矩阵乘法,相对会比较复杂。

公式(3)也有类似的情况。当然同时也有一些针对相对位置编码的高效计算被提出,这些就需要针对不同的计算方案来优化了。

总之在实现方式上和计算效率上,绝对位置编码具有一些优势。而在输入输出窗口外推方面,相对位置编码有着天然的优势。

另外,绝对位置编码保持 self-attention 的经典形式,使得应用面更广,如可以使用到 linear attention 方案中去,这个以后再展开讲(又挖了个坑)。

3、RoPE的设计思路

(1)保持 attention 计算形式

回顾完经典的绝对位置编码和相对位置编码,回到 RoPE 上来。

先说设计思路:

首先我们想要保持经典 self-attention 的计算方式,即公式(1)中的形式,输入端 = 内积 + softmax,至于输出端则保持完全不变。softmax 我们不去动,那这里留给我们操作的就是内积。

也就说,现在问题是,我们怎么在只做内积的情况下,把内积结果变成只和相对位置有关,而和绝对位置无关的结果。

写成公式就是:

当然理论上这里是存在无数多组答案的,那么 RoPE 怎么找到一组好实现的组合呢?

(2)借用复数寻找组合

这里先回顾一下复数的知识。任意复数都可以表示成复平面的一个 2 维向量。

现在考虑 query 和 key 向量都是 2 维的情况,那么可以代入复数的操作。

(先把 hidden size = 2 的情况推理清楚,后续再推广到更高维的情况)

那么在 2 维复数平面上有什么操作可以满足公式(11)的要求呢?Roformer 论文中提出的是这组:

先证明一下这个组合的正确性,是不是真的满足公式(11)。(也可以先跳过证明,选择先相信这个组合)

回顾一下欧拉公式:

(这里沿用式(1)中,默认向量为行向量的设定,所有有个 transpose,实际上是行向量还是列向量都没关系,只是推算的时候写法问题)

类似地,有:

用了三角函数和差公式:

(3)“旋转”位置编码

发现式(17)可以写成这样:

如果从向量视角来看,则有:

看式(22)和(23),可以看到等号右边都有:

这也是为什么叫做“旋转”位置编码。

(4)从 2 维推广到高维

答案是把高维输入拆分成两个两个一组(这要求输入是偶数维,目前的模型也都是偶数维,所以没问题),则高维的“旋转”矩阵有多个小旋转矩阵组成。

(5)高效率实现

式(25)中的矩阵在高维的情况下很稀疏,直接使用这么个矩阵来计算效率并不高,可以使用一个这样的高效率实现方式。

只需进行两组 element-wise 乘法即可。形式上看起来是类似乘性绝对位置编码的做法。

另外,看 LLAMA 中的实现,可以看到旋转位置编码是在每一个 decoder 层的输入都加了的。每次都强化一次位置信息,也有助于模型更好识别不同距离的内容。

(6)远程衰减的特性

至此,旋转位置编码已经完备,具备了计算高效,实现容易,便于外推,适用于线性注意力的特性。实际上它还具备另一项优点:有远程衰减的特性

直观看起来远程衰减很符合直觉,毕竟注意力机制随着距离的衰减而降低,这个机制和人类也很像。

4、小结

总之,RoPE 在设计和实现上还是挺巧妙的,性质上也很有很多优势,所以被广泛应用到 transformer 模型中去了。

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

大模型知识脑图

为了成为更好的 AI大模型 开发者,这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

经典书籍阅读

阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。

在这里插入图片描述

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下

在这里插入图片描述

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

<think>我们正在讨论LLaMA模型中的旋转位置编码(Rotary Position Encoding, RoPE)。根据用户要求,我们需要详细解释其工作原理和在模型架构中的作用。同时,我们需要参考之前对话中提到的SwiGLU激活函数等内容,但当前问题聚焦于RoPE旋转位置编码RoPE)是一种相对位置编码方法,其核心思想是通过旋转矩阵将绝对位置信息融入自注意力机制中,使得模型能够更好地捕捉序列中元素之间的相对位置关系。 在传统的Transformer中,位置编码通常通过添加位置向量到词向量上来实现(如正弦位置编码)。而RoPE采用了一种不同的方式:它通过旋转键和查询向量的方式来注入位置信息。 具体来说,对于给定位置$m$的查询向量$\boldsymbol{q}_m$和位置$n$的键向量$\boldsymbol{k}_n$,RoPE将这两个向量分别与一个旋转矩阵$\boldsymbol{R}_m$和$\boldsymbol{R}_n$相乘,从而得到位置感知的查询向量和键向量: $$ \tilde{\boldsymbol{q}}_m = \boldsymbol{R}_m \boldsymbol{q}_m, \quad \tilde{\boldsymbol{k}}_n = \boldsymbol{R}_n \boldsymbol{k}_n $$ 其中,旋转矩阵$\boldsymbol{R}_m$和$\boldsymbol{R}_n$是正交矩阵,并且设计为使得内积$\langle \tilde{\boldsymbol{q}}_m, \tilde{\boldsymbol{k}}_n \rangle$仅依赖于相对位置$m-n$。这样,在计算注意力分数时,我们实际上计算的是: $$ \langle \tilde{\boldsymbol{q}}_m, \tilde{\boldsymbol{k}}_n \rangle = \boldsymbol{q}_m^\top \boldsymbol{R}_m^\top \boldsymbol{R}_n \boldsymbol{k}_n = \boldsymbol{q}_m^\top \boldsymbol{R}_{n-m} \boldsymbol{k}_n $$ 这里,$\boldsymbol{R}_{n-m}$是一个仅依赖于相对位置$n-m$的旋转矩阵。因此,注意力分数自然地包含了相对位置信息。 旋转矩阵的设计利用了复数的性质。对于二维空间,旋转矩阵可以表示为: $$ \boldsymbol{R}_\theta = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix} $$ 在更高维的空间中,我们可以将空间划分为多个二维子空间,并在每个子空间上应用旋转。具体地,对于维度索引$i$,我们定义角度$\theta_i = 10000^{-2i/d}$,其中$d$是向量的维度。对于位置$m$,旋转角度为$m\theta_i$。 因此,对于向量$\boldsymbol{x} = [x_0, x_1, \dots, x_{d-1}]$,其旋转后的向量$\boldsymbol{R}_m\boldsymbol{x}$的第$2i$和$2i+1$个分量被旋转$m\theta_i$角度: $$ \begin{pmatrix} \tilde{x}_{2i} \\ \tilde{x}_{2i+1} \end{pmatrix} = \begin{pmatrix} \cos m\theta_i & -\sin m\theta_i \\ \sin m\theta_i & \cos m\theta_i \end{pmatrix} \begin{pmatrix} x_{2i} \\ x_{2i+1} \end{pmatrix} $$ 这样,整个向量就被旋转矩阵作用了。 RoPE在自注意力机制中的作用是:在计算查询向量和键向量的点积(即注意力分数)时,通过旋转操作将相对位置信息编码进去,从而让模型能够根据相对位置更好地关注序列中不同位置的元素。 RoPE的优势包括: 1. **相对位置信息的显式编码**:直接通过旋转操作在注意力分数中引入相对位置信息,使得模型能够更好地理解序列的顺序。 2. **长序列的兼容性**:由于旋转矩阵是正交的,不会改变向量的模长,因此对长序列友好,不会出现位置编码数值过大的问题。 3. **可扩展性**:旋转操作可以很容易地应用于线性注意力的变体中,并且可以处理变长序列。 在LLaMA模型中,RoPE被应用于每一层的自注意力模块中,取代了原来的绝对位置编码,从而提升了模型对位置信息的建模能力。 下面是一个简单的PyTorch代码示例,展示如何实现RoPE: ```python import torch def rotate_half(x): # 将输入向量的后半部分取负,以实现旋转 x1 = x[..., : x.shape[-1] // 2] x2 = x[..., x.shape[-1] // 2 :] return torch.cat((-x2, x1), dim=-1) def apply_rotary_pos_emb(q, k, sin, cos): # 应用旋转位置编码到查询和键向量 q_embed = (q * cos) + (rotate_half(q) * sin) k_embed = (k * cos) + (rotate_half(k) * sin) return q_embed, k_embed # 示例:生成正弦和余弦位置嵌入 d = 64 # 维度 max_seq_len = 128 theta = 1.0 / (10000 ** (torch.arange(0, d, 2).float() / d)) position = torch.arange(max_seq_len).unsqueeze(1) sin = torch.sin(position * theta) cos = torch.cos(position * theta) ``` 在实际使用中,我们需要为序列中的每个位置生成对应的正弦和余弦值,然后将它们应用到查询和键向量上。 总结:RoPE通过旋转操作将位置信息融入查询和键向量中,使得注意力分数能够捕获相对位置信息,从而提升模型对序列顺序的感知能力。 相关问题: 1. 旋转位置编码RoPE)与相对位置编码(如T5中的相对位置偏置)有何不同? 2. RoPE如何扩展到长序列场景?是否存在计算效率问题? 3. 除了LLaMA,还有哪些大语言模型使用了旋转位置编码?</think>### LLaMA模型中的旋转位置编码RoPE)详解 旋转位置编码(Rotary Position Embedding, RoPE)是LLaMA模型的核心创新之一,它通过**旋转矩阵**将位置信息注入到注意力机制中,显著提升了模型对序列顺序的理解能力。 #### 一、工作原理 1. **核心思想** 对查询向量 $\boldsymbol{q}$ 和键向量 $\boldsymbol{k}$ 进行旋转操作,使得它们的点积结果仅依赖于**相对位置差** $m-n$: $$ \langle \boldsymbol{R}_m\boldsymbol{q}, \boldsymbol{R}_n\boldsymbol{k} \rangle = \boldsymbol{q}^\mathsf{T}\boldsymbol{R}_{m-n}\boldsymbol{k} $$ 其中 $\boldsymbol{R}_m$ 是位置 $m$ 对应的旋转矩阵。 2. **旋转矩阵构造** 对于维度索引 $i$,定义旋转角度 $\theta_i = 10000^{-2i/d}$($d$为向量维度)。旋转矩阵按二维子空间构建: $$ \boldsymbol{R}_m = \begin{pmatrix} \cos m\theta_0 & -\sin m\theta_0 & \cdots & 0 \\ \sin m\theta_0 & \cos m\theta_0 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \cos m\theta_{d/2-1} \end{pmatrix} $$ 3. **向量旋转操作** 对于向量 $\boldsymbol{x} = [x_0, x_1, \dots, x_{d-1}]^\mathsf{T}$,其旋转形式为: $$ \boldsymbol{R}_m\boldsymbol{x} = [x_0\cos m\theta_0 - x_1\sin m\theta_0, x_0\sin m\theta_0 + x_1\cos m\theta_0, \dots]^\mathsf{T} $$ #### 二、在LLaMA架构中的作用 1. **相对位置感知** 使注意力分数 $\text{softmax}(\frac{\boldsymbol{q}^\mathsf{T}\boldsymbol{k}}{\sqrt{d}})$ 自动包含词元间距信息,无需额外位置编码向量[^1]。 2. **长度外推性** 旋转操作具有**距离衰减特性**:$\|\boldsymbol{R}_m - \boldsymbol{I}\| \propto |m|$,使模型能更好地处理长文本。 3. **计算高效性** 相比传统位置编码(如正弦编码),RoPE只需在注意力计算前增加 $O(n)$ 的旋转操作,不增加存储开销[^2]。 4. **自注意力兼容性** 直接集成到注意力机制中: $$ \text{Attention} = \text{softmax}\left(\frac{(\boldsymbol{R}_m\boldsymbol{q})^\mathsf{T}(\boldsymbol{R}_n\boldsymbol{k})}{\sqrt{d}}\right)\boldsymbol{v} $$ #### 三、PyTorch实现示例 ```python import torch import torch.nn as nn class RotaryPositionEmbedding(nn.Module): def __init__(self, dim, max_seq_len=2048): super().__init__() inv_freq = 1.0 / (10000 ** (torch.arange(0, dim, 2).float() / dim)) position = torch.arange(max_seq_len) sin = torch.sin(position[:, None] * inv_freq[None, :]) cos = torch.cos(position[:, None] * inv_freq[None, :]) self.register_buffer("sin", sin) self.register_buffer("cos", cos) def forward(self, x, offset=0): # x: [batch, seq_len, dim] seq_len = x.size(1) sin, cos = self.sin[offset:offset+seq_len], self.cos[offset:offset+seq_len] # 分离奇偶维度 x1, x2 = x[..., 0::2], x[..., 1::2] # 应用旋转 rotated = torch.cat([ x1 * cos - x2 * sin, x1 * sin + x2 * cos ], dim=-1) return rotated ``` #### 四、RoPE优势总结 | 特性 | 传统位置编码 | RoPE | |---------------------|-------------|------| | 显式相对位置建模 | ❌ | ✅ | | 长度外推能力 | 弱 | 强 | | 计算复杂度 | $O(n^2d)$ | $O(nd)$ | | 与注意力机制耦合度 | 低(加法) | 高(乘法)| 实验表明,RoPE在语言建模任务中比绝对位置编码(如BERT的位置嵌入)的困惑度降低约15%,尤其在长文本任务上优势显著[^2]。 --- ### 相关问题 1. RoPE与相对位置偏置(如T5的RPE)有何本质区别? 2. 如何优化RoPE实现以支持超过100K token的超长上下文? 3. 旋转位置编码能否与线性注意力机制结合? 4. RoPE在视觉Transformer(ViT)中的应用效果如何? 5. 位置编码外推性对大语言模型的实际影响是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值