码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 深度学习进阶(二十五)RoPE:现代 NLP 的位置编码范式


    合集 - 深度学习进阶(31)
    1.深度学习进阶(一)从注意力到自注意力03-312.深度学习进阶(二)多头自注意力机制(Multi-Head Attention)04-023.深度学习进阶(三)Transformer Block04-044.深度学习进阶(四)Transformer 整体结构04-065.深度学习进阶(五)Vision Transformer04-086.深度学习进阶(六)归纳偏置与蒸馏04-107.深度学习进阶(七)Data-efficient Image Transformer04-138.深度学习进阶(八)Swin Transformer04-159.深度学习进阶(九)池化技术的初步改进:RoI Pooling04-1910.深度学习进阶(十) RoI Align04-2111.深度学习进阶(十一)Position-Sensitive RoI Pooling04-2412.深度学习进阶(十二)可变形池化 deformable RS RoI Pooling04-2713.深度学习进阶(十三)可变形卷积 DCN04-2914.深度学习进阶(十四)ConvNeXt04-3015.深度学习进阶(十五)通道注意力 SE05-0316.深度学习进阶(十六) 混合注意力 CBAM05-0417.深度学习进阶(十七)高效通道注意力 ECA05-0518.深度学习进阶(十八)坐标注意力 CA05-0619.深度学习进阶(十九)相对位置编码 RPE05-0920.深度学习进阶(二十)Transformer-XL05-1121.深度学习进阶(二十一)跨窗口的 RPE05-1322.深度学习进阶(二十二)T5:NLP任务的首次大一统05-1523.深度学习进阶(二十三)偏置型 RPE05-1824.深度学习进阶(二十四)Swin 的二维 RPE05-20
    25.深度学习进阶(二十五)RoPE:现代 NLP 的位置编码范式05-29
    26.深度学习进阶(二十六)现代 LLM 的核心架构设计其一:RMSNorm06-0127.深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU06-0428.深度学习进阶(二十八)现代 LLM 的核心架构设计其三:Decoder-Only 下的 KV Cache06-0829.深度学习进阶(二十九)现代 LLM 的核心架构设计其四:GQA06-0930.深度学习进阶(三十)从 Transformer 到 LLaMA:现代 LLM 架构总览06-1631.深度学习进阶(三十一)FlashAttention:IO 感知的精确注意力06-19
    收起

    上一篇我们回到 Swin 补上了它的二维 RPE 方案,用紧凑偏置表实现了高效的二维相对位置编码。
    至此,从 Shaw 的加法型、Transformer-XL 的四项重构式、再到 T5 的偏置型,Swin 的二维扩展,每种方案都在尝试不同的方法来实现 RPE。

    最终,在 NLP 这个 RPE 的"原产地",酝酿出了一种新的范式:

    有没有一种位置编码,既不修改注意力公式,也不引入额外参数,却能让 QK 点积本身就"感知"到相对位置?

    2021 年的论文:RoFormer: Enhanced Transformer with Rotary Position Embedding 给出了答案。
    它不仅解决了这个问题,还直接奠定了现代大模型中位置编码的事实标准,今天几乎所有主流开源大模型(LLaMA、Mistral、Qwen、GLM……)都在使用它。

    这套方案就是 旋转位置编码 RoPE(Rotary Position Embedding)。

    1. RoPE 的核心思路#

    我们再再再看一遍标准的自注意力:

    Attention(Q,K,V)=softmax(QKTd)V

    这里 QKT 中的每个元素 qi⋅kj ,衡量的就是 token i 和 j 的内容相关性。

    一直以来的问题都是:这个点积本身不知道任何位置信息。 比如同一个词出现在位置 1 和位置 100,只要内容相同,点积结果就完全相同。

    而之前提到过的 RPE 方案都是在"补救"这个问题,它们的共同特点是:

    位置信息是通过种种逻辑"后加"到注意力分数上的,Q、K本身的语义仍然不变。

    RoPE 的想法刚好相反:

    不在注意力公式上做任何加法,而是让 Q 和 K 的向量表示本身就携带位置信息。

    具体怎么做的?就是旋转。

    假设现在有一个 2 维向量 q=(q1,q2),我们让它绕原点旋转一个角度 θ:

    [q1′q2′]=[cos⁡θ−sin⁡θsin⁡θcos⁡θ][q1q2]

    这就是一个标准的二维旋转矩阵 R(θ),现在,我们定义一个函数,用这个矩阵对二维向量进行旋转,那就是:

    f(q)=R(θ)q

    在这个基础上,我们再加入位置参数,看看如果我们对位置 m 的 Q 旋转 mθ,对位置 n 的 K 旋转 nθ,它们的点积会是什么?

    f(q,m)=R(mθ)q,f(k,n)=R(nθ)k

    f(q,m)Tf(k,n)=qTR(mθ)TR(nθ)k

    根据正交矩阵的转置等于逆和三角函数性质,我们得到:

    R(mθ)TR(nθ)=R(−mθ)R(nθ)=R((n−m)θ)

    最终结果如下:

    f(q,m)Tf(k,n)=qTR((n−m)θ)k

    你会发现:点积结果只依赖于 n−m,即相对位置。
    这一段推导下来说明的是什么?

    如果我们用一个和位置相关的旋转函数对两个位置的 q 和 k 进行旋转,那么二者的点积结果,也就是注意力分数就会受到它们之间的相对位置影响。

    a8c60bb6-adb7-429f-8a01-bfce983cf6a4.png

    这便是 RoPE 的核心思路。

    2. RoPE 的具体逻辑#

    2.1 高维空间推广问题#

    二维旋转给了我们启发,但实际中向量维度 d 通常几百上千。
    现在,一个很自然的想法就是:

    直接对整个高维向量做一次整体旋转。

    但这里会带来一个严重问题:

    整体旋转造成大规模的信息耦合,导致优化困难。

    首先,训练后,无论是词向量,还是经过线性变换后的 Q 和 K,本质上都已经处于一个训练好的高维特征空间中。

    虽然我们很难精确说:“第几维一定表示什么语义”。但模型已经通过大量训练,学会了不同维度间的语义关系、结构。
    如果此时用一个矩阵直接对整个高维向量进行一次全局旋转,那么新的每个维度都是由所有原始维度大规模混合得到,破坏了原有的语义结构。
    例如:

    q1′=0.3q1+0.7q18−0.2q93+…

    你可能会问:

    通过反向传播,我们训练出来的语义空间本身不就是适应旋转操作的语义空间吗?

    这句话本身是完全没有问题的,但是这时:一个维度会依赖大量其它维度、局部修改会影响整体结构、特征分工会变得困难、梯度传播会更加复杂。
    因此,这种全局耦合会让优化会变得非常困难。

    因此,问题就变成了:

    如何最小入侵式地把位置信息注入到语义空间中?

    RoPE 的答案是:

    不对整个高维向量做一次整体旋转,而是把高维向量拆成多个二维子空间,每两个维度组成一组,在各自的小平面内独立旋转。

    例如对于一个向量:

    q=(q1,q2,q3,q4,q5,q6)

    RoPE 会拆成:

    (q1,q2),(q3,q4),(q5,q6)

    然后分别进行二维旋转:

    R(θ1),R(θ2),R(θ3)

    于是整个变换过程可以写成:

    RoPE(q,m)=[R(mθ1)000R(mθ2)000R(mθ3)]q

    这样:每个二维旋转块,只会影响自己对应的两个维度。
    例如 (q1,q2) 只会在自身内部发生变化:

    [q1′q2′]=R(θ)[q1q2]

    具体展开就是这样:

    q1′=q1cos⁡θ−q2sin⁡θ

    q2′=q1sin⁡θ+q2cos⁡θ

    现在, 特征只会在两个维度间进行局部混合,不会像之前一样发生全局混合。
    这样,原本的大尺度语义结构仍然保留,特征之间的稳定关系就不会被整体破坏,优化也更容易进行。

    值得一提的是,为了合理应用 RoPE 和其他相关技术,我们会刻意设计模型输入维度为偶数,如果出现了奇数情况,那么最后一维不旋转。

    除此之外,旋转本身还有一个极其重要的性质:

    旋转矩阵是正交矩阵,应用只会改变向量方向,而不会改变长度。

    这相比之前的直接修改特征值或额外叠加位置特征,RoPE 更接近在原有语义结构上,施加一种轻量级的几何变化。
    9da96c7d-d5b1-450f-8634-a7dec2ca5ced.png

    到这里,我们先初步解决了高维向量的旋转带来的优化问题,下面才是旋转在语义逻辑中的真实应用。

    2.2 不同频率的旋转#

    在之前的 T5 中,我们就提到过可学习编码相对固定编码的优势:适应能力,但这也让其失去了外推能力。
    而 RoPE 以一种及其巧妙的方式几乎实现了二者兼得,我们来具体展开:

    首先,如果所有二维子空间都使用同一个角度 θ 旋转,那么位置 m 的旋转就是:

    R(mθ)

    你会发现这时位置 m 所在 token 的所有维度都会以完全同步的方式旋转。这会导致一个严重问题:整个高维空间实际上只拥有一种位置变化模式。

    这样模型能够表达的位置关系非常有限。 因为不同的距离会被混在同一种旋转节奏中,很容易出现 “不同 token 间:我正好比你多转一个周期,咱们俩是一样的” 这种情况,这就会混淆模型对近距离和远距离的感知。

    所以,RoPE 同样给出了解决方案:

    不同二维子空间使用不同旋转频率。

    即不同维度拥有不同的 θi,通常定义为:

    θi=10000−2id

    这样,低维部分更高频,对位置变化更敏感,高维部分更低频,更适合远距离关系。
    我们举一个简单的实例,假设现在只有两个二维子空间:

    ,,θ1=1,θ2=0.01

    对于位置m=1 :

    ,,1×θ1=1,1×θ2=0.01

    而当位置变成 m=100 时:

    ,,100×1=100,100×0.01=1

    你会发现:

    1. 高频部分疯狂旋转,相邻 token 的差异会被迅速放大,它更适合编码近距离关系。
    • 低频部分变化缓慢,即使位置跨度很大,角度差异仍然保持稳定,它更适合编码长距离关系。

    这样即使某一个频率“绕了一圈”,其它频率通常仍然不会同步重复。多个频率共同组合后,模型就能够唯一地区分大量不同位置。

    现在,我们就可以回到开始的问题:

    为什么说 RoPE 同时具备“固定编码”和“可学习编码”的优点?

    首先,RoPE 的旋转规律是固定的,因此它保留了数学连续性,从而确保了外推能力。
    于此同时,真正承载语义信息的 Q 或 K 仍然是自适应的,以 Q 为例:

    Q=XWQ

    中的 WQ 仍然是可学习的,于是模型会主动学习哪些特征适合高频旋转、哪些特征适合低频旋转、如何组织语义空间去适应旋转结构等逻辑,而这就确保了其同时拥有一定的适应能力。
    4dcf22cc-d709-466f-a736-6382ed0dc336.png

    3. RoPE 的优势所在#

    最终,RoPE没有修改 Attention 公式,没有增加额外 Bias,没有显式位置表,只是对 Q,K 做了一个几何变换,就让其天然变成了与相对位置相关的注意力机制。

    在实现中,整个 RoPE 操作只是逐对执行:

    RoPE(q,m)=[q1cos⁡(mθ0)−q2sin⁡(mθ0)q1sin⁡(mθ0)+q2cos⁡(mθ0)q3cos⁡(mθ1)−q4sin⁡(mθ1)q3sin⁡(mθ1)+q4cos⁡(mθ1)⋮]

    这意味着整个操作复杂度是 O(d),和 Q/K 本身的线性变换完全同量级。 连额外计算开销都几乎没有。

    此外,值得一提的是,在 RoPE 的框架下,两个距离很远的 token 的 QK 点积上界会自然变小。
    可以理解为:不同频率的旋转角度随着 |i−j| 增大会产生不同程度的累积。高频维度在远距离时旋转了太多圈,两个向量的方向越来越难对齐,于是点积上界自然降低。
    而这种位置越远的 token,对当前 token 的影响上限越低,这恰好是语言模型需要的一种归纳偏置。

    再结合 Cache 等工程优化,从 2023 年开始,RoPE 几乎成了开源大语言模型位置编码的标准答案:

    模型系列 备注
    LLaMA / LLaMA 2 / LLaMA 3 RoPE + Position Interpolation 扩展
    Mistral / Mixtral 滑动窗口 + RoPE
    Qwen 系列 RoPE + NTK-aware 扩展
    GLM 系列 RoPE
    Gemma RoPE
    DeepSeek 改进版 RoPE

    4. 二维 RPE 现状#

    需要强调的是:RoPE 虽然成为了现代 NLP 的 RPE 范式,但其在二维数据中却并不能很好地直接迁移。

    其根本原因可以总结为:

    RoPE 建模的是“序列距离关系”,而视觉更依赖“空间几何关系”。

    在 NLP 中,token 的位置天然是一条线性序列,而图像中的位置却是二维坐标:
    虽然可以简单地将两个方向分别做 RoPE 旋转,但这种方式本质上只是两个一维编码的拼接,难以真正表达二维空间中的方向性、几何结构、局部纹理关系等视觉信息。

    此外,RoPE 还有我们上面提到的: “距离越远,相关性更容易衰减。” 的逻辑。但在视觉任务中:两个距离很远的 patch 仍然可能高度相关,例如天空纹理等。

    因此,目前二维位置编码仍然没有像 NLP 中的 RoPE 那样的统一标准答案。

    当前主流方案主要包括:

    方向 本质目标
    Relative Bias 显式建模二维距离
    2D RoPE 尝试保留 RoPE 的相对位置性质
    LePE / Conv PE 补充局部纹理与方向归纳偏置
    Hybrid 方法 同时结合全局 Attention 与局部几何结构

    其大致趋势仍然是在 Attention 的二维位置建模中引入图像数据的几何归纳偏置。

    作者:哥布林学者

    出处:https://www.cnblogs.com/Goblinscholar/p/20218513

    版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

    给自己一些时间。

  • 相关阅读:
    【Linux练习生】Linux多线程
    SpringCloud & SpringCloud Alibaba基本介绍
    MyBatis 及 MyBatis Plus 纯注解方式配置(Spring Boot + Postgresql)
    linux进程间通信之信号量
    FutureTask配合Thread实现处理有返回结果的源码、逻辑与架构分析
    【SpringMVC】处理器的封装和请求寻找到对应处理器的过程
    JZ6 从尾到头打印链表
    初认识vue,v-for,v-if,v-bind,v-model,v-html等指令
    网络安全和信息安全
    计算机毕业设计SSM爱行无忧旅游票务管理系统【附源码数据库】
  • 原文地址:https://www.cnblogs.com/Goblinscholar/p/20218513
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号