LLM架构深度解析:从Embedding到输出的完整工程图谱
以GPT系列为锚点,系统剖析大语言模型各核心组件的设计原理、工程实现与演进逻辑
📖 目录
一、LLM架构全景
1.1 从Transformer到Decoder-Only的范式转变
2017年Vaswani等人提出Transformer时,设计的是Encoder-Decoder架构——左侧Encoder处理输入序列,右侧Decoder负责生成输出。这种架构在机器翻译任务上表现优异,但在大语言模型时代,一个根本性的转变悄然发生:**Decoder-Only架构成为了绝对主流**。
这个转变的背后是自回归语言建模的本质需求:给定前文,预测下一个token。这不需要Encoder的"双向"理解能力——Decoder的Causal Mask已经足够了。更重要的是,Decoder-Only带来了一个关键优势:**预训练和推理使用完全相同的架构**,中间没有任何信息损失。
1.2 统一架构的形成
从GPT(2018)到GPT-4(2023),大语言模型的架构经历了数次演进,但核心框架逐渐收敛为一个相对统一的模式:
LLM 统一架构(以 LLaMA-2 70B 为例):
输入文本 → Tokenization → Embedding → N×[Attention + FFN] → RMSNorm → LM Head → 词汇分布
详细分解:
1. Tokenization: SentencePiece BPE, 词汇表 32,000 tokens
2. Embedding: 隐藏维度 d_model = 4096, 输出 [seq_len, 4096]
3. Transformer Layers: 80 层
4. 每层包含:
- Attention: Multi-Head QKV 投影 (3 × [4096, 4096])
- Attention Output: 线性投影 [4096, 4096]
- FFN Gate: SwiGLU [4096, 11008]
- FFN Up/Down: [4096, 11008] + [11008, 4096]
- RMSNorm: 每层2个(attn前 + FFN前)
5. 最终 RMSNorm → LM Head [4096, 32000]
总参数量 ≈ 70B
每层参数量 ≈ 0.85B
FFN 参数量占比 ≈ 67% (47B / 70B)
1.3 参数量分布的68法则
理解LLM的参数分布对工程实践至关重要。经验规律是:**FFN占据约2/3的参数,Embedding和Attention各占约1/6**。这个规律在1B到70B的模型上都高度一致,意味着无论模型大小,工程优化都可以有针对性地进行。
| 组件 | 参数量(70B模型) | 占比 | 计算量占比 |
|---|---|---|---|
| Embedding + LM Head | ~11.5B | ~16% | 低(前向一次) |
| Attention(QKV + O投影) | ~11.5B | ~16% | 高(O(n²)) |
| FFN(Gate + Up + Down) | ~47B | ~67% | 极高(矩阵乘) |
| LayerNorm / RMSNorm | ~0.5B | ~0.7% | 极低 |
二、输入Embedding与Tokenization
2.1 BPE Tokenization的工程决策
Tokenization是LLM处理文本的第一步,也是经常被忽视的性能瓶颈之一。BPE(Byte Pair Encoding)通过将文本分解为subword单元,在词汇表大小和表示效率之间取得平衡。
词汇表大小的选择是一个关键工程决策:过大的词汇表(>100k)会显著增加Embedding的参数量和计算成本;过小的词汇表(<20k)会导致token序列过长,增加Attention的计算量。LLaMA选择32k是一个经过验证的工程折中。
# Tokenization 决策矩阵
词汇表大小 vs 模型性能(固定参数量的假设):
| 词汇表 | 序列长度 | Embedding参数量 | 表示效率 |
|---------|----------|-----------------|----------|
| 10k | 长 | 低 | 中等 |
| 32k | 中等 | 中等 | 较高 |
| 50k | 较短 | 高 | 高 |
| 200k+ | 短 | 很高 | 高但边际收益递减 |
# LLaMA-2 的 SentencePiece 配置
vocab_size: 32,000
byte_fallback: True(处理OOV字符)
normalization: NFKC
add_dummy_prefix: False
# tiktoken (GPT-4) 使用 tiktokenizer
Byte-Pair Encoding (BPE)
cl100k_base 词汇表: 100,276
2.2 Embedding Tying与位置编码
现代LLM广泛使用Embedding Tying——Input Embedding和Output LM Head共享同一个权重矩阵。这是一个经典的工程技巧:**将参数量减少50%,同时几乎不影响模型质量**。其数学原理是:Input Embedding学习的是"词元如何被组合成语义",而LM Head学习的是"语义如何被解码为词元"——这两者具有高度的结构相似性。
然而,Embedding Tying并非没有代价:当模型规模很大时,共享Embedding可能成为质量瓶颈。因此,GPT-3(175B)选择了不绑定——Input Embedding和LM Head各自独立,以换取更大的表达能力换取更大的参数量。
三、Attention Block内部机制
3.1 Pre-Norm:现代LLM的默认选择
Attention Block内部的Norm位置是一个看似微小但影响深远的决策。原始Transformer使用Post-Norm(残差连接之后再做LayerNorm),而现代LLM几乎一致选择了Pre-Norm(残差连接之前做LayerNorm)。
这个转变的根本原因在于训练稳定性:Pre-Norm使得每一层的输入始终被归一化到单位方差附近,梯度流动更顺畅,即使大学习率也不容易发散。更重要的是,Pre-Norm的每一层输出分布相对稳定,便于分析模型行为。
# Post-Norm vs Pre-Norm
# Post-Norm (Transformer原始设计):
x = x + SelfAttention(LN(x))
x = x + FFN(LN(x))
# 问题: 残差分支的输出与跳跃分支的和需要再做Norm
# 深层时,每层输出方差可能累积到极大或极小
# Pre-Norm (现代LLM默认):
x = x + SelfAttention(LN(x))
x = x + FFN(LN(x))
# 优势: 每一层的主分支输入被归一化,梯度更稳定
# 劣势: 在极深模型(>100层)时表示能力可能下降
# DeepNet (Microsoft 2022) 的折中方案:
# scale_factor = (2N)^(1/2N),其中N是层数
# 每层的残差输出乘以scale_factor后再加到主分支
x = scale_factor * x + SelfAttention(LN(x))
3.2 RMSNorm:效率优先的归一化
RMSNorm(Root Mean Square Layer Normalization)是现代LLM广泛采用的归一化方法,相比LayerNorm,它移除了均值计算部分,只保留RMS统计量。这个简化的背后是工程洞察:**均值平移对Transformer的表示能力影响极小**。
LLaMA、Palm、Mistral等主流模型均使用RMSNorm,在相同的隐藏维度下,RMSNorm比LayerNorm快约10-20%(因为少了一次均值计算和一次减法操作)。对于数百层的LLM来说,这个加速是显著的。
四、Feed-Forward Networks
4.1 FFN的主导地位
FFN占据了LLM约67%的参数,是名符其实的"参数量主力"。传统FFN的设计来自原始Transformer:先通过Up-Projection将隐藏维度扩大4倍(从d_model到d_ff),通过激活函数,再通过Down-Projection回到d_model。
但现代LLM的FFN已经远不止这个基本结构。LLaMA使用SwiGLU激活函数,DeepSeek使用Multi-head Latent Attention(MLA),GPT-4可能使用MoE——FFN正在成为各模型差异化的主战场。
4.2 SwiGLU:LLaMA的核心创新
SwiGLU(Gated Linear Unit with Swish activation)是LLaMA-1/2/3的核心激活函数选择。相比ReLU或GELU,SwiGLU引入了门控机制:
# SwiGLU 数学公式
SwiGLU(x) = Swish(W_1x) ⊗ (V_x)
= (x * sigmoid(W_1x)) ⊗ (V_x)
# 与标准 FFN 对比:
# 标准 FFN: FFN(x) = W_2 * activation(W_1x)
# SwiGLU FFN: FFN(x) = W_3 * Swish(W_1x) ⊗ W_2x
# 参数量变化:
# 标准 FFN: 2 × d_model × d_ff
# SwiGLU FFN: 3 × d_model × d_ff(多一个投影矩阵)
# LLaMA-2 70B 的 FFN 配置:
# d_model = 4096
# d_ff = 11008 (约 2.7x 扩展)
# 总FFN参数量: 3 × 4096 × 11008 ≈ 135M per layer
# 80层 × 135M ≈ 10.8B(仅FFN中的SwiGLU部分)
# SwiGLU 的优势:
# 1. 门控机制让模型学习哪些特征应该被放大
# 2. SiLU激活比ReLU更平滑,梯度流动更好
# 3. 在Transformer中通常比GELU高1-2%的困惑度
4.3 FFN与MoE的融合
FFN与MoE的融合是当前架构演进的重要方向。MoE将传统的单一FFN替换为多个并行的FFN Expert,通过Router选择激活哪些Expert。这使得模型的总参数量可以极大扩展,同时保持每次推理的计算量可控。Mixtral 8x7B就是一个将SwiGLU FFN与MoE融合的典型案例。
五、Normalization策略
5.1 LayerNorm vs RMSNorm vs DeepNorm
三种主流归一化方法的核心区别在于它们统计的信息不同:
| 方法 | 统计量 | 可学习参数 | 计算量 | 代表模型 |
|---|---|---|---|---|
| LayerNorm | 均值 + RMS | γ, β (2个) | 较高 | BERT, GPT-2 |
| RMSNorm | 仅RMS | γ, β (2个) | 较低 | LLaMA, Mistral |
| DeepNorm | 均值 + RMS + 缩放 | γ, β + scale | 中等 | DeepSeek, GLM |
RMSNorm的数学定义是:RMSNorm(x) = γ * x / RMS(x),其中RMS(x) = √((1/n) * Σx_i²)。它比LayerNorm少了一次均值计算和一次减法操作,在硬件层面减少了内存访问次数。
5.2 Pre-Norm下的双RMSNorm
现代LLM在Pre-Norm架构下,每个Transformer层使用两个RMSNorm:一个在Attention之前(LN_1),一个在FFN之前(LN_2)。这两个Norm的角色略有不同:
- LN_1(Attention前):归一化Query/Key/Value的来源,确保Attention计算时输入稳定
- LN_2(FFN前):归一化FFN的输入,确保门控和激活的计算稳定
DeepSeek-V2还额外在Q和K的投影之后增加了Q-Norm和K-Norm,以增强模型对位置编码的适应性。
六、激活函数演进
6.1 从ReLU到SwiGLU的完整路径
LLM激活函数的演进映射了架构优化的历史:
激活函数演进时间线:
ReLU (2011) → GELU (2018, BERT) → Swish (2017) → SiLU (2019) → SwiGLU (2023, LLaMA)
ReLU: max(0, x)
优势: 计算极简,无指数运算
劣势: 负数区域完全抑制,梯度断裂
GELU: x * Φ(x) (Φ为标准正态CDF)
优势: 平滑非对称,比ReLU更好地处理负值
劣势: 需要erf/erfc数学函数,计算较慢
Swish: x * sigmoid(βx) (β可学习或固定)
优势: 自门控,平滑梯度
劣势: 计算量稍大
SiLU: x * sigmoid(x) (Swish的β=1特例)
优势: 比Swish更简单的实现,效果相当
劣势: sigmoid在硬件上不如ReLU高效
SwiGLU: SiLU(W_1x) ⊗ (W_2x)
优势: 双分支门控,表达能力最强
劣势: 参数量增加50%,计算量略增
6.2 为什么LLaMA选择了SwiGLU
LLaMA选择SwiGLU的核心动机是门控机制带来的表达能力提升。传统的FFN只有一个非线性分支,而SwiGLU有两个分支(门控+值),这使得模型可以学习更复杂的非线性变换。在语言建模任务上,SwiGLU通常比GELU带来1-2%的困惑度改善。
七、Decoder-Only架构
7.1 Causal Mask的工程实现
Decoder-Only架构的核心是Causal Mask(也称为Look-ahead Mask)。它确保每个位置只能看到自己和之前的token,不能"偷看"未来的token。这个机制通过在Attention Score矩阵上应用一个上三角掩码来实现。
# Causal Mask 的数学形式
# Attention Score 矩阵 A (seq_len × seq_len):
# A[i][j] = Query[i] · Key[j]
# Causal Mask M:
# M[i][j] = 0 if j <= i (可见)
# M[i][j] = -∞ if j > i (不可见)
# 注意力权重:
# Attention[i][j] = softmax_row_i(A[i] + M[i])[j]
# 举例(seq_len=4):
# A + M =
# [a00, a01, a02, a03]
# [-∞, a11, a12, a13] ← a10被mask,第2个token看不到第1个之后的内容
# [-∞, -∞, a22, a23]
# [-∞, -∞, -∞, a33]
# softmax后:
# [p00, p01, p02, p03]
# [0, p11, p12, p13] ← 第一列归零,不会attend到第0个token之后
# [0, 0, p22, p23]
# [0, 0, 0, p33]
7.2 Prefix Encoding vs Chat Encoding
Decoder-Only模型在处理多轮对话时面临一个选择:Prefix Encoding(将历史消息拼接为Prefix,生成时全部使用Causal Mask)和Chat Encoding(特殊token区分角色)。
LLaMA-2 Chat使用Chat Encoding:每个消息以特殊token开头([INST]表示用户,[/INST]表示系统),中间穿插消息内容。这种方式的优点是模型可以更精确地区分不同角色的发言,缺点是每次对话都需要重新tokenize历史。
八、Transformer Stack设计
8.1 深度 vs 宽度的权衡
Transformer的深度(层数)和宽度(隐藏维度)之间的权衡是一个经典问题。基本规律是:**增加深度比增加宽度更高效**——因为深度增加能更好地捕获层次化的语义结构,而宽度增加则受限于Attention的表达能力。
| 模型 | 层数 | 隐藏维度 | FFN扩展 | 总参数量 |
|---|---|---|---|---|
| BERT-base | 12 | 768 | 4x | 110M |
| GPT-2 | 36 | 1536 | 4x | 1.5B |
| LLaMA-2-7B | 32 | 4096 | 2.7x | 6.7B |
| LLaMA-2-70B | 80 | 4096 | 2.7x | 68.9B |
| PaLM-540B | 118 | 18432 | 4x | 540B |
可以看到,从BERT到PaLM,层数和宽度都在增加,但增加层数是更主要的扩展方向。PaLM使用118层但FFN扩展保持在4x——这说明通过增加深度来扩展比增加宽度更高效。
8.2 残差连接的结构作用
每个Transformer Block内的两个残差连接(Self-Attention后一个,FFN后一个)使得梯度可以顺畅地流向输入层。残差连接的本质是构建了一个"主分支"和一个"跳跃分支"的组合:
- 主分支(SelfAttn/FFN):负责表示转换
- 跳跃分支(恒等映射):确保即使主分支输出为0,原始信息也能无损传递
- 组合:x_new = x + MainBranch(x),使得模型可以在"保留原始信息"和"学习新表示"之间动态平衡
九、训练稳定性
9.1 学习率调度
LLM训练使用复杂的学习率调度策略,而非简单的固定学习率。标准的LLM训练调度包括三个阶段:
# LLM 学习率调度
# 阶段1: Warmup (前 ~2000 steps)
# lr 从 0 线性增长到峰值 lr_max
lr(t) = lr_max * (t / warmup_steps)
# 阶段2: Cosine Decay (从 warmup_steps 到 total_steps)
# lr 从 lr_max 平滑衰减到 lr_min
lr(t) = lr_min + (lr_max - lr_min) * (1 + cos(π * t / T)) / 2
# 其中 T = total_steps - warmup_steps
# 阶段3: Linear Decay (可选,用于某些模型)
# 从 lr_min 线性衰减到 0
# 在 T' 步内完成
# LLaMA-2 训练配置示例:
lr_max = 3e-4 # 7B模型; 70B使用 1.5e-4
warmup_steps = 2000 # 约占总步数的 0.1-0.3%
lr_min = lr_max * 0.1 # 最终学习率为峰值的 10%
total_tokens = 1.4T # 1.4万亿 tokens
9.2 梯度裁剪与混合精度
梯度裁剪(Gradient Clipping)和混合精度训练是LLM稳定训练的两大支柱。梯度裁剪将梯度范数限制在1.0以下,防止梯度爆炸;混合精度使用BF16进行主要计算以节省显存,同时维护FP32的权重副本以防止精度误差累积。
BF16(Brain Float 16)相比FP16的优势在于:它使用相同的8位指数,使得BF16的数值范围与FP32几乎相同,不会像FP16那样在大幅值计算时发生溢出。这对于LLM训练至关重要——某些logit值可能非常大。
十、优化器与并行策略
10.1 AdamW与权重衰减
AdamW(Adam with Weight Decay)是LLM训练的标准优化器。它与Adam的核心区别在于:权重衰减直接作用于权重而非通过动量间接实现。这使得权重衰减的控制更精确,避免了Adam中L2正则和权重衰减的混淆。
LLM的权重衰减系数通常设为0.1(在BERT上是0.01)。这是一个较大的值——说明LLM训练需要较强的正则化来防止过拟合。
10.2 ZeRO:内存优化的艺术
当模型大到单GPU装不下时,ZeRO(Zero Redundancy Optimizer)提供了三种分片策略:
| Stage | 分片内容 | 内存减少 | 通信量增加 |
|---|---|---|---|
| ZeRO-1 | 优化器状态 | 4x | 最小 |
| ZeRO-2 | 优化器状态 + 梯度 | 8x | 中等 |
| ZeRO-3 | 全部(状态+梯度+参数) | Nd(N为GPU数) | 最高 |
DeepSpeed ZeRO-3是训练100B+参数模型的标准配置,它将模型参数分片到不同GPU,每次前向/反向计算时通过All-Gather获取所需参数,计算完成后再丢弃。
十一、推理架构
11.1 KV Cache:记忆的代价
自回归生成的核心开销在于:每次生成新token时,都需要重新计算之前所有token的Attention。KV Cache通过缓存已经计算的Key和Value来消除这个重复计算。
# KV Cache 计算
# 无KV Cache:每次生成都重新计算所有token的attention
O(n² × d) FLOPs per token
# 有KV Cache:只计算新token的attention
O(n × d) FLOPs per token (n为当前已生成token数)
# KV Cache 显存计算 (LLaMA-2 70B):
# 2 heads (K + V) × 80 layers × seq_len × batch_size × head_dim × 2 (bytes)
# = 2 × 80 × 128K × 1 × 128 × 2 bytes
# ≈ 4.2 GB per sample at 128K context
# 问题:128K上下文时,KV Cache可能超过80GB(H100显存)
# 解决方案:
# 1. PagedAttention (vLLM): 分页管理KV Cache,减少碎片
# 2. KV Cache 量化:FP16 → INT8 → INT4
# 3. 显存卸载:CPU内存作为HBM的溢出区
11.2 连续批处理与Tensor并行
推理效率的核心优化手段包括:连续批处理(Continuous Batching)允许不同请求在GPU上动态打包和退出,避免了静态批处理的资源浪费;Tensor并行(Tensor Parallelism)将大矩阵运算拆分到多GPU,适合单卡无法容纳的70B+模型。
十二、主流模型架构对比
12.1 关键架构决策一览
主流LLM在架构选择上既有共识也有分歧:
| 模型 | 架构 | Norm | 激活 | 位置编码 | 上下文 |
|---|---|---|---|---|---|
| GPT-4(估计) | MoE + Dec-Only | Pre-Norm | SwiGLU | 未知 | 128k |
| PaLM-2 | Dense + Dec-Only | Pre-Norm | SwiGLU | RoPE | 8k/32k |
| LLaMA-2 | Dense + Dec-Only | RMSNorm | SwiGLU | RoPE | 4k |
| Llama-3 | Dense + Dec-Only | RMSNorm | SwiGLU | RoPE | 128k |
| Mistral-7B | Dense + Dec-Only | RMSNorm | SwiGLU | RoPE | 32k |
| DeepSeek-V2 | MoE + Dec-Only | DeepNorm | SwiGLU | RoPE + MLA | 128k |
| Qwen-2 | Dense + Dec-Only | RMSNorm | SwiGLU | RoPE | 128k |
共识已经形成:**Decoder-Only + Pre-Norm/RMSNorm + SwiGLU + RoPE** 是当前最优的LLM架构组合。分歧主要集中在MoE的使用(DeepSeek、GPT-4)和特殊的注意力变体(DeepSeek-V2的MLA)。
12.2 架构决策的工程启示
从这些主流模型的架构对比中,可以提炼出几个关键启示:
- 位置编码的收敛:RoPE已成为绝对主流,ALiBi和Sinusoidal几乎完全退出历史舞台
- FFN的统治地位:SwiGLU的采用率接近100%,说明门控机制对语言建模有实质性帮助
- Norm的效率追求:RMSNorm取代LayerNorm的趋势明显,效率差异驱动了选择
- MoE的规模化路径:DeepSeek-V2和GPT-4的采用证明了MoE在超大规模模型上的可行性