Skip to content

架构与超参数

对应课程 Lecture 3:Architectures, hyperparameters(Tatsu)

现代 Transformer 的解剖图

从 GPT-1 到今天的 Llama、Qwen,语言模型的骨干架构高度趋同。一个现代 decoder-only(仅解码器)Transformer 长这样:

text
输入 token


词嵌入 embedding + 位置编码 RoPE


┌────────────────────────────── × n_layers ─┐
│  x = x + Attention(RMSNorm(x))   ← 残差   │
│  x = x + MLP(RMSNorm(x))         ← 残差   │
└───────────────────────────────────────────┘


RMSNorm → 输出投影 → softmax → 下一个 token 的分布

每一讲里,我们把每个零件拆开问:​它为什么存在?没有它会怎样?

逐组件拆解

归一化:LayerNorm → RMSNorm

归一化(normalization) 把每层的激活值拉回稳定范围,让深层网络可以训练。现代模型普遍用 RMSNorm(均方根归一化) 取代原始 LayerNorm:

RMSNorm(x)=x1dixi2g

相比 LayerNorm,它去掉了均值中心化​,只缩放方差——省一次计算和一份均值参数,效果几乎不变。

Pre-norm vs Post-norm

残差连接里归一化放哪儿,曾经是个大事:

  • Post-norm​(原始 Transformer):x=Norm(x+Sublayer(x))——深层训练不稳定,需要学习率预热和小心的初始化;
  • Pre-norm​(现代默认):x=x+Sublayer(Norm(x))——梯度可以“无损”地穿过残差通路直通底层,训练稳定得多。

Pre-norm 的代价与补偿

Pre-norm 相当于给网络加了一条恒等“高速公路”,稳定但削弱了每层的表达能力(顶层输入不经过归一化)。Llama 的做法是在最终输出前再放一个 final RMSNorm 来补偿,这已经成为标准配置。

位置编码:RoPE

注意力本身是置换不变的——打乱 token 顺序,输出不变。必须注入位置信息,模型才知道词序有意义。

现代主流是 旋转位置编码(Rotary Position Embedding,RoPE)​:把 query(查询)和 key(键)向量的每两维看作平面上的点,按位置 m 旋转一个角度 mθ

qm=Rmq,kn=Rnk,qmkn=qRnmk

妙处在于:点积自动只依赖相对位置 mn,天然满足语言建模的平移性。此外 RoPE 兼容“训练短、外推长”的位置扩展技巧(如 YaRN、NTK-aware scaling),这是长上下文模型的标配。

激活函数:SwiGLU

前馈网络(MLP)从经典的两层 GELU 结构升级为 SwiGLU​:

SwiGLU(x)=(SiLU(xW1)xW3)W2

即在两个投影之间加了门控(gating)​:一路经过 SiLU 激活,另一路直通,逐元素相乘后再投影。代价是参数多了一个矩阵(三个矩阵 vs 两个),通常把隐藏维度缩小到 23 倍来保持参数总量不变,换取实证上更好的效果。

注意力:多头 + GQA

标准多头注意力(Multi-Head Attention)里,每个头有独立的 Q、K、V 投影:

Attention(Q,K,V)=softmax(QKdk+M)V

其中 M 是因果掩码(causal mask),禁止“偷看未来”。

分组查询注意力(Grouped Query Attention,GQA) 是现代标配:多个 query 头共享一组 KV 头(比如 32 个 Q 头配 8 个 KV 头)。KV 头少了 4 倍,​推理时的 KV 缓存显存和读取量直接降 4 倍​,而质量损失可以忽略。这直接决定了推理成本。

超参数:模型形状怎么定?

给定参数预算 N,核心的形状超参数是层数 L、隐藏维度 d、头数 H

超参数常见取法备注
d/L每层维度约 100~2000,L 与 N 近似成正比更深 vs 更宽存在权衡;过深难训练,过宽算力浪费
头数 H每头维度固定约 64~128头太少表达力不足,太多则每头太窄
FFN 隐层维度4d(SwiGLU 下约 83d让 FFN 参数 ≈ 注意力参数的 2 倍
词表 V10 万~25 万嵌入层在大模型里占比很小,小模型里占比很大

嵌入层是个“ unfairly 大”的部件

小模型里词嵌入 + 输出投影(2Vd 参数)占比可观。输出投影(untied)和输入嵌入(tied)是否共享权重、logits 是否 soft-cap 等选择,在小模型上影响明显。这些选择值得通过实验仔细考察。

训练超参数:怎么把模型训“稳”?

架构定了之后,训练的成败取决于优化超参数。

AdamW 与学习率

AdamW 是绝对主流的自适应优化器,每个参数维护动量 m(梯度的滑动平均)和二阶矩 v(梯度平方的滑动平均):

θθηmv+ϵηλθ

关键超参数:

  • 峰值学习率 η​:越大越快收敛但易发散;经验上 η103dmodel/768 随模型变大而调小。
  • β2(二阶矩衰减率)​:从 0.999(Adam 论文默认)调到 0.95 甚至 0.9,是 Chinchilla 时代的重要发现——训练早期梯度二阶矩变化剧烈,过慢的衰减会让更新方向错误。
  • 权重衰减 λ​:通常 0.1。
  • 梯度裁剪​:按全局范数裁到 1.0,防训练尖峰。

学习率调度

标准三段式:​线性预热 → 稳定训练 → 余弦/线性衰减​。

  • 预热(warmup)​:前几百步把学习率从 0 线性升到峰值,避免初始化阶段的大步长破坏权重;
  • 衰减(decay)​:训练后期把学习率降到峰值的约 10%,损失会有一个明显的“第二下降”。衰减后的模型不仅最终 loss 更低,微调效果也更好。

批次大小

小批次噪声大、效率低;大批次硬件利用率高。实践用批次大小预热​:训练初期用小批次(模型还在大幅移动),随训练推进按 batch1/L 逐渐增大,既省算力又不伤收敛。

小结

  • 现代 Transformer = RMSNorm(pre-norm)+ RoPE + GQA 注意力 + SwiGLU + final norm,每个组件都是“稳定性/效率/质量”三角中的折衷。
  • 形状超参数的经验法则:d 定头,层数适中,每头 64~128 维,FFN 约两倍注意力参数。
  • 训练配方:AdamW(β2=0.95)+ 梯度裁剪 + warmup + 余弦衰减 + 批次预热——这套组合拳是几乎所有开源模型的底座。
最近更新