从《Attention is All You Need》 到 当代大模型架构

本文结合chatgpt生成。

原始 Transformer:2017 年的起点

《Attention is All You Need》里的 Transformer 不是今天大模型最常见的形态。它最初是一个 Encoder-Decoder 架构,主要用于机器翻译。

核心模块是:

\[\text{Attention}(Q,K,V)=\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \]

上式除以\(\sqrt d\)是因为点积的标准差是\(\sqrt d\),可以维持方差稳定。

多头注意力:

\[\text{MHA}(X)=\text{Concat}(head_1,\dots,head_h)W^O \]

其中:

\[head_i=\text{Attention}(XW_i^Q,XW_i^K,XW_i^V) \]

每层大致是:

\[x \rightarrow \text{Multi-Head Attention} \rightarrow \text{FFN} \]

FFN 当时通常是:

\[\text{FFN}(x)=W_2\text{ReLU}(W_1x+b_1)+b_2 \]

原始 Transformer 的几个特点是:

  1. Encoder-Decoder 架构。
  2. 使用 Post-LN,也就是残差之后再 LayerNorm。
  3. 使用绝对位置编码,论文里主要是 sinusoidal positional encoding。
  4. FFN 里用 ReLU。
  5. 每个 attention head 都有自己的 (Q,K,V)。
  6. 主要面向 seq2seq 任务,而不是今天这种统一的通用生成模型。

今天的大模型虽然仍然叫 Transformer,但很多关键细节已经变了。


二、最大变化之一:Encoder-Decoder 逐渐让位于 Decoder-only

原始 Transformer 是:

\[\text{Encoder}(x) \rightarrow \text{Decoder}(y) \]

其中 Encoder 双向看输入,Decoder 自回归生成输出。

但 GPT 系列、LLaMA、Qwen、Mistral 等主流文本生成大模型大多使用 Decoder-only Transformer

它的训练目标是自回归语言建模:

\[P(x_1,x_2,\dots,x_T)=\prod_{t=1}^{T}P(x_t|x_{<t}) \]

也就是根据前面的 token 预测下一个 token。

Decoder-only 的注意力矩阵带 causal mask:

\[\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}+M\right) \]

其中:

\[M_{ij}= \begin{cases} 0, & j\le i \\ -\infty, & j>i \end{cases} \]

这样第 i 个 token 只能看见自己和前面的 token,不能偷看未来。

为什么 Decoder-only 成为主流?

因为它简单、统一、可扩展。翻译、问答、代码、数学、对话、多轮推理,都可以转成“给定上下文,继续生成文本”的形式。

所以今天很多大模型的核心骨架可以写成:

\[x_{l+1}=x_l+\text{Attention}(\text{Norm}(x_l)) \]

\[x_{l+2}=x_{l+1}+\text{MLP}(\text{Norm}(x_{l+1})) \]

这就是典型的 decoder-only block。


三、LayerNorm 位置变化:Post-LN 到 Pre-LN / RMSNorm

原始 Transformer 使用的是 Post-LN:

\[x_{l+1}=\text{LN}(x_l+\text{Sublayer}(x_l)) \]

但大模型训练很深时,Post-LN 容易不稳定。后来主流模型普遍改成 Pre-LN:

\[x_{l+1}=x_l+\text{Sublayer}(\text{LN}(x_l)) \]

这样梯度更容易沿着残差路径传播,训练更稳定。

很多现代 LLM 还进一步把 LayerNorm 换成 RMSNorm。LayerNorm 是:

\[\text{LN}(x)=\frac{x-\mu}{\sqrt{\sigma^2+\epsilon}}\gamma+\beta \]

RMSNorm 则去掉了减均值部分:

\[\text{RMSNorm}(x)=\frac{x}{\sqrt{\frac{1}{d}\sum_{i=1}^{d}x_i^2+\epsilon}}\gamma \]

上面分母没有使用均值,是因为直接计算均值不适合衡量向量大小,正负数会抵消。开根号是因为开根号后才恢复成和 x 相同的量纲。

同时\(\text{RMSNorm}(x)\)模长为1,让每个 token 的 hidden state 具有稳定的整体尺度。即

\[ \operatorname{RMS}(x) = \sqrt{\frac{1}{d}\sum_{i=1}^{d}x_i^2} \]

\[\frac{1}{d}\sum_{i=1}^{d} \left( \frac{x_i}{\operatorname{RMS}(x)} \right)^2 =1 \]

LayerNorm 同时去掉均值并控制方差;RMSNorm 只控制整体幅度,不做中心化。

RMSNorm 的假设是:在 Transformer 中,控制 hidden state 的尺度比强制其均值为 0 更重要。因此它计算更简单,也常具有较好的训练稳定性。

RMSNorm 更简单,计算更省,也足够好。LLaMA、Qwen、Mistral 等很多现代模型都使用 RMSNorm。

所以原始 Transformer block:

\[y=\text{LN}(x+\text{MHA}(x)) \]

\[z=\text{LN}(y+\text{FFN}(y)) \]

逐渐变成:

\[x=x+\text{Attn}(\text{RMSNorm}(x)) \]

\[x=x+\text{MLP}(\text{RMSNorm}(x)) \]

这是现代 LLM 最常见的结构之一。


四、FFN 变化:ReLU / GELU 到 SwiGLU

原始 Transformer 的 FFN 是普通两层 MLP:

\[\text{FFN}(x)=W_2\text{ReLU}(W_1x) \]

后来 BERT、GPT-2、GPT-3 等模型大量使用 GELU:

\[\text{GELU}(x)=x\Phi(x) \]

其中 \(\Phi(x)\) 是标准正态分布的累积分布函数。

再后来,PaLM、LLaMA、Mistral、Qwen 等模型普遍采用 GLU 系列门控 MLP,尤其是 SwiGLU

SwiGLU 可以写成:

\[\text{SwiGLU}(x)=W_o\left(\text{SiLU}(xW_g)\odot xW_u\right) \]

其中:

\[\text{SiLU}(x)=x\cdot\sigma(x) \]

\[\sigma(x)=\frac{1}{1+e^{-x}} \]

\(\odot\) 是逐元素乘法。

sigmoid \(\sigma(x)\)被保留下来的主要原因是它具有很合适的门控性质:连续且平滑;输出天然具有开关含义;与输入相乘后形成 SiLU,正区间近似线性;负区间不会像 ReLU 一样突然截断;导数容易计算,训练稳定。

可以理解为 FFN 不再只是:

\[\text{激活}(xW) \]

而是变成:

\[\text{门控信号}\odot \text{内容信号} \]

即:

\[\text{gate}\odot \text{value} \]

这让 MLP 子层有更强的特征筛选能力。现代大模型里,MLP 通常承担了非常大的参数量和知识存储能力,因此 FFN/MLP 的改进非常关键。

SwiGLU 被大量现代 LLM 采用,主要是实验结果表明它在给定参数量和计算量下通常优于普通 ReLU/GELU FFN。并不存在一个严格定理证明 SiLU 永远最优。


五、位置编码变化:Sinusoidal 到 RoPE / ALiBi / 相对位置

原始 Transformer 使用绝对位置编码:

\[x_i = e_i + p_i \]

其中 \(e_i\) 是 token embedding,\(p_i\) 是位置 embedding。

sinusoidal position encoding 是:

\[PE_{pos,2i}=\sin\left(\frac{pos}{10000^{2i/d}}\right) \]

\[PE_{pos,2i+1}=\cos\left(\frac{pos}{10000^{2i/d}}\right) \]

但绝对位置编码有一个问题:模型学到的是“第 1024 个位置是什么”,而不是更自然的“两个 token 相隔多远”。

后来出现了几类改进:

1. Relative Position Bias

T5 等模型使用相对位置偏置:

\[\text{Attention}(Q,K,V)=\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}+B_{i-j}\right)V \]

其中 \(B_{i-j}\) 表示 query 位置 i 和 key 位置 j 的相对距离偏置。

2. RoPE

现在很多 LLM 使用 Rotary Position Embedding,旋转位置编码

它不是简单把位置向量加到 token embedding 上,而是对 (q,k) 做旋转:

\[q_m'=R_m q \]

\[k_n'=R_n k \]

注意力分数变成:

\[(q_m')^T k_n' = (R_m q)^T(R_n k) \]

由于旋转矩阵的性质,可以得到它和相对位置 m-n 有关:

\[(R_m q)^T(R_n k)=q^T R_{n-m} k \]

这很优雅:位置关系进入了 attention score,而且天然带有相对位置结构。

所以 RoPE 的核心优势是:它让 attention 同时感知 token 内容和相对位置关系。

LLaMA、Qwen、Mistral 等很多模型都使用 RoPE。

3. ALiBi

ALiBi 直接给 attention score 加一个和距离相关的线性偏置:

\[\frac{QK^T}{\sqrt{d_k}} - m_h |i-j| \]

其中 \(m_h\) 是第 h 个 head 的斜率。

ALiBi 简单、外推能力较好,但在今天主流 LLM 中,RoPE 更常见。


六、Attention 结构变化:MHA 到 MQA / GQA

原始 Transformer 使用标准 Multi-Head Attention,每个 head 都有自己的 (Q,K,V)。

如果有 h 个头:

\[Q_i=XW_i^Q,\quad K_i=XW_i^K,\quad V_i=XW_i^V \]

每个 head 都要缓存自己的 K,V。

但大模型推理时有一个巨大瓶颈:KV Cache

自回归生成时,每生成一个新 token,都要访问之前所有 token 的 key/value。KV cache 的大小大致与下面几个量成正比:

\[\text{KV Cache Size} \propto L \times n_{\text{layers}} \times n_{\text{heads}} \times d_{\text{head}} \]

其中 L 是上下文长度。

上下文越长、batch 越大,KV cache 压力越大。

于是出现了 MQA 和 GQA。

1. MQA:Multi-Query Attention

MQA 让所有 query heads 共享同一组 K,V。

也就是:

\[Q_1,Q_2,\dots,Q_h \]

但:

\[K_1=K_2=\dots=K_h \]

\[V_1=V_2=\dots=V_h \]

这样 KV cache 大幅减少,但可能损失一些表达能力。

2. GQA:Grouped-Query Attention

GQA 是折中方案。多个 query heads 共享一组 (K,V)。

例如有 32 个 query heads,但只有 8 组 KV heads:

\[n_{kv} < n_q \]

每一组 query heads 共享对应的 key/value。

GQA 在现代 LLM 中非常常见,比如 LLaMA 2/3、Mistral、Qwen 等很多模型都采用类似设计。

可以简单理解:

结构 表达能力 KV cache 推理效率
MHA
MQA 较弱
GQA 较强 较小 较快

七、长上下文:从几百/几千 token 到几十万 token

原始 Transformer 的复杂度是:

\[O(n^2d) \]

因为每个 token 都要和所有 token 做 attention。

当上下文长度 n 变大时,attention 矩阵大小是:

\[n\times n \]

这会非常昂贵。

所以长上下文方向出现了很多改进:

1. 位置编码外推

RoPE 本身不一定能直接泛化到远超训练长度的上下文,所以后来有很多 RoPE scaling 技术,例如 NTK-aware scaling、YaRN、LongRoPE 等。

大致思想是调整旋转频率,让模型能适应更长的位置范围。

原始 RoPE 中,不同维度使用不同频率:

\[\theta_i = 10000^{-2i/d} \]

长上下文扩展往往会修改这个频率分布。

2. 稀疏注意力 / 局部注意力

全注意力是:

\[\text{每个 token 看所有 token} \]

局部注意力变成:

\[\text{每个 token 只看附近窗口内 token} \]

复杂度从:

\[O(n^2) \]

下降到:

\[O(nw) \]

其中 w 是窗口大小。

Mistral 的 sliding window attention 就属于这一类思路。

3. 分块 attention / 记忆机制

一些模型会把上下文分块,或者引入 memory token、compressed memory、retrieval memory 等机制。

本质上都是想解决一个问题:

\[\text{如何避免每个 token 都和所有历史 token 显式交互?} \]


八、FlashAttention:不是数学架构变了,但工程上极其重要

FlashAttention 不改变 attention 的数学形式:

\[\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \]

但它改变了计算方式。

普通 attention 会显式构造 QK^T,也就是 \(n\times n\) 矩阵,显存读写非常重。

FlashAttention 的核心是:

  1. 分块计算 attention。
  2. 避免显式 materialize 整个 attention matrix。
  3. 用 online softmax 保持数值正确。
  4. 尽可能利用 SRAM,减少 HBM 访问。

所以它不是“模型结构创新”,而是“让标准 attention 真的能高效跑起来”的关键系统优化。

对大模型来说,很多时候瓶颈不是 FLOPs,而是 memory bandwidth。


九、Dense 到 MoE:参数量越来越大,但每次只激活一部分

传统 Transformer 是 dense model。

每个 token 经过每一层 MLP 时,都会使用全部参数。

MoE,也就是 Mixture of Experts,把 FFN 换成多个专家:

\[\text{MoE}(x)=\sum_{i=1}^{N}g_i(x)E_i(x) \]

其中 \(E_i\) 是第 \(i\) 个 expert,\(g_i(x)\) 是 router 给它的权重。

实际中常用 top-k routing:

\[\text{MoE}(x)=\sum_{i\in \text{TopK}(g(x))}g_i(x)E_i(x) \]

例如 top-2 routing 就是每个 token 只送入两个专家。

MoE 的好处是:
总参数量可以很大,但每个 token 实际激活的参数量相对较小。

也就是:

\[\text{Total Params} \gg \text{Activated Params} \]

这使得模型可以有更大的容量,同时推理计算量不按总参数量线性增长。

但 MoE 也带来问题:

  1. router 训练不稳定。
  2. expert 负载不均衡。
  3. 分布式通信复杂。
  4. 推理部署更困难。

Mixtral、DeepSeek-V2/V3 等公开模型都展示了 MoE 路线的影响力。


十、Embedding 和输出层:权重共享、词表扩大、多语言优化

原始 Transformer 就已经使用 token embedding 和输出 softmax:

\[P(x_t|x_{<t})=\text{softmax}(h_tW_{\text{vocab}}^T) \]

很多现代模型会让输入 embedding 和输出 projection 共享权重:

\[W_{\text{in}} = W_{\text{out}} \]

这叫 weight tying,可以减少参数,也能带来一定正则化效果。

另一个变化是 tokenizer 和词表设计。早期英文模型更多使用 BPE;现代多语言模型常用更大的词表,兼顾英文、中文、代码、数学符号等。

这不完全是 Transformer block 的架构变化,但会显著影响模型能力,尤其是中文、代码和数学任务。


十一、多模态架构:Transformer 从文本骨架变成通用接口

现代大模型已经不只处理文本,还可以理解图像、音频、视频等信息。但很多多模态大模型并不是重新设计一套全新的 Transformer,而是保留一个强大的语言模型作为核心,然后想办法把其他模态转换成它能处理的形式。

以图像为例,LLM 本来只能接收文本 token,比如:

\[[\text{今天}, \text{天气}, \text{很好}] \]

但图像不是文字,不能直接喂给语言模型。因此通常需要先用一个视觉编码器提取图像特征:

\[z_{\text{img}} = f_{\text{vision}}(I) \]

其中 I 表示输入图像,\(f_{\text{vision}}\) 表示视觉编码器,\(z_{\text{img}}\) 表示图像特征。

不过,视觉编码器输出的特征空间和 LLM 的词向量空间通常不一样,所以还需要一个投影层,把图像特征转换成 LLM 能接收的 hidden states:

\[x_{\text{img}} = W_p z_{\text{img}} \]

这里的 \(x_{\text{img}}\) 就可以理解成“视觉 token”。它们不是文字 token,但在形状和语义空间上已经被转换成了 LLM 可以处理的输入。

所以,一个常见的多模态模型结构可以概括为:

\[\text{图像} \rightarrow \text{视觉编码器} \rightarrow \text{投影层} \rightarrow \text{LLM} \]

也就是:

\[\text{Vision Encoder} + \text{Projector} + \text{Decoder-only LLM} \]

例如,当用户输入一张图片并提问“这张图里有什么?”时,模型大致会先把图片编码成一组视觉 token,再把这些视觉 token 和用户的文本 token 拼接起来,一起送入 LLM:

\[[\text{视觉 token}] + [\text{文本 token}] \rightarrow \text{LLM} \]

这样,LLM 就可以在生成答案时同时参考图像信息和文本问题。

更复杂的多模态模型还会加入 cross-attention、query tokens、Perceiver Resampler 等模块。它们的作用可以简单理解为:在把图像信息交给 LLM 之前,先对视觉特征进行筛选、压缩和整理,避免把过多、过杂的视觉信息直接塞进语言模型。


十二、现代 LLM 的典型结构长什么样?

以很多 LLaMA-like 模型为代表,一个现代 decoder-only Transformer block 通常类似:

\[x = x + \text{SelfAttention}(\text{RMSNorm}(x)) \]

\[x = x + \text{SwiGLU}(\text{RMSNorm}(x)) \]

其中 attention 使用:

\[Q=XW^Q,\quad K=XW^K,\quad V=XW^V \]

然后对 (Q,K) 加 RoPE:

\[Q'=R_{\text{pos}}Q,\quad K'=R_{\text{pos}}K \]

再做 causal attention:

\[\text{Attn}(Q',K',V)=\text{softmax}\left(\frac{Q'K'^T}{\sqrt{d_k}}+M\right)V \]

整体可以概括为:

\[\boxed{ \text{Decoder-only}+ \text{PreNorm/RMSNorm}+ \text{RoPE}+ \text{SwiGLU}+ \text{GQA/MQA}+ \text{KV Cache} } \]

如果是更大规模模型,还可能加上:

\[\boxed{ \text{MoE}+ \text{Long Context}+ \text{Multimodal Adapter} } \]


十三、从 2017 到今天,核心变化总结

可以用一张表概括:

方面 2017 Transformer 现代大模型常见做法
总体结构 Encoder-Decoder Decoder-only 为主
训练目标 机器翻译 seq2seq 自回归 next-token prediction
Norm Post-LN Pre-LN / RMSNorm
FFN 激活 ReLU GELU / SwiGLU
位置编码 Sinusoidal absolute PE RoPE / Relative Bias / ALiBi
Attention 标准 MHA MHA / MQA / GQA
长上下文 通常较短 RoPE scaling、滑窗、稀疏、分块
参数组织 Dense Dense + MoE
推理 不强调 KV cache KV cache 是核心机制
工程实现 普通 attention FlashAttention、PagedAttention 等
模态 文本为主 文本、图像、音频、视频统一建模
典型模型 原始 Transformer GPT、LLaMA、Qwen、Mistral、DeepSeek、Gemini/Claude 类模型
posted @ 2026-05-19 22:30  wljss  阅读(3)  评论(0)    收藏  举报