第四章:语言模型架构和训练的技术细节
本章核心不是重新学一遍 Transformer,而是理解:标准 Transformer 的组件是什么、现代 LLM 为什么要改这些组件、超参数如何选择,以及大模型训练时如何保证稳定性。
目录
4.1 快速回顾标准 Transformer 架构
- 4.1.1 位置编码:正余弦位置编码
- 4.1.2 多头注意力机制
- 4.1.3 LayerNorm 与残差连接
- 4.1.4 前馈网络与激活函数
4.2 Transformer 的现代变体
- 4.2.1 归一化
- 4.2.2 前馈网络
- 4.2.3 激活函数
- 4.2.4 位置编码
- 4.2.5 注意力机制变体
4.3 超参数考量与设计原则
4.4 模型稳定性
4.5 本章总结
整章知识链路
4.1 快速回顾标准 Transformer 架构
Transformer 最早由 2017 年的Attention Is All You Need提出。核心变化是用Self-Attention取代 RNN/CNN,使序列能够并行计算,同时更直接地建模长距离依赖。
一个 Transformer Block 可以抽象成:
Input │ ├── Positional Encoding │ ▼ Multi-Head Attention │ ▼ Residual + LayerNorm │ ▼ Feed Forward Network │ ▼ Residual + LayerNorm │ ▼ Output因此标准 Transformer 的四个核心组件是:
Position + Attention + Residual / Norm + FFN4.1.1 位置编码:正余弦位置编码
Self-Attention 本身没有序列顺序概念。
例如:
我 爱 你 和 你 爱 我如果没有 Position Encoding,对 Attention 来说只是相同 Token 的重新排列。
因此需要:
Token Embedding + Position Encoding ↓ Transformer Input原始 Transformer 使用固定的正余弦位置编码:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model)) PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))不同维度对应不同频率:
低维、高频 ↓ 更擅长区分附近位置 高维、低频 ↓ 覆盖更长距离它的优势是:
- 不增加可训练参数
- 数值稳定
- 不同位置拥有唯一模式
- 能一定程度表达相对位置关系
核心理解
Attention 负责理解“谁和谁有关”,Position Encoding 负责告诉模型“谁在谁前面、距离多远”。
4.1.2 多头注意力机制
Attention 的本质可以理解为:
根据相关程度,对其他 Token 的信息做加权求和。
首先从输入得到:
X ├── Wq → Q(Query) ├── Wk → K(Key) └── Wv → V(Value)核心公式:
Attention(Q,K,V) = softmax(QKᵀ / √d_k)V可以直观理解为:
QKᵀ ↓ “我要关注谁?” Softmax ↓ “每个人应该给多少权重?” × V ↓ “把相关信息取回来”为什么除以:
√d_k因为维度增大后,Q、K 点积的方差会越来越大,Softmax 更容易进入饱和区域,从而导致梯度变小。缩放后可以控制数值范围,提高训练稳定性。
为什么需要 Multi-Head?
单头 Attention 只能学习一组关系,多头则将表示空间拆成多个子空间:
Head 1 Head 2 Head 3 Head 4 │ ▼ 不同 Attention Pattern │ ▼ Concat │ ▼ Linear Projection不同 Head 有机会学习不同关系,例如:
局部语法 长距离依赖 语义关联 指代关系虽然具体 Head 学到了什么通常不可直接确定。
核心理解
Multi-Head Attention 的价值,不是简单把 Attention 做很多次,而是让模型同时从多个表示子空间理解 Token 之间的关系。
4.1.3 LayerNorm 与残差连接
LayerNorm
LayerNorm 用来控制神经网络内部激活值的分布。
基本过程:
Input ↓ 减 Mean ↓ 除 Standard Deviation ↓ γ × x + β其中:
γ:可学习缩放参数β:可学习偏置参数
核心作用:
控制激活分布 ↓ 减少数值漂移 ↓ 稳定梯度 ↓ 帮助深层网络训练Residual Connection
Residual Connection:
x ─────────────────┐ │ │ ▼ │ SubLayer(x) │ │ │ └────── + x ◀──────┘即:
y = x + F(x)它给信息和梯度提供了一条直接通路。
如果某一层没有学到有价值的东西:
F(x) ≈ 0 那么 y ≈ x因此网络至少可以保留原输入,而不会因为层数越来越深不断破坏已有信息。
原始 Transformer:Post-Norm
原始结构:
SubLayer ↓ Residual ↓ LayerNorm即:
LayerNorm(x + F(x))核心理解
Residual → 解决深层网络的信息和梯度传播 LayerNorm → 解决数值分布和训练稳定性二者共同让深层 Transformer 成为可能。
4.1.4 前馈网络与激活函数
Attention 完成 Token 之间的信息交换之后,FFN 对每个 Token 单独进行非线性加工。
原始 Transformer:
d_model ↓ Linear ↓ d_ff ↓ ReLU ↓ Linear ↓ d_model经典配置:
512 ↓ 2048 ↓ 512即:
d_ff ≈ 4 × d_modelAttention 和 FFN 的角色可以这样区分:
Attention → Token 与 Token 之间交换信息 FFN → 每个 Token 内部加工信息ReLU:
ReLU(x) = max(0, x)它计算简单、效率高,并通过非线性让多层网络不至于退化成一个线性变换。
一个合格的激活函数通常需要:
- 非线性
- 基本可微
- 计算成本低
4.2 Transformer 的现代变体
2017 年之后 Transformer 并没有发生“推倒重来”式的革命,而是在各个组件上不断进行改造。
整体演化:
| Component | 原始 Transformer | 现代 LLM |
|---|---|---|
| Normalization | Post-LayerNorm | Pre-Norm / RMSNorm / Double Norm |
| FFN | Linear + Bias | No Bias |
| Activation | ReLU | GELU / SwiGLU / GeGLU |
| Position | Sin/Cos | RoPE |
| Attention | MHA | MQA / GQA / Sparse / MLA 等 |
| Block | Attention → FFN | 主流仍以串行为主 |
这反映出一个重要趋势:
现代 LLM 的架构创新,本质是在模型能力、训练稳定性、显存占用和硬件效率之间寻找更好的平衡。
4.2.1 归一化
归一化主要发生了两个方向的变化:
放在哪里? + 怎么算?Post-Norm → Pre-Norm
原始 Transformer:
Post-Norm x ↓ SubLayer ↓ +x ↓ LayerNorm现代 Transformer:
Pre-Norm x ↓ LayerNorm ↓ SubLayer ↓ +xPre-Norm 最大价值是:
保持 Residual Stream 干净。
这样梯度可以沿着 Residual Path 更直接地从顶层传播到底层。
因此:
Pre-Norm ↓ 梯度传播更稳定 ↓ 更适合深层 Transformer这也是现代大型 Transformer 广泛采用 Pre-Norm 的重要原因。
LayerNorm → RMSNorm
LayerNorm:
减 Mean + 除 Standard Deviation + Scale + BiasRMSNorm:
不减 Mean + 只做 RMS Scaling也就是把贡献有限的步骤删掉。
这样可以:
- 减少计算
- 减少 Memory Access
- 减少参数
- 获得近似甚至相当的模型性能
这里和第三章的Arithmetic Intensity可以直接联系起来:
LayerNorm FLOPs不多 但Memory Access很多 ↓ 容易成为 Memory-Bound 操作所以 RMSNorm 属于典型的:
模型架构 + GPU 系统协同优化。
Double Norm
近期一些模型进一步采用:
Norm ↓ Attention / FFN ↓ Norm ↓ Residual也就是子层前后都进行归一化。
典型思路依然没有变化:
尽量控制进入 Residual Stream 的数值,提升超深网络的稳定性。
归一化演进总结
Post-Norm ↓ Pre-Norm ↓ RMSNorm ↓ Pre + Post / Double Norm核心目标始终是:
Training Stability + System Efficiency4.2.2 前馈网络
原始 Transformer:
Wx + b ↓ ReLU ↓ Wx + b现代模型大量采用:
Wx ↓ Activation ↓ Wx即移除 Bias。
原因包括:
参数更少 + Memory Access 更少 + 实现更简单 + 训练可能更加稳定Bias 的计算量虽然小,但需要读取额外参数,而且属于算术强度较低的操作。
因此和 RMSNorm 类似:
如果一个操作带来的模型收益非常有限,却持续增加内存访问和稳定性风险,那就把它删掉。
4.2.3 激活函数
激活函数大致经历:
ReLU ↓ GELU ↓ GLU ↓ GeGLU / SwiGLUReLU
ReLU(x) = max(0,x)优点:
- 简单
- 快
- 梯度计算便宜
缺点是 0 点不平滑。
GELU
GELU 可以看作更加平滑的 ReLU。
GPT-1、GPT-2、GPT-3 等模型曾广泛使用。
优势:
更加平滑 + 梯度性质较好缺点:
计算比 ReLU 复杂GLU:门控机制
GLU 引入一个非常重要的思想:
让模型自己决定哪些信息通过。
可以理解为:
┌── Content ─────┐ Input ──────────┤ × ─→ Output └── Gate ────────┘Gate 会根据当前输入动态产生不同权重。
因此:
传统 Activation → 固定函数处理数据 GLU → 输入决定哪些信息应该通过GeGLU 与 SwiGLU
GLU 家族中:
GLU ↓ GeGLU ↓ SwiGLUSwiGLU 已成为很多现代 LLM 的常见配置,例如 LLaMA、PaLM 等。
现代典型 FFN:
Input ├──────────→ Linear ────────────┐ │ × └→ Linear → SiLU / Swish ──────┘ ↓ Linear ↓ Output核心理解
现代 FFN 不再只是“升维 → 激活 → 降维”,而越来越像一个带动态 Gate 的信息过滤器。
4.2.4 位置编码
位置编码的主要发展路线:
Absolute Position ↓ Relative Position ↓ RoPE正余弦绝对位置编码
原始 Transformer:
Token Embedding + Position Embedding ↓ Input优点:
- 无参数
- 简单
- 可计算任意位置
但核心问题是:
它首先编码的是“我在第几个位置”。
RoPE:Rotary Position Embedding
RoPE 更关注:
两个 Token 相隔多远。
它不是简单把位置向量加到 Input,而是在 Attention 中直接旋转 Q、K。
Q(position=m) ↓ Rotate(m) K(position=n) ↓ Rotate(n) ↓ Q · Kᵀ ↓ 包含 m-n其关键数学关系是:
R(m)R(n)ᵀ = R(m-n)因此最终 QK 点积能够自然包含:
Relative Position = m - n高维 RoPE
高维向量可以拆成多个二维向量:
[x1, x2] [x3, x4] [x5, x6] ...每一对维度分别进行不同频率的旋转。
于是:
高频旋转 → 捕捉近距离变化 低频旋转 → 捕捉远距离信息这和 Sin/Cos Position Encoding 的多频率思想其实高度一致。
区别是:
Sin/Cos → 在 Transformer 输入前加入位置 RoPE → 直接把位置作用到 Q/K 的 Attention 计算中核心理解
RoPE 的本质,是利用旋转矩阵把“相对距离”编码进 QK 内积。
4.2.5 注意力机制变体
这是现代 LLM 架构优化中最重要的部分之一。
核心问题来自:
Autoregressive Generation生成 Token 时:
Token 1 ↓ Token 2 ↓ Token 3 ↓ Token 4 ...无法像训练一样把未来 Token 全部并行计算。
KV Cache
历史 Token 已经计算过 K、V:
Token 1 → K1 V1 Token 2 → K2 V2 Token 3 → K3 V3生成 Token 4 时,没有必要再重复计算 K1、K2、K3。
于是:
历史 K/V ↓ KV Cache ↓ 直接读取KV Cache:
用 Memory 换 Compute。
MHA
标准 Multi-Head Attention:
Head1 → Q1 K1 V1 Head2 → Q2 K2 V2 Head3 → Q3 K3 V3 Head4 → Q4 K4 V4问题:
Head 越多 ↓ K/V 越多 ↓ KV Cache 越大MQA
Multi-Query Attention:
Q1 ─┐ Q2 ─┤ Q3 ─┼──── Shared K / V Q4 ─┘即:
Q 独立 K/V 共享优势:
KV Cache ↓↓↓ Memory Bandwidth ↓ Inference Speed ↑代价是可能牺牲部分表达能力。
GQA
Grouped Query Attention 是 MHA 与 MQA 的折中:
Q1 ─┐ Q2 ─┴→ K1 V1 Q3 ─┐ Q4 ─┴→ K2 V2因此:
MHA │ │ 能力强 / KV大 │ ▼ GQA │ │ 折中 │ ▼ MQA KV越来越小GQA 特别适合 LLM 推理。
原因不仅是显存降低,更重要的是第三章讲过的:
Arithmetic Intensity自回归推理时大量读取 KV Cache:
Memory Access ↑ Compute 相对较少 ↓ Memory-Bound减少 K/V:
Memory Traffic ↓ ↓ Arithmetic Intensity ↑ ↓ GPU Utilization ↑因此:
GQA 本质上同时优化了 KV Cache 和显存带宽瓶颈。
Sparse / Sliding Window Attention
完整 Attention:
当前 Token ↓ 关注所有历史 Token序列越长,成本越高。
Sliding Window:
当前 Token ↓ 只看附近 N 个 Token于是 Attention 成本明显降低。
但完全局部 Attention 又可能失去长程能力,因此现代方案越来越倾向:
Local ↓ Local ↓ Local ↓ Global ↓ Local ↓ Local ↓ Local ↓ Global即:
局部 Attention 负责效率,全局 Attention 负责长距离依赖。
4.3 超参数考量与设计原则
确定 Transformer 的组件之后,还要决定:
每个组件到底应该多大?本章强调一个重要事实:
现代 LLM 的超参数并不是完全随机搜索,而是已经形成了大量经验规律。
4.3.1 FFN 大小
对于普通 ReLU / GELU FFN:
d_ff ≈ 4 × d_model例如:
d_model = 4096 d_ff ≈ 16384对于 GLU:
d_ff ≈ 8/3 × d_model ≈ 2.67 × d_model原因是 GLU 多了一条 Gate 分支,因此为了保持类似参数规模,需要适当减少 hidden dimension。
但这个比例不是铁律。
T5 曾经使用过非常极端的 FFN 扩张比例,也说明:
超参数更多是经验最优区间,而不是严格数学定律。
4.3.2 Attention Heads 与模型维度
通常:
d_model ≈ num_heads × head_dim典型思路是:
保持 head_dim 相对稳定 + 模型变大时增加 num_heads如果 head dimension 过小:
单个 Attention Head ↓ 表达空间过低 ↓ 可能出现低秩问题因此 Head 数量并不是越多越好。
4.3.3 模型 Width vs Depth
扩大模型有两条路径:
Width ↑ 或者 Depth ↑从模型表达能力角度,两者都可以增加参数量。
但从系统角度:
Wide Model ↓ 大矩阵 ↓ Tensor Parallel 更自然 Deep Model ↓ 更多 Layer ↓ Pipeline ParallelPipeline Parallel 会带来:
Pipeline Bubble + Scheduling Complexity因此真实世界中的模型设计不是纯数学问题,而是:
Model Quality + GPU Parallelism + Network Communication共同决定。
核心理解
模型的 Width / Depth,实际上也是分布式系统设计问题。
4.3.4 Vocabulary Size
早期单语言模型:
30K ~ 50K现代多语言模型往往:
100K ~ 250K更大的词表可以让:
一个词 / 字符串 ↓ 更少 Token尤其对于低资源语言:
Token 数量 ↓ ↓ Sequence Length ↓ ↓ Inference Cost ↓所以 Vocabulary Size 并不只是 NLP 问题,也直接影响:
Inference Cost4.3.5 Dropout 与 Weight Decay
传统深度学习中:
Dropout + Weight Decay主要用于防止过拟合。
但 LLM Pretraining 非常特殊:
Data 数量巨大 + 通常只训练很少 Epoch因此很难出现传统意义上的过拟合。
现代趋势:
Dropout ↓ 越来越少使用 Weight Decay ↓ 仍然普遍存在有意思的是,Weight Decay 在 LLM 中未必主要作为 Regularization。
它更像:
Weight Decay + Learning Rate Schedule ↓ 改变 Optimization Dynamics ↓ 帮助训练末期得到更低 Loss核心理解
现代 LLM 中 Weight Decay 已经不仅是“防过拟合工具”,也可以理解为优化过程的一部分。
4.4 模型稳定性
模型越大:
Parameters ↑ Training Time ↑ GPU 数量 ↑一次训练失败的成本也越来越高。
因此:
“模型能不能稳定训练几个月”本身就是核心架构问题。
典型现象:
Loss 看起来正常 但是 Gradient Norm │ ─────┼──────────── ╱╲ ╱╲ ╱╲ Gradient Spike最终可能演变成:
Gradient Explosion ↓ NaN ↓ Training CrashTransformer 中尤其容易产生数值问题的模块是:
Softmax因为其中存在:
exp() + division而 Transformer 有两个非常关键的 Softmax:
Attention Softmax + Output Softmax4.4.1 z-loss:稳定输出 Softmax
输出层:
Logits ↓ Softmax ↓ Probability如果 logits 数值越来越极端:
exp(logit)就容易变得过大。
z-loss 会额外约束 Softmax 的归一化因子:
Z = Σ exp(logit_i)目标是:
不要让 Z 变得极端于是总 Loss 可以理解成:
Cross Entropy + z-loss penalty核心思想
不要直接等 Softmax 爆掉,而是约束它内部的归一化器。
4.4.2 QK Norm:稳定 Attention Softmax
Attention:
QKᵀ ─── √d_k ↓ Softmax如果 Q、K 本身数值越来越大:
QKᵀ ↓ 巨大 Logits ↓ Softmax Saturation一种解决方式:
Q ↓ Norm │ ├────→ QKᵀ → Softmax │ K ↓ Norm即:
Softmax 输入太大,那就在进入 Softmax 之前控制 Q、K。
相比事后修复 Softmax,这是更靠前的稳定性控制方式。
4.4.3 Logit Soft Capping
第三种方式更加直接:
Attention Logits ↓ tanh ↓ [-cap, +cap] ↓ Softmax例如:
cap = 30那么:
+1000 ↓ ≈ +30 -1000 ↓ ≈ -30不是 Hard Clip:
min(max(x))而是通过 tanh 平滑压缩,因此称为:
Soft Capping不过本章也指出,目前这一方法并不总是比 QK Norm 更好,因此还没有成为绝对主流。
4.5 本章总结
这一章其实回答了四个关于transformer的连续问题。
第一层:Transformer 是什么?
Transformer │ ├── Position Encoding │ ├── Attention │ ├── Residual + Norm │ └── FFN这是 2017 年建立的基本骨架。
第二层:现代 Transformer 改了什么?
Original Transformer │ ├── Post-LN │ ↓ │ Pre-Norm / RMSNorm │ ├── ReLU │ ↓ │ SwiGLU / GeGLU │ ├── Sin/Cos Position │ ↓ │ RoPE │ └── MHA ↓ MQA / GQA ↓ Sparse / Hybrid Attention目标始终围绕:
Model Quality + Training Stability + Memory Efficiency + Compute Efficiency第三层:这些组件应该多大?
进入:
Hyperparameter Design需要考虑:
d_model d_ff num_heads head_dim num_layers vocab_size width / depth这些不是互相独立的。
例如:
Width / Depth ↓ 决定矩阵和Layer形状 ↓ 决定 Tensor / Pipeline Parallel ↓ 影响GPU通信 ↓ 影响实际训练效率第四层:怎么保证模型训得完?
模型越来越大之后:
架构正确 ≠ 训练一定稳定还需要:
RMSNorm Pre-Norm QK Norm z-loss Soft Capping Weight Decay ...不断控制:
Activation Gradient Logits Softmax的数值范围。
整章知识链路
如果把 4.1~4.5 全部串起来,可以形成下面这张图:
LANGUAGE MODEL │ ▼ ┌───────────────────┐ │ 4.1 Transformer │ │ 基础骨架 │ └─────────┬─────────┘ │ ┌───────────────┼────────────────┐ │ │ │ ▼ ▼ ▼ Position Attention FFN / Norm │ │ │ │ │ │ Sin/Cos Encoding MHA ReLU + LN │ │ │ └───────────────┼────────────────┘ │ ▼ ┌───────────────────┐ │ 4.2 Modern LLM │ │ 架构组件升级 │ └─────────┬─────────┘ │ ┌──────────────────┼──────────────────┐ │ │ │ ▼ ▼ ▼ RMSNorm RoPE SwiGLU │ │ │ │ ▼ │ │ Relative Position │ │ │ └──────────────────┬──────────────────┘ │ ▼ Attention │ ┌─────────┼─────────┐ ▼ ▼ ▼ MHA GQA MQA │ ▼ Sparse / Sliding Window │ ▼ KV Cache优化 │ ▼ Memory / Bandwidth ↓ │ ▼ ┌───────────────────┐ │ 4.3 Hyperparameter│ │ Design │ └─────────┬─────────┘ │ ┌─────────────────┼─────────────────┐ ▼ ▼ ▼ d_model d_ff Heads │ │ ├──── Width / Depth ────────────────┤ │ │ └──── Vocabulary / Regularization ──┘ │ ▼ Model Size / Compute │ ▼ Distributed Training约束 │ ▼ ┌───────────────────┐ │ 4.4 Stability │ │ 稳定训练 │ └─────────┬─────────┘ │ Softmax 是重点风险 │ ┌───────────┼───────────┐ ▼ ▼ ▼ z-loss QK Norm Soft Capping │ │ │ └───────────┼───────────┘ ▼ 控制 Logits / Gradient │ ▼ Stable Training │ ▼ MODERN LLM第三章与第四章的联系
第三章学习的是:
Tensor ↓ Memory + Compute ↓ GPU Performance第四章则是在此基础上回答:
“既然 Memory 和 Compute 都有限, Transformer 应该怎么设计?”于是很多现代架构变化都可以重新放回第三章的框架理解:
| 技术 | 本质 |
|---|---|
| RMSNorm | 减少低算术强度操作和 Memory Access |
| No Bias | 减少参数和数据搬运 |
| GQA / MQA | 减少 KV Cache 和 Memory Bandwidth |
| Sliding Window | 减少 Attention Compute / Memory |
| RoPE | 高效引入相对位置 |
| SwiGLU | 用更多有效 Compute 换更强表达能力 |
| KV Cache | Memory 换 Compute |
| QK Norm | 增加少量计算换训练稳定性 |
因此可以形成一个更大的知识链:
Chapter 3 Hardware Constraint │ ▼ Memory + Compute │ ▼ Chapter 4 Architecture Design │ ▼ Transformer Components │ ├── Attention ├── FFN ├── Position └── Norm │ ▼ Modern Optimization │ ├── Quality ├── Efficiency ├── Memory └── Stability │ ▼ Modern LLM最值得记住的一句话
现代 LLM 并不是一个完全不同于 Transformer 的新模型,而是在 Transformer 骨架上,围绕“表达能力、显存、算力、推理效率和训练稳定性”不断做工程化取舍的结果。
因此学习现代模型时,不需要死记:
LLaMA用了什么 Qwen用了什么 Gemma用了什么更值得追问的是:
这个改动解决了什么问题?
↓
Model Quality?
Memory?
Compute?
Bandwidth?
Training Stability?
如果能用这五个维度分析一个新架构,就已经开始真正建立LLM Architecture + Systems Thinking了。
(后续:训练细节和结果,进行中~)