AI Infra学习之旅-RoPE、RMSNorm、GQA与MQA、SwiGLU与MoE

这是“Transformer 原理深讲系列”的第 9 篇。
到前一篇为止,我们已经把“经典 Transformer 骨架”真正走通了:
从 token、embedding、位置编码,到 Q/K/V、Attention、FFN、残差、LayerNorm,再到手算 Attention、手算完整 block,以及用 PyTorch 写一个最小 Decoder-only Transformer。
但如果你现在去看真实的大语言模型实现,会很快发现一件事:
今天真正在线上和工程里被广泛使用的模型,已经不完全长得像 2017 年论文里的原始 Transformer。
这一篇就专门讲清楚:
为什么经典 Transformer 会演化出今天这些常见变体,它们分别在解决什么问题。


一、为什么经典 Transformer 不会原封不动地走到大模型时代

2017 年的 Attention Is All You Need 给出了 Transformer 的经典骨架:

  • token embedding
  • 位置编码
  • multi-head attention
  • FFN
  • residual
  • LayerNorm
  • Encoder / Decoder

这个骨架极其成功,也奠定了后面大模型时代的基础。
但一旦模型规模从:

  • 几千万参数
  • 几十亿、上百亿、甚至更大规模参数

同时上下文长度、推理负载、显存约束、系统吞吐要求都急剧上升,原始结构就会暴露出一些问题:

  1. 位置编码不够适合长上下文扩展
  2. LayerNorm 在某些深层大模型中不是最简洁的选择
  3. 标准多头 attention 的 K/V 开销很大
  4. 经典 FFN 还有进一步提升表达能力与参数效率的空间
  5. Dense FFN 在超大模型里会让参数和计算成本都非常高

于是,现代大模型并不是推翻 Transformer,而是围绕它的核心骨架,做了一系列结构层面的“现代化改造”。

所以这一篇的主线不是“列名词”,而是回答:

这些改动为什么会出现?


二、先给你一张总图:现代变体各自在改什么

为了建立整体感,可以先把这一篇要讲的东西压缩成下面这张映射表。

变体 它改的是哪一部分 它主要想解决什么问题
RoPE 位置表示 让 attention 更自然感知相对位置,并更适合长上下文
RMSNorm 归一化 用更简洁的归一化方式稳定训练,减少一些不必要操作
GQA / MQA attention 头结构 减少 K/V cache 开销,降低推理显存和带宽压力
SwiGLU FFN 激活与门控结构 提升 FFN 的表达能力和训练效果
MoE FFN 的计算路径 在扩大总参数量的同时,控制单 token 激活计算量

如果你把这张表记住,后面所有细节都会清晰很多。
因为它告诉你:

  • 这些变体不是随便长出来的
  • 它们每一个都有明确“痛点来源”
  • 它们大多是在大模型训练和推理压力下自然长出来的

三、先讲第一个最常见的现代变体:RoPE

在原始 Transformer 里,位置通常是这样加进去的:

hi=xi+pih_i = x_i + p_i

其中:

  • (x_i) 是 token embedding
  • (p_i) 是位置向量

也就是说,原始位置编码的基本思想是:

把位置作为一个附加向量,直接加到输入表示上。

这个做法很自然,也有效。
但当模型走向更长上下文、更大规模时,人们逐渐发现:

仅仅在输入层把位置加进去,并不是唯一也不一定是最理想的方式。

于是,现代很多大模型开始采用:

RoPE(Rotary Positional Embedding,旋转位置编码)


四、RoPE 到底在改什么

RoPE 的关键不是:

  • 继续给输入向量加一个位置向量

而是:

把位置信息直接融入 Q 和 K 的表示里。

更具体地说,RoPE 会在 attention 计算前,对 Query 和 Key 做一个与位置相关的旋转变换。
于是,注意力分数不再只是:

qikjq_i \cdot k_j

而是变成:

带有位置旋转后的 (q_i) 与 (k_j) 的点积

这样做的核心思想是:

让 attention 自己在匹配时就带上位置信号,而不是仅靠输入层的“内容 + 位置”混合向量。


五、RoPE 为什么更适合现代大模型

RoPE 之所以流行,根本原因在于它更自然地把“相对位置信息”嵌入到了 attention 的匹配机制里。

从直觉上说,RoPE 的好处主要有三点。

1. 它更强调相对位置

原始绝对位置编码更像是在告诉模型:

  • 你现在在第几号位置

而 RoPE 更容易让模型在 attention 里感受到:

  • 当前 token 和另一个 token 相差多远
  • 谁在谁前面
  • 这个相对偏移会如何影响匹配

这对于语言这种依赖相对距离和相对顺序的结构,非常自然。

2. 它直接作用在 Q/K 上

这意味着位置信号不是在输入层“埋进去”以后,希望后面层自己学会提取;
而是直接参与到了最核心的 attention 匹配过程里。

3. 它通常更适合长上下文扩展

因为它的位置作用方式更贴近 attention 本体,所以在很多长上下文场景下,RoPE 表现得更自然,也更容易成为现代 LLM 的默认选择。

所以 RoPE 本质上是在回答:

能不能把位置这件事,直接变成 attention 计算的一部分?

答案是:可以,而且效果通常很好。


六、从几何角度理解 RoPE:它本质上是在做“旋转坐标变换”

虽然 RoPE 公式看起来不算短,但它的几何直觉其实很漂亮。

如果你把一个偶数维向量拆成很多二维小块,例如:

(x1,x2),(x3,x4),(x5,x6),(x_1,x_2), (x_3,x_4), (x_5,x_6), \dots

RoPE 会对这些二维小块做一个与位置相关的旋转。
不同位置,对应不同旋转角度。

于是:

  • 位置 1 的 query 会被旋转一次
  • 位置 2 的 query 会被旋转另一种角度
  • key 也一样

这就像在不同位置上,给向量施加不同的相位变化。

所以 RoPE 的核心可以非常直观地理解成:

位置不再是“加一个向量”,而是“对表示坐标系做位置相关旋转”。

这个理解很重要,因为它能帮助你区分:

  • 绝对位置加法编码
  • 与 attention 深度耦合的旋转位置编码

七、第二个现代变体:RMSNorm 为什么会替代一部分 LayerNorm

前面我们已经讲过,经典 Transformer 常用 LayerNorm。
LayerNorm 对一个向量 (x) 做的事情是:

  1. 减去均值
  2. 除以标准差
  3. 再乘可学习参数 (\gamma),加可学习参数 (\beta)

也就是:

LN(x)=γxμσ2+ϵ+β\text{LN}(x)=\gamma \odot \frac{x-\mu}{\sqrt{\sigma^2+\epsilon}}+\beta

这当然很好用。
但当模型越来越大时,人们开始问一个问题:

这里“减去均值”这件事,是不是一定必要?

于是,很多现代模型开始采用更简洁的:

RMSNorm


八、RMSNorm 到底是什么

RMSNorm 的核心思想是:

只用均方根(root mean square)来做尺度归一化,而不显式减去均值。

形式上可以写成:

RMSNorm(x)=γx1dixi2+ϵ\text{RMSNorm}(x)=\gamma \odot \frac{x}{\sqrt{\frac{1}{d}\sum_i x_i^2+\epsilon}}

你会发现,它和 LayerNorm 的区别非常明确:

LayerNorm

  • 会减去均值
  • 会除以标准差

RMSNorm

  • 不减去均值
  • 只按整体均方根做缩放

也就是说,RMSNorm 更像是在做:

只关心向量整体尺度,不强行把它中心化。


九、为什么现代大模型喜欢 RMSNorm

RMSNorm 受欢迎,根本上不是因为它“更新潮”,而是因为它在大模型里常常更简洁、更够用。

可以从三个角度理解。

1. 归一化的核心需求往往是“控尺度”

在很多深层模型里,真正麻烦的问题往往不是均值是否为零,而是:

  • 某些层的表示尺度会不会越来越大
  • 不同层之间数值范围会不会越来越乱

RMSNorm 直接抓住了“尺度控制”这个核心。

2. 它更简洁

少了减均值这一步,结构更轻,也更容易在某些实现里带来一点简化。

3. 在现代大模型里往往够用

尤其在很多 Decoder-only LLM 中,RMSNorm 已经成为非常常见的选择。
这说明它在实际训练稳定性和效果上,足够支撑大模型工作。

所以 RMSNorm 的本质不是“更强的归一化”,而是:

用更小的结构代价,保留最关键的尺度稳定功能。


十、第三个现代变体:为什么会有 MQA / GQA

这部分和推理系统联系最紧。

我们之前讲过,多头 attention 的一个代价是:

  • 每个头都有自己的 K 和 V
  • 在 Decode 阶段,这些 K/V 都要被缓存
  • 序列越长,KV Cache 越大

而当模型头数很多、层数很多、上下文很长时,KV Cache 会迅速变成推理系统的核心负担之一。

于是,一个非常自然的问题出现了:

是不是每个 Query 头都必须配自己独立的 K/V 头?

这就引出了:

  • MQA(Multi-Query Attention)
  • GQA(Grouped-Query Attention)

十一、MQA 到底在改什么

在标准多头 attention 里:

  • 每个头都有自己的 Q
  • 也有自己的 K
  • 也有自己的 V

而 MQA 的核心变化是:

保留多个 Query 头,但让它们共享更少的 K/V 头,极端情况下共享一组 K/V。

也就是说:

  • Query 仍然是多头的
  • 但 Key / Value 不再一头一个

这样做最大的好处非常直接:

1. KV Cache 显著变小

因为缓存的是 K/V,而不是 Q。

2. 推理时带宽压力下降

Decode 每一步都要读取历史 K/V,K/V 更少就意味着读写成本更低。

3. 更适合大模型推理

尤其是长上下文和大 batch serving 时,这种收益会更明显。

所以 MQA 的本质,是在回答:

能不能让 Query 的多视角保留下来,同时减少 K/V 这部分最贵的推理状态?

答案是:可以。


十二、GQA 又是什么,为什么它经常比 MQA 更折中

MQA 虽然很省 K/V,但也可能让 K/V 共享得太狠。
于是出现了一个更平衡的变体:

GQA(Grouped-Query Attention)

GQA 的思路是:

  • 仍然保留很多 Query 头
  • 但不是所有 Query 都共享同一组 K/V
  • 而是把 Query 头分成若干组
  • 每组共享一组 K/V

所以它介于:

  • 标准多头 attention
  • 极端共享的 MQA

之间。

你可以把它理解成:

  • 标准 MHA:每个 Query 头都有自己的 K/V
  • MQA:所有 Query 头共享同一组 K/V
  • GQA:若干 Query 头共享一组 K/V

因此 GQA 的优点是:

  • 比标准多头更省 cache
  • 又比 MQA 更保留一部分灵活性

这也是为什么今天很多大模型更喜欢 GQA,而不是直接走最极端的 MQA。


十三、为什么 GQA / MQA 和推理系统关系特别大

这点一定要看清楚。

有些结构变体主要影响训练效果,
但 GQA / MQA 的最大影响之一,是直接落在:

  • KV Cache 体积
  • Decode 阶段读写带宽
  • 推理显存压力

也就是说,它不是一个“只在模型论文里重要”的改动,
它会直接改变:

  • 单卡能撑多长上下文
  • 服务端能扛多大 batch
  • 系统是否容易被 cache 打爆

所以如果你以后走 AI 推理 / Infra,这类变体必须从“结构—系统联动”的视角去看,而不是只把它当作 attention 的一个数学小修改。


十四、第四个现代变体:为什么很多模型开始用 SwiGLU

前面我们讲 FFN 时,给的是最经典的形式:

FFN(x)=W2σ(W1x+b1)+b2\text{FFN}(x)=W_2 \sigma(W_1x+b_1)+b_2

这可以是:

  • ReLU FFN
  • GELU FFN

但现代很多大模型进一步使用:

GLU 系列结构
其中最常见之一就是:

SwiGLU


十五、SwiGLU 的核心思想是什么

GLU 类结构的核心,不是单纯地把一个激活函数换掉,而是引入一种**门控(gating)**思想。

它通常会把输入映射成两路:

  • 一路作为主特征
  • 一路作为门控信号

然后让门控信号去调制主特征通道。

可以粗略写成:

SwiGLU(x)=(xWa)Swish(xWb)\text{SwiGLU}(x)= (xW_a) \odot \text{Swish}(xW_b)

然后再接输出投影。

这里的关键直觉是:

不是所有中间特征都应该被同等对待,而应该有一条“门”去决定哪些特征被放大、哪些被压制。

这和普通 FFN 的区别在于:

  • 普通 FFN:先线性,再统一激活
  • SwiGLU:通过门控,让中间特征拥有更细致的选择性

十六、为什么 SwiGLU 在现代大模型里很常见

原因很简单:

1. 表达能力更强

门控结构通常能让 FFN 的中间特征更有选择性,不是“一刀切激活”。

2. 在大模型里效果往往更好

很多现代 LLM 实践中,SwiGLU 类结构已经成为非常常见的选择。

3. 它仍然保留了 FFN 的基本角色

也就是说,它并没有推翻“attention 负责交流、FFN 负责加工”这套逻辑,
它只是让“加工这件事”本身做得更细、更强。

所以你可以把 SwiGLU 理解成:

FFN 的现代增强版,而不是 FFN 的替代品。


十七、第五个现代变体:为什么会有 MoE

如果说前面的 RoPE、RMSNorm、GQA、SwiGLU,都还是在“经典骨架上做局部优化”,
那么 MoE(Mixture of Experts) 则是更大一步的结构变化。

MoE 最核心的想法是:

不是每个 token 都必须走同一个 FFN。

在经典 dense Transformer 里:

  • 每一层的每个 token
  • 都会经过同一套 FFN 参数

这意味着:

  • 参数量扩大,所有 token 都要走同一大块 dense 计算
  • 总参数越大,算力和显存成本就越高

于是,MoE 给出的回答是:

把 FFN 分成多个 expert,让不同 token 只激活其中少数几个。


十八、MoE 到底在改哪里

最常见的 MoE 改动点就在 FFN 部分。

原来是:

  • 一个 dense FFN
  • 所有 token 都过它

现在变成:

  • 多个 expert FFN
  • 一个 router 决定当前 token 去哪个 expert
  • 通常只选 top-k 个 expert 激活

所以:

  • 总参数量可以很大
  • 但单个 token 实际激活的参数量较小

这带来一个非常重要的效果:

总容量变大了,但每个 token 的实际计算量不需要线性跟着总参数量一起涨。

这就是 MoE 最吸引人的地方。


十九、MoE 为什么会把问题从模型设计直接推向系统设计

这点非常关键。

Dense Transformer 的主要难点是:

  • 参数大
  • attention 重
  • cache 压力大

但 MoE 一上来,系统问题会立刻复杂很多。
因为一旦 token 被路由到不同 expert,就会出现:

  • 不同 token 去不同计算路径
  • 不同 expert 分布在不同设备上
  • token dispatch / gather 的通信成本
  • expert 负载均衡问题
  • all-to-all 通信问题

也就是说,MoE 不是“只是把 FFN 换个写法”,而是:

把模型内部选择路径的问题,直接暴露成系统层的通信与调度问题。

所以你以后看到:

  • expert parallel
  • all-to-all
  • DeepEP
  • load balancing
  • token dispatch

它们并不是另一个孤立世界,而是 MoE 结构的自然工程后果。


二十、把这些变体放回同一张图里看

现在我们已经讲完了五个常见现代变体。
如果把它们重新放回一张图里,你会发现它们分别在改不同层面。

1. RoPE:改位置建模

它关注的是:

  • attention 如何感知顺序
  • 相对位置如何更自然地进入匹配过程

2. RMSNorm:改归一化

它关注的是:

  • 如何更简洁地稳定深层数值尺度

3. GQA / MQA:改 attention 头结构

它关注的是:

  • 如何降低 K/V 的状态成本
  • 如何服务更高效的推理

4. SwiGLU:改 FFN 内部形式

它关注的是:

  • 如何让逐位置加工更强、更灵活

5. MoE:改 FFN 路径组织

它关注的是:

  • 如何把总参数做大
  • 但不让单 token 计算线性爆炸

也就是说,这些变体并不是“都在改 attention”或者“都在改 block”,而是在:

现代大模型面对不同瓶颈时,分别从位置、归一化、注意力状态、FFN 表达和参数路径这五个方向做出的应对。


二十一、为什么说现代大模型不是“背离 Transformer”,而是“Transformer 的时代演化”

很多人第一次看现代 LLM 架构,会有一种错觉:

  • 2017 的 Transformer 是一个东西
  • 现在的 LLaMA、Qwen、DeepSeek 之类又是另一种完全不同的东西

其实不是。

更准确地说:

现代大模型仍然是 Transformer,只是它们把经典 Transformer 中最适合保留的骨架留了下来,同时对最容易成为瓶颈的部分做了时代化改造。

被保留的骨架包括:

  • embedding
  • attention
  • FFN / MLP
  • residual
  • normalization
  • Transformer Block 堆叠
  • 自回归 Next-Token Prediction

被改造的部分则是:

  • 位置表示
  • 归一化方式
  • K/V 头组织
  • FFN 激活形式
  • FFN 是否专家化

所以最准确的理解应该是:

现代大模型不是“不是 Transformer”,而是“Transformer 在大模型训练与推理压力下的工程演化版本”。


二十二、如果站在 AI 推理 / Infra 视角,这些变体应该怎么理解

这是这一篇最重要的落点之一。

如果你只是从模型课角度看,这些变体可能只像“精度优化点”。
但如果你站在推理 / Infra 视角,它们的意义会完全不同。

RoPE

你要问的不是“它数学上优不优雅”,而是:

  • 它是否更适合长上下文
  • 它对推理实现和缓存机制有什么影响

RMSNorm

你要问的是:

  • 它在大模型里是否更稳、更简洁
  • 它对前向成本和实现复杂度意味着什么

GQA / MQA

你要立刻想到:

  • KV Cache 体积
  • Decode 带宽
  • 长上下文推理显存压力

SwiGLU

你要想到:

  • FFN 的表达能力
  • 训练效果和推理成本的平衡

MoE

你要想到:

  • token 路由
  • expert parallel
  • all-to-all
  • 系统通信与负载均衡

也就是说,推理岗位里对这些结构变体的理解方式,不应该停留在“会背缩写”,而是:

要能把结构改动直接翻译成系统后果。


二十三、本篇真正要记住的五条主线

第一条:RoPE

  • 不再只是“输入加位置向量”
  • 而是把位置信息直接融入 Q/K 匹配过程
  • 更自然地表达相对位置

第二条:RMSNorm

  • 只做均方根尺度归一化
  • 不强行减均值
  • 用更简洁方式控制深层表示尺度

第三条:GQA / MQA

  • 保留多 Query 头
  • 减少 K/V 头数量
  • 直接服务于推理时的 KV Cache 成本控制

第四条:SwiGLU

  • 给 FFN 引入门控机制
  • 让逐位置非线性加工更强、更灵活

第五条:MoE

  • 把 dense FFN 变成多 expert 路径
  • 让总参数量变大,但单 token 激活计算量受控
  • 同时把问题推向通信与系统层

二十四、用一句话压缩本篇

现代大模型并没有抛弃 Transformer,而是在保持其“attention + FFN + residual + normalization”核心骨架的同时,围绕位置表示、归一化、K/V 结构、FFN 表达能力和参数路径组织,演化出了更适合大规模训练与推理的结构变体。


二十五、这一篇之后还能继续写什么

方向一:进入 KV Cache 专题

  • KV Cache 到底存了什么
  • 它在层、头、序列三个维度上是怎么组织的
  • 为什么会有 paged KV Cache
  • 为什么 GQA/MQA 会直接改变 cache 成本

方向二:进入推理系统专题

  • continuous batching
  • Prefill / Decode 分离
  • prefix caching
  • KV-aware routing

把结构问题彻底推到 serving 层。

方向三:进入训练专题

  • pretraining
  • SFT
  • RLHF / DPO
  • 为什么模型结构和训练目标会共同决定行为能力