LLM Transformer 架构解析 RMSNorm SwiGLU

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-base127684x110M
GPT-23615364x1.5B
LLaMA-2-7B3240962.7x6.7B
LLaMA-2-70B8040962.7x68.9B
PaLM-540B118184324x540B

可以看到,从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-OnlyPre-NormSwiGLU未知128k
PaLM-2Dense + Dec-OnlyPre-NormSwiGLURoPE8k/32k
LLaMA-2Dense + Dec-OnlyRMSNormSwiGLURoPE4k
Llama-3Dense + Dec-OnlyRMSNormSwiGLURoPE128k
Mistral-7BDense + Dec-OnlyRMSNormSwiGLURoPE32k
DeepSeek-V2MoE + Dec-OnlyDeepNormSwiGLURoPE + MLA128k
Qwen-2Dense + Dec-OnlyRMSNormSwiGLURoPE128k

共识已经形成:**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在超大规模模型上的可行性