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 | 归一化,稳定训练 | (可学习缩放) |
| Causal Self-Attention | 建模 Token 间关系(只看左侧) | |
| SwiGLU FFN | 非线性变换、存储知识 | |
| 残差连接 | 梯度直通,防止退化 | 无参数 |
三、各组件详解
1. Token Embedding
将 Token ID 映射为 维向量。词表大小 、模型维度 :
参数量 =
例如 LLaMA 2:,Embedding 参数量 = 131M。
2. Causal Self-Attention(带 GQA)
以 GQA(Grouped-Query Attention) 为例:
| 参数 | LLaMA 2 (7B) | LLaMA 2 (70B) |
|---|---|---|
| 注意力头数 | 32 | 64 |
| KV 头数 | 32(MHA) | 8(GQA) |
| 头维度 | 128 | 128 |
| 模型维度 | 4096 | 8192 |
每层注意力的参数:
即 。
3. SwiGLU Feed-Forward Network
现代 LLM 用 SwiGLU 替代了传统 ReLU FFN:
- :门控权重,
- :上投影,
- :下投影,
- SwiGLU 有 3 个权重矩阵(传统 FFN 只有 2 个),但隐藏维度通常设为 而非
每层 FFN 参数量 =
4. LM Head
将最后一层输出映射到词表大小——和 Token Embedding 通常共享权重(Weight Tying)。
四、参数量计算
以 LLaMA 2-7B 为例(32 层,,):
| 组件 | 每层参数 | 总参数 |
|---|---|---|
| Attention () | ||
| FFN () | ||
| RMSNorm | 微不足道 | ~0.3M |
| Embedding | 131M | |
| 合计 | ~6.7B |
参数量估算公式
对于标准 Transformer(无 GQA),总参数量约为:
其中 是层数, 是模型维度。7B ≈ ,非常接近。
五、GPT 系列演进
| 模型 | 参数量 | 层数 | 维度 | 头数 | 上下文 |
|---|---|---|---|---|---|
| GPT-1 | 117M | 12 | 768 | 12 | 512 |
| GPT-2 | 1.5B | 48 | 1600 | 25 | 1024 |
| GPT-3 | 175B | 96 | 12288 | 96 | 2048 |
| GPT-4 | ~1.8T(MoE) | -- | -- | -- | 128K |
六、现代 LLM 架构改进
相比原始 GPT,现代模型的关键改进:
| 改进 | 原始 GPT | 现代 LLM |
|---|---|---|
| 归一化 | Post-Norm (LayerNorm) | Pre-Norm (RMSNorm) |
| 激活函数 | GELU | SwiGLU |
| 位置编码 | 可学习绝对位置编码 | RoPE |
| 注意力 | MHA | GQA |
| 词表 | BPE (GPT-2 tokenizer) | SentencePiece / tiktoken |
| 训练精度 | FP32 / FP16 | BF16 |
常见面试问题
Q1: 为什么 LLM 都用 Decoder-only 而不用 Encoder-Decoder?
答案:
- Scaling 效率更好:Decoder-only 在大规模参数下表现更好(Chinchilla 验证)
- 通用性更强:通过 Prompt 就能完成理解和生成任务,不需要区分 Encoder/Decoder
- 训练更简单:只有一个目标(Next Token Prediction),数据处理更简单
- 推理更高效:KV Cache 直接适用,无需 Encoder 前向传播
Q2: FFN 层在 LLM 中存储了什么?
答案: 研究表明 FFN 是 LLM 的**"知识记忆"**——它存储了训练数据中的事实知识。Attention 层负责"路由"(决定看哪些信息),FFN 层负责"检索"(提取具体知识)。这也解释了为什么 FFN 的参数量通常占模型总参数的 2/3。
Q3: 什么是 Weight Tying?为什么要这样做?
答案: Token Embedding 层和最终的 LM Head 层共享同一个权重矩阵(转置关系)。好处:
- 减少参数量(Embedding 矩阵很大)
- 语义一致性——输入和输出使用相同的 Token 表示空间
- 对小模型效果提升明显,大模型也普遍采用
Q4: 如何理解 LLM 的"知识"和"能力"?
答案:
- 知识(Knowledge):存储在 FFN 中,来自预训练数据,如"北京是中国的首都"
- 能力(Capability):来自架构设计和训练方法,如推理能力(CoT)、指令跟随(SFT/RLHF)、上下文学习(ICL)
- 知识可以通过 RAG 外挂补充,能力主要靠模型本身