跳到主要内容

GPT 架构详解

问题

GPT 系列模型的架构是什么?Decoder-only 的具体结构是怎样的?各组件的参数量如何计算?

答案

GPT(Generative Pre-trained Transformer)是 OpenAI 提出的 Decoder-only Transformer 架构,是当前几乎所有 LLM(Claude、LLaMA、Qwen、Mistral)的基础。

一、GPT 整体架构

二、单个 Transformer Block

每个 Block 由两个子模块组成(以现代 Pre-Norm 风格为例):

Input x

RMSNorm → Causal Self-Attention → + (残差)

RMSNorm → SwiGLU FFN → + (残差)

Output
组件作用关键参数
RMSNorm归一化,稳定训练γ\gamma(可学习缩放)
Causal Self-Attention建模 Token 间关系(只看左侧)WQ,WK,WV,WOW_Q, W_K, W_V, W_O
SwiGLU FFN非线性变换、存储知识Wgate,Wup,WdownW_{gate}, W_{up}, W_{down}
残差连接梯度直通,防止退化无参数

三、各组件详解

1. Token Embedding

将 Token ID 映射为 dmodeld_{model} 维向量。词表大小 VV、模型维度 dd

参数量 = V×dV \times d

例如 LLaMA 2:V=32000,d=4096V = 32000, d = 4096,Embedding 参数量 = 131M。

2. Causal Self-Attention(带 GQA)

GQA(Grouped-Query Attention) 为例:

参数LLaMA 2 (7B)LLaMA 2 (70B)
注意力头数 nhn_h3264
KV 头数 nkvn_{kv}32(MHA)8(GQA)
头维度 dhd_h128128
模型维度 dd40968192

每层注意力的参数:

Attn params=d×(nhdh+2nkvdh+nhdh)\text{Attn params} = d \times (n_h \cdot d_h + 2 \cdot n_{kv} \cdot d_h + n_h \cdot d_h)

WQ+WK+WV+WOW_Q + W_K + W_V + W_O

3. SwiGLU Feed-Forward Network

现代 LLM 用 SwiGLU 替代了传统 ReLU FFN:

SwiGLU(x)=(Swish(xWgate)xWup)Wdown\text{SwiGLU}(x) = (\text{Swish}(xW_{gate}) \odot xW_{up})W_{down}
  • WgateW_{gate}:门控权重,ddffd \rightarrow d_{ff}
  • WupW_{up}:上投影,ddffd \rightarrow d_{ff}
  • WdownW_{down}:下投影,dffdd_{ff} \rightarrow d
  • SwiGLU 有 3 个权重矩阵(传统 FFN 只有 2 个),但隐藏维度通常设为 83d\frac{8}{3}d 而非 4d4d

每层 FFN 参数量 = 3×d×dff3 \times d \times d_{ff}

4. LM Head

将最后一层输出映射到词表大小——和 Token Embedding 通常共享权重(Weight Tying)。

四、参数量计算

以 LLaMA 2-7B 为例(32 层,d=4096d = 4096dff=11008d_{ff} = 11008):

组件每层参数总参数
Attention (WQ,WK,WV,WOW_Q, W_K, W_V, W_O)4×40962=67M4 \times 4096^2 = 67M32×67M=2.1B32 \times 67M = 2.1B
FFN (Wgate,Wup,WdownW_{gate}, W_{up}, W_{down})3×4096×11008=135M3 \times 4096 \times 11008 = 135M32×135M=4.3B32 \times 135M = 4.3B
RMSNorm微不足道~0.3M
Embedding32000×409632000 \times 4096131M
合计~6.7B
参数量估算公式

对于标准 Transformer(无 GQA),总参数量约为:

P12×L×d2P \approx 12 \times L \times d^2

其中 LL 是层数,dd 是模型维度。7B ≈ 12×32×40962=6.4B12 \times 32 \times 4096^2 = 6.4B,非常接近。

五、GPT 系列演进

模型参数量层数维度头数上下文
GPT-1117M1276812512
GPT-21.5B481600251024
GPT-3175B9612288962048
GPT-4~1.8T(MoE)------128K

六、现代 LLM 架构改进

相比原始 GPT,现代模型的关键改进:

改进原始 GPT现代 LLM
归一化Post-Norm (LayerNorm)Pre-Norm (RMSNorm)
激活函数GELUSwiGLU
位置编码可学习绝对位置编码RoPE
注意力MHAGQA
词表BPE (GPT-2 tokenizer)SentencePiece / tiktoken
训练精度FP32 / FP16BF16

常见面试问题

Q1: 为什么 LLM 都用 Decoder-only 而不用 Encoder-Decoder?

答案

  1. Scaling 效率更好:Decoder-only 在大规模参数下表现更好(Chinchilla 验证)
  2. 通用性更强:通过 Prompt 就能完成理解和生成任务,不需要区分 Encoder/Decoder
  3. 训练更简单:只有一个目标(Next Token Prediction),数据处理更简单
  4. 推理更高效:KV Cache 直接适用,无需 Encoder 前向传播

Q2: FFN 层在 LLM 中存储了什么?

答案: 研究表明 FFN 是 LLM 的**"知识记忆"**——它存储了训练数据中的事实知识。Attention 层负责"路由"(决定看哪些信息),FFN 层负责"检索"(提取具体知识)。这也解释了为什么 FFN 的参数量通常占模型总参数的 2/3。

Q3: 什么是 Weight Tying?为什么要这样做?

答案: Token Embedding 层和最终的 LM Head 层共享同一个权重矩阵(转置关系)。好处:

  1. 减少参数量(Embedding 矩阵很大)
  2. 语义一致性——输入和输出使用相同的 Token 表示空间
  3. 对小模型效果提升明显,大模型也普遍采用

Q4: 如何理解 LLM 的"知识"和"能力"?

答案

  • 知识(Knowledge):存储在 FFN 中,来自预训练数据,如"北京是中国的首都"
  • 能力(Capability):来自架构设计和训练方法,如推理能力(CoT)、指令跟随(SFT/RLHF)、上下文学习(ICL)
  • 知识可以通过 RAG 外挂补充,能力主要靠模型本身

相关链接