返回博客

/ CS336

[CS336-03] 架构与超参数

整理 CS336 第三讲:现代 Transformer 架构里的 pre-norm、RMSNorm、SwiGLU、RoPE、attention 变体和超参数取舍。

4 minCS336 · Architecture · Transformer

这篇是 Stanford CS336 Spring 2025 第 3 讲 Course Materials 的学习笔记。主题是现代语言模型架构:哪些设计已经形成共识,哪些仍然是经验选择。

1. 从原始 Transformer 到现代 LLaMA-like 架构#

原始 Transformer 使用 post-norm LayerNorm、sinusoidal position embedding、ReLU FFN、带 bias 的线性层。CS336 Assignment 1 里实现的是更现代的简化变体:pre-norm、RoPE、SwiGLU、无 bias 线性层和 RMSNorm。

这背后的重点不是“某个架构永远正确”,而是要理解架构选择往往来自稳定性、吞吐、内存移动和大规模实验经验的综合折中。

2. Pre-norm 几乎成为共识#

Pre-norm 的核心是把 normalization 放在 block 的输入侧,让 residual stream 的主路径尽量不被破坏。相比 post-norm,它通常有更好的训练稳定性,尤其在更深、更大的模型里更容易使用较大学习率。

现代大模型大多采用 pre-norm。也有一些模型额外加入 residual stream 外侧的 norm,但这和传统 post-norm 不是一回事。

3. RMSNorm、去 bias 与数据移动#

LayerNorm 会减均值、除方差,并带有可学习参数。RMSNorm 不减均值,只根据 root mean square 做归一化,参数和计算都更少。

从 FLOPs 看,norm 相比矩阵乘法不大;但从运行时间看,norm 可能受数据移动影响。RMSNorm 和去掉 bias 的动机之一,就是减少不必要的 memory traffic,让模型更适合 GPU 执行。

这提醒我们:FLOPs 不是 runtime。大模型系统里,移动数据经常比做计算更贵。

4. Activation:从 ReLU 到 SwiGLU#

现代 LM 的 FFN 层通常不再使用原始 ReLU,而是使用 GeLU、SwiGLU 或 GeGLU 等 gated activation。GLU 类方法用一个额外分支作为 gate,让 FFN 不只是逐元素非线性,而是带有乘性调制。

这会增加一部分参数,但在许多模型中带来更好的 loss 和下游效果。LLaMA、PaLM、T5 v1.1 等模型都采用了这类设计。

5. Attention 和 positional encoding 的变化#

Lecture 3 也讨论了 attention 变体、position embedding、head 维度、vocab size 等设计。RoPE 成为很多现代模型的默认选择,因为它适合相对位置信息,并且对 extrapolation 和长上下文扩展更友好。

Attention 层后续还会继续演化:full attention、sliding window attention、GQA、MLA、linear attention、state-space model 等都可以看作在能力和效率之间做不同折中。

6. 超参数不是都同等重要#

一些超参数在不同规模上具有可迁移性,一些则依赖规模和训练设置。例如 FFN hidden size 与 model dimension 的比例、head 数量、vocab size、depth/width ratio、learning rate、batch size 都需要结合 scaling 分析。

课程的态度是:不要迷信单个 paper 的架构表格。要学会区分:

  • 已经高度稳定的共识,比如 pre-norm;
  • 有明显工程收益的选择,比如 RMSNorm 和无 bias;
  • 依赖实验和规模的选择,比如 FFN ratio、head 组织、vocab size。

7. takeaway#

现代 LM 架构不是神秘配方,而是一系列小的效率和稳定性选择叠加出来的结果。

  • residual stream 的稳定性决定深层模型是否好训;
  • norm、bias、activation 会影响数据移动和优化表现;
  • position encoding 和 attention 结构影响长上下文能力;
  • 超参数是否能迁移,需要靠 scaling 和实验验证。

真正的工程能力不是背下某个模型配置,而是理解配置背后的 tradeoff。

参考#