当前位置: 首页 > news >正文

RoPE → Attention 完整

好的,我帮你把之前的“Transformer 输入 → RoPE → Attention”全流程整理成一个完整的、连贯的文档。每一步都包含数学表达 + PyTorch 示例代码,方便直接参考或实现。


Transformer 前向 + RoPE 全流程


1️⃣ 输入:Token → Embedding

数学表达

给定 token 序列t1,t2,...,tnt_1, t_2, ..., t_nt1,t2,...,tn,embedding lookup:

E=Embedding(t)∈Rn×dE = \text{Embedding}(t) \in \mathbb{R}^{n \times d}E=Embedding(t)Rn×d

示例代码

Python
运行
importtorch
importtorch.nnasnn

vocab_size=10000
d=8# 为了演示,实际 d 可能 512/1024

embedding=nn.Embedding(vocab_size,d)

tokens=torch.tensor([[1,5,9,2]])# shape: (1, n)
E=embedding(tokens)# (1, 4, 8)
print(E.shape)# (1, 4, 8)

2️⃣ 线性投影得到 Q / K / V

数学表达

Q=EWQ,K=EWK,V=EWVQ = E W_Q,\quad K = E W_K,\quad V = E W_VQ=EWQ,K=EWK,V=EWVWQ,WK,WV∈Rd×dkW_Q, W_K, W_V \in \mathbb{R}^{d \times d_k}WQ,WK,WVRd×dk

示例代码

Python
运行
d_k=d

W_Q=nn.Linear(d,d_k,bias=False)
W_K=nn.Linear(d,d_k,bias=False)
W_V=nn.Linear(d,d_k,bias=False)

Q=W_Q(E)
K=W_K(E)
V=W_V(E)

3️⃣ 构造 RoPE 角度

数学表达

θi,pos=pos100002i/dk\theta_{i,pos} = \frac{pos}{10000^{2i/d_k}}θi,pos=100002i/dkpos
  • i=0,1,...,dk/2−1i = 0,1,...,d_k/2-1i=0,1,...,dk/21

  • pos=0,1,...,n−1pos = 0,1,...,n-1pos=0,1,...,n1

示例代码

Python
运行
defget_rope_angles(seq_len,dim):
pos=torch.arange(seq_len).float()# (n,)
i=torch.arange(0,dim,2).float()# (d/2,)
inv_freq=1.0/(10000**(i/dim))# (d/2,)
theta=torch.outer(pos,inv_freq)# (n, d/2)
returntheta

theta=get_rope_angles(seq_len=E.shape[1],dim=d_k)

4️⃣ 计算 sin / cos

sin⁡(θ),cos⁡(θ)\sin(\theta), \quad \cos(\theta)sin(θ),cos(θ)

示例代码

Python
运行
sin=theta.sin()[None, :, :]# (1, n, d/2)
cos=theta.cos()[None, :, :]

5️⃣ 应用 RoPE(二维旋转)

数学表达

x2i′=x2icos⁡θ−x2i+1sin⁡θx2i+1′=x2isin⁡θ+x2i+1cos⁡θ\begin{aligned} x'_{2i} &= x_{2i} \cos\theta - x_{2i+1} \sin\theta \\ x'_{2i+1} &= x_{2i} \sin\theta + x_{2i+1} \cos\theta \end{aligned}x2ix2i+1=x2icosθx2i+1sinθ=x2isinθ+x2i+1cosθ

示例代码

Python
运行
defapply_rope(x,sin,cos):
# x: (B, n, d)
x1=x[..., ::2]# 偶数维
x2=x[...,1::2]# 奇数维
x_rot=torch.cat([
x1*cos-x2*sin,
x1*sin+x2*cos
],dim=-1)
returnx_rot

6️⃣ 对 Q / K 应用 RoPE

Q′=RoPE(Q),K′=RoPE(K)Q' = \text{RoPE}(Q), \quad K' = \text{RoPE}(K)Q=RoPE(Q),K=RoPE(K)

示例代码

Python
运行
Q_rot=apply_rope(Q,sin,cos)
K_rot=apply_rope(K,sin,cos)

7️⃣ Attention 计算

数学表达

A=Q′K′TdkA = \frac{Q' {K'}^T}{\sqrt{d_k}}A=dkQKTα=softmax(A)\alpha = \mathrm{softmax}(A)α=softmax(A)Output=αV\text{Output} = \alpha VOutput=αV

示例代码

Python
运行
scores=torch.matmul(Q_rot,K_rot.transpose(-2,-1))/(d_k**0.5)
attn=torch.softmax(scores,dim=-1)
output=torch.matmul(attn,V)
print(output.shape)# (1, n, d)

8️⃣ 流程总结

数学版:

E=Embedding(t)Q=EWQ,K=EWK,V=EWVQ′=Rθ(pos)(Q),K′=Rθ(pos)(K)Attn=softmax(Q′K′Tdk)V\begin{aligned} E &= \text{Embedding}(t) \\ Q &= E W_Q, \quad K = E W_K, \quad V = E W_V \\ Q' &= R_{\theta(pos)}(Q), \quad K' = R_{\theta(pos)}(K) \\ \text{Attn} &= \mathrm{softmax}\Big( \frac{Q' {K'}^T}{\sqrt{d_k}} \Big) V \end{aligned}EQQAttn=Embedding(t)=EWQ,K=EWK,V=EWV=Rθ(pos)(Q),K=Rθ(pos)(K)=softmax(dkQKT)V

代码版:

Python
运行
# 1. Embedding
E=embedding(tokens)

# 2. Linear projection
Q=W_Q(E)
K=W_K(E)
V=W_V(E)

# 3. RoPE angles
theta=get_rope_angles(E.shape[1],d_k)
sin=theta.sin()[None, :, :]
cos=theta.cos()[None, :, :]

# 4. Apply RoPE
Q_rot=apply_rope(Q,sin,cos)
K_rot=apply_rope(K,sin,cos)

# 5. Attention
scores=torch.matmul(Q_rot,K_rot.transpose(-2,-1))/(d_k**0.5)
attn=torch.softmax(scores,dim=-1)
output=torch.matmul(attn,V)

9️⃣ 核心理解

  1. RoPE 只作用在 Q/K,V 不变。

  2. 旋转编码位置 → attention 依赖相对位置。

  3. 相比传统E+PE+PE+P或 learned PE,RoPE 更稳定、可外推、零参数。

  4. 与多头 attention 配合 → 每个 head 可以学习不同频率的旋转,捕捉多尺度关系。


如果你愿意,我可以帮你画一个完整流程图,把Token → Embedding → Q/K/V → RoPE → Attention → Output的每个维度、形状、矩阵关系都标出来,非常直观。

你希望我画吗?

# -*- coding: utf-8 -*- """ Created on Fri Apr 3 14:13:21 2026 @author: luogan """ import torch import torch.nn as nn vocab_size = 10000 d = 8 # 为了演示,实际 d 可能 512/1024 embedding = nn.Embedding(vocab_size, d) tokens = torch.tensor([[1, 5, 9, 2]]) # shape: (1, n) E = embedding(tokens) # (1, 4, 8) print(E.shape) # (1, 4, 8) d_k = d W_Q = nn.Linear(d, d_k, bias=False) W_K = nn.Linear(d, d_k, bias=False) W_V = nn.Linear(d, d_k, bias=False) Q = W_Q(E) K = W_K(E) V = W_V(E) def get_rope_angles(seq_len, dim): pos = torch.arange(seq_len).float() # (n,) i = torch.arange(0, dim, 2).float() # (d/2,) inv_freq = 1.0 / (10000 ** (i / dim)) # (d/2,) theta = torch.outer(pos, inv_freq) # (n, d/2) return theta theta = get_rope_angles(seq_len=E.shape[1], dim=d_k) sin = theta.sin()[None, :, :] # (1, n, d/2) cos = theta.cos()[None, :, :] def apply_rope(x, sin, cos): # x: (B, n, d) x1 = x[..., ::2] # 偶数维 x2 = x[..., 1::2] # 奇数维 x_rot = torch.cat([ x1 * cos - x2 * sin, x1 * sin + x2 * cos ], dim=-1) return x_rot Q_rot = apply_rope(Q, sin, cos) K_rot = apply_rope(K, sin, cos) scores = torch.matmul(Q_rot, K_rot.transpose(-2, -1)) / (d_k ** 0.5) attn = torch.softmax(scores, dim=-1) output = torch.matmul(attn, V) print(output.shape) # (1, n, d)
http://www.jsqmd.com/news/584069/

相关文章:

  • OpenClaw技能组合:Qwen3-14b_int4_awq实现复杂工作流自动化
  • OpenClaw二次开发:基于gemma-3-12b-it构建学术文献分析插件
  • 大模型参数深度解析二:透视文本大模型——从千亿参数到“智能效率”的新平衡
  • 基于Comsol计算场与Matlab数据处理得到的三角晶格陈数计算方法
  • 力扣热门100题之二叉树最大深度
  • JavaScript 生成器函数核心用法与实践详解
  • OpenClaw技能开发入门:为Qwen3-14B定制专属自动化模块
  • 前端架构设计吐槽:别再让你的代码像坨翔!
  • 基于STM32的宠物寄养平台设计与实现
  • 大模型为什么需要 skill
  • 前端无障碍性吐槽:别再让残障人士用不了你的网站!
  • 从AI辅助到私有化部署:解析5款低代码工具
  • 低空安全刚需!西工大UAV-DETR反无人机小目标检测,参数减少40%,mAP50:95提升6.6个百分点
  • HPMSM的飞轮储能并网控制simulink仿真 MATLAB R2021b搭建
  • 激光切管卡盘:优特卡如何助力管材加工效率升级
  • 从零基础到PLC工程师:2026苏州3个月速成学习路径全解析
  • 基于域名分流的智能DNS
  • 2026年比较好的影像测量仪实力工厂推荐 - 品牌宣传支持者
  • 车辆动力学模型:Carsim与Simulink联合仿真解析空间位姿及速度随时间变化的动态特征
  • 基础ret2libc
  • 3.3 “给 Agent 一台电脑“——MCP 协议与开发者工具链深度集成
  • OpenClaw任务监控:gemma-3-12b-it执行日志的可视化分析
  • 高端制造企业如何设计薪酬体系吸引和留住高技能人才?
  • Serie嵌入式时间序列库:面向LPWAN的轻量级压缩框架
  • 2026二手名表回收鉴定实战:机芯、外观等多维度鉴定要点解析
  • 12306高铁票API预定接口开发文档
  • 【图书推荐】《Python大数据分析师的算法手册》
  • 重磅发布|中国移动智慧城市低空应用人工智能安全白皮书来袭
  • OpenClaw技能市场:Top10 Qwen3.5-9B实用插件推荐
  • 代码随想录算法训练营第十七天| LeetCode 654 最大二叉树、LeetCode 617 合并二叉树、LeetCode 700 二叉搜索树中的搜索、LeetCode 98 验证二叉搜索树