斯坦福大学 CS336 第三讲:大语言模型的架构演进与超参数选择

斯坦福大学 CS336 第三讲的主题是“大语言模型的架构演进与超参数选择”。这节课采取了“数据驱动”和“进化分析”的视角,总结了从2017年Transformer诞生至今,各大模型在架构变体、超参数设定、训练稳定性优化以及推理结构上达成的“现代共识”。

以下是本节课所有核心知识点的详细拆解:

一、 核心架构的演进 (Architecture Variations)

在最初的“Vanilla Transformer”中,模型包含绝对位置编码、ReLU激活函数以及各类偏置项,但现代模型对这些底层结构进行了全面的“大换血”。

  • 归一化位置 (Normalization Position):
    • 原始Transformer使用 Post-norm(在残差连接之后进行归一化),但这极其不稳定,必须配合谨慎的学习率预热(Warm-up)才能训练。
    • 现代共识:全面采用 Pre-norm(在进入计算模块前归一化)。因为它能为深度网络提供更干净的残差恒等连接,使得梯度传播更稳定,有效减少训练过程中的损失尖峰(Loss spikes)。
    • 新趋势 Double Norm: 近期如 Grok 和 Gemma 2 等模型为了追求极致的稳定性,开始在模块的前后同时添加归一化层。
  • RMSNorm 替代 LayerNorm:
    • 现代共识:几乎所有大模型(如Llama系列)都转向了 RMSNorm。
    • RMSNorm 去除了减去均值和加偏置项(Beta)的操作。虽然在全模型的计算量(FLOPs)中,归一化占比极小(0.17%),但在系统运行耗时中却占到了 25%,因为它受限于内存带宽(Memory Movement)。RMSNorm通过减少参数和内存搬运,能在性能不降的前提下直接提升运行速度。
  • 移除偏置项 (Dropping Bias Terms):
    • 现代共识:去除了所有线性层和全连接层的偏置项,使其变成纯粹的矩阵乘法。经验证明这不仅不影响性能,还能显著提升训练大规模模型时的稳定性。
  • 激活函数与门控线性单元 (Gated Linear Units, GLU):
    • 尽管 ReLU 或 GELU 曾被广泛使用,现在的绝对共识是使用 GLU 变体(尤其是 SwiGLU 或 GeGLU)。
    • GLU 通过一个额外的线性投影层对特征进行“逐元素门控相乘”,无数消融实验表明,这种结构能稳定地带来更低的困惑度与更好的表现。
  • 并行层架构 (Parallel Layers):
    • 标准模型是串行的(先算Attention再算MLP),但部分模型(如 GPT-J, PaLM, Cohere)为了系统效率,选择并行计算 Attention 和 MLP,然后将结果相加汇入残差流。不过这可能会略微牺牲模型的表达能力。
  • 旋转位置编码 (RoPE, Rotary Position Embeddings):
    • 现代共识:抛弃了绝对位置编码和传统的相对位置编码,全部收敛至 RoPE。
    • RoPE 将高维向量每两个维度切分为一组,通过计算旋转矩阵(Rotation Matrices)来隐式编码Token之间的相对距离。它直接应用于注意力计算阶段的 Query 和 Key 上,不引入交叉项,且极其有利于后续的长文本上下文外推。

二、 超参数的经验法则 (Hyperparameters)

大模型的超参数往往不是瞎调的,而是遵循着高度一致的“经验法则”:

  • 前馈网络扩增比例 (DFF​/Dmodel​):
    • 传统的 MLP 结构,通常将隐藏层宽度设为输入维度的 4倍。
    • 对于 GLU 架构:共识比例缩减为 8/3倍(约2.66倍)。因为 GLU 额外增加了一个门控权重矩阵,使用 8/3 倍可以确保模型的总参数量与传统 4倍网络完全一致(例如Llama、DeepSeek都遵循此比例)。T5 曾尝试过极其夸张的 64倍宽度,但后续的 T5v1.1 仍退回了 2.5倍左右的标准范式。
  • 注意力头维度 (Head Dimension):
    • 共识:模型维度 / (头数 × 单头维度) = 1。只要遵循1:1的比例,即使头数很多也不会因为低秩(Low rank)而遇到表达能力瓶颈。
  • 长宽比 (Aspect Ratio:深度 vs 宽度):
    • 缩放定律(Scaling Laws)的大规模盲测表明,大模型存在一个“甜点区”:每一层大约分配 100 到 128 个隐藏维度 时,损失下降最为理想。并且这个最优比例在数十倍参数规模跨度下都不会明显偏移。
  • 词表大小 (Vocabulary Size):
    • 趋势:词表越来越大(从 GPT-2 的 5万扩增到了如今主流的 10万~25万)。
    • 目的是为了更好地编码多语言、代码甚至 Emoji。超大词表能将非英语的小语种压缩成更少的 Token,大幅降低用户的推理 API 成本。
  • 正则化 (Dropout vs Weight Decay):
    • Dropout 已被淘汰: 由于预训练模型几乎只对海量数据扫过一遍(1 epoch),根本不存在“过拟合训练集”的问题,因此 Dropout 失去了意义。
    • Weight Decay(权重衰减)依然保留: 这不是为了防止过拟合,而是因为它能与学习率衰减(如余弦退火)产生复杂的动态交互,让模型在训练末期学习率降低时急速收敛,最终取得更好的训练表现。

三、 训练稳定性干预 (Stability Interventions)

模型越大越容易崩溃,主要罪魁祸首是 Softmax 中的指数运算爆炸和除零风险。工程师为此引入了“防波堤”机制:

  • 针对输出层 Softmax 的 Z-Loss: 在原本的损失函数外增加一个辅助项,强行惩罚 Softmax 的归一化分母项(Normalizer Z),使其尽量贴近 1(即让 logZ 接近 0)。这样不仅能抵消指数计算的不稳定,还能根除诸多数值溢出隐患(PaLM 等最先使用)。
  • 针对注意力 Softmax 的 QK-Norm: 借鉴自视觉Transformer(ViT)的技巧。在 Query 和 Key 计算点积前,直接对它们进行 LayerNorm 归一化,死死卡住注意力得分的上限,从而支持模型使用更激进的学习率进行训练。
  • Soft-capping(软截断): 针对 Logits,通过外包一个 tanh 函数设定“软上限”,当预测值过大时将其强制削平,防止某一次前向传播异常摧毁模型(Gemma 2 使用此方案)。

四、 注意力机制变体与推理系统优化 (Attention Variants)

虽然这节课侧重架构,但讲师提前引入了影响架构设计的系统推理瓶颈概念:

  • KV Cache 与 算术强度 (Arithmetic Intensity): 推理(生成)阶段只能逐个生成Token。此时算力充沛,但“算术强度”极低,因为 GPU 要频繁将历史 Token 对应的庞大 Key/Value 缓存(KV Cache)从内存搬运到计算核心。
  • 多查询注意力 (MQA) 与 分组查询注意力 (GQA):
    • 为了解决 KV Cache 内存墙爆炸,MQA 让几十个 Query 头强行共享同一个 Key 头和 Value 头。这极大缩减了搬运成本并支持了超长上下文。
    • GQA 则作为折中方案,让几个 Query 共享一组 KV 头,在表达能力和推理速度之间取得完美平衡。
  • 稀疏与滑动窗口注意力应对极限上下文: 比如在 Llama 4 这样的千万级上下文模型中,直接算注意力是不可能的。最新的设计模式是 “混合注意力”:每 4 个模块组成一组,底层 1 个模块做不带 RoPE 的全局完全注意力,上面 3 个模块做带 RoPE 的局部滑动窗口注意力(Sliding Window Attention)。这既极大降低了计算量,又巧妙避开了 RoPE 在超远距离外推时的衰减缺陷。

第三讲复习题 (Lecture 3: Architectures & Hyperparameters)

一、 核心架构的演进 (Architecture Variations)

  1. Pre-norm vs Post-norm: 为什么现代大语言模型几乎全部抛弃了原始 Transformer 中的 Post-norm(后置归一化),转而使用 Pre-norm(前置归一化)?
  2. RMSNorm vs LayerNorm: 归一化操作在整个 Transformer 的计算量(FLOPs)中占比极小(约 0.17%),但为什么各大模型依然致力于将 LayerNorm 替换为更精简的 RMSNorm?
  3. 移除偏置项 (Dropping Bias Terms): 现代 Transformer 中的线性层和前馈网络通常会明确移除偏置项(Bias),这样做的主要原因是什么?

二、 激活函数与位置编码 (Activations & Position Embeddings)

  1. GLU变体与隐藏层比例: 业界目前的绝对共识是使用 GLU 变体(如 SwiGLU 或 GeGLU)作为激活函数。在使用 GLU 时,前馈网络(MLP)的扩增比例(DFF​/Dmodel​)通常会从传统的 4 倍调整为多少?为什么要这样调整?
  2. RoPE的特殊位置: 旋转位置编码(RoPE)在应用位置上与传统的绝对位置编码(如正弦/余弦编码)有什么本质的区别?

三、 超参数经验法则 (Hyperparameters)

  1. 注意力头的维度配置: 在设定多头注意力机制(Multi-head Attention)的超参数时,模型总维度(Dmodel​)、注意力头数(Number of Heads)和单头维度(Head Dimension)之间普遍遵循的最佳比例公式是什么?
  2. 词表扩增的系统意义: 为什么现代大模型的词表大小(Vocabulary Size)呈现出越来越大的趋势(例如从 5万扩增到 10万~25万)?这在推理成本上有什么实际好处?
  3. 反直觉的权重衰减 (Weight Decay): 预训练模型通常只会把海量数据扫过一遍(1 epoch),理论上根本不存在过拟合训练集的风险。为什么工程师们依然坚持在预训练中使用权重衰减(Weight Decay)?

四、 训练稳定性与推理系统优化 (Stability & Systems)

  1. Z-Loss 的作用: 为了解决输出层 Softmax 带来的梯度爆炸和数值不稳定问题,工程师引入了“Z-Loss”。它的数学目标是强迫 Softmax 的哪一部分数值接近于什么值?
  2. MQA 与 GQA: 为了缓解推理阶段生成 Token 时 KV Cache 导致的“内存墙”瓶颈,MQA(多查询注意力)和 GQA(分组查询注意力)在架构上分别做了什么极为激进的妥协?

💡 参考答案与知识点解析

1. 为什么使用 Pre-norm?

答案: Post-norm 非常不稳定,必须配合极其谨慎的学习率预热(Warm-up)才能训练。Pre-norm 将归一化放在残差块之前,为深度网络保留了一条从头到尾干净、直接的恒等映射(Identity connection)残差流。这使得梯度回传极其顺畅,大幅减少了训练过程中的损失尖峰(Loss spikes),提升了训练的稳定性。

2. 为什么非要使用 RMSNorm?

答案: 虽然归一化只占 0.17% 的算力(FLOPs),但在实际运行耗时中却占到了高达 25%,因为它严重受限于内存带宽。RMSNorm 舍弃了减去均值和加偏置项的操作,直接减少了需要从内存中搬运的参数量和计算步骤,在不牺牲模型表现的前提下,显著提升了系统的运行速度。

3. 移除偏置项的原因?

答案: 大量实证观察表明,纯粹的矩阵乘法已经完全足够保证模型的表达能力,而彻底移除偏置项(Bias terms)不仅能稍微减少参数,更关键的是能极大提升超大规模神经网络的优化稳定性(Optimization stability)。

4. GLU 的比例调整?

答案: 比例通常从传统的 4 倍缩小到 8/3 倍(约 2.66 倍)。因为 GLU 变体引入了一个额外的线性投影门控矩阵(Gating matrix),为了保证使用 GLU 后的模型总参数量与传统无门控模型完全一致(Parameter matched),必须相应地缩减其内部的隐藏维度。

5. RoPE 的应用位置?

答案: 传统的绝对位置编码是在模型最底层的输入 Embedding 阶段直接相加;而 RoPE 是在每一层注意力机制计算内部发挥作用的。它直接对生成的 Query 和 Key 向量进行旋转操作,然后再进行点积,并不在底层介入。

6. 注意力头的维度公式?

答案: 业界共识是:模型总维度 / (头数 × 单头维度) = 1。也就是说,无论你设置多少个头,把所有头的维度拼接起来后,必须正好等于模型的总隐藏维度。

7. 词表越来越大的原因?

答案: 随着模型向多语言、代码以及包含 Emoji 的真实应用场景拓展,大词表可以把非英语的小语种和复杂字符压缩成更少的 Token。因为推理 API 通常是按 Token 计费和生成速度受限于 Token 数量的,这能极大降低非英语用户在推理时的成本,并提升生成效率。

8. 预训练为什么依然需要权重衰减 (Weight Decay)?

答案: 在预训练中,权重衰减的作用根本不是为了防止过拟合。它的真正作用是与学习率衰减策略(如余弦退火,Cosine decay)产生复杂的动态交互:在训练末期学习率急速下降时,带有权重衰减的模型能经历一种隐式的“加速优化”,从而最终取得更好的训练集损失(Training loss)。

9. Z-Loss 的数学目标?

答案: Z-Loss 旨在强行惩罚 Softmax 的归一化分母项(Normalizer Z),迫使 Z 的值尽量贴近 1(即让 logZ 接近于 0)。这能抵消指数爆炸带来的除零或溢出风险,极大地稳定了训练。

10. MQA 和 GQA 的妥协机制?

答案:

  • MQA (Multi-Query Attention): 极其激进,让所有的 Query 头强制共享唯一的一个 Key 头和一个 Value 头。这极大压缩了 KV Cache 的显存搬运压力,但牺牲了一定表达能力。
  • GQA (Grouped-Query Attention): 一种折中方案,让几个 Query 组成一组,每一组共享一组 K 和 V 头。这在极大提升推理速度(节省内存带宽)和维持模型质量之间取得了完美的平衡
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐