跳转至

第 0 章 预备知识

回归基本功

0.1 线性代数

  • 矩阵乘与形状推导: 输入张量 \(A\in\mathbb{R}^{[B,n,d]}\) @ \(权重矩阵 W\in\mathbb{R}^{[d,4d]}\) 输出形状为 \( [B,n,4d]\),参数量为 \(d \times 4d = {4d^2}\)
  • 点积与相似度:用点积来衡量两个向量相似度
  • 外积:两个向量生成一个矩阵。第 13 章线性注意力的核心动作就是把历史信息累加成一个由外积构成的状态矩阵。
  • 低秩分解:一个大矩阵近似成两个小矩阵相乘。第 7 章的 MLA 用它压缩 KV,第三册的 LoRA 用它做微调。
  • 转置与广播:这里不需要理解框架怎么快速做到矩阵变换的,只需要理解shape的变化即可
  • 分析均值与方差: 很多时候,公式中的奇怪乘除log都是在维护均值方差这件事,回顾一下,均值方差的基础概念,在各种计算下方差怎么变化

先复习一下均值方差的基础:

再详细看一下各种深度学习组件中为了“凑”均值方差而做的数学调整:

  1. 缩放点积注意力 主运算:计算 \(QK^\top\) 得到 token 之间的原始内积相似度。 内积结果算出之后,除以 \(\sqrt{d}\):

\(\frac{QK^\top}{\sqrt d}\) 向量维度 d 越大,原始内积的方差越高;这一步除法把内积的方差约束在 1 附近,防止 softmax 输出过度尖锐,梯度过小。

  1. AdamW 的偏置校正 主运算:用指数移动平均累积梯度,得到一阶矩 \(m_t\),二阶矩 \(v_t\)。 统计量计算完成后,做除法修正训练初期的估计偏差:

\(\hat m_t=\frac{m_t}{1-\beta_1^t},\quad \hat v_t=\frac{v_t}{1-\beta_2^t}\) 训练刚开始时动量估计值偏低,该除法校正统计量的均值偏差,得到更可靠的梯度估计。

  1. 交叉熵的 Log-sum-exp 技巧 主运算:计算 logits 的指数,用于 softmax。 指数运算之后,求和之前,减去最大值做整体平移:

\(\log\sum_i e^{z_i}=z_{\text{max}}+\log\sum_i e^{z_i-z_{\text{max}}}\) 指数函数极易发生数值溢出;减去最大值平移全部 logits,控制数值范围,稳定均值,保证计算可执行。

0.2 概率与信息论

这里我们先详细解释下softmax,现代大模型长上下文方向的大量研究,都围绕自注意力公式展开;公式中的 softmax 带来的约束,是相对较难优化的地方

0.2.1 Hard Max

softmax 的名字来自两步:max(取最大) + soft(柔和,平滑版本)。我们先看硬max,再过渡到softmax。

给定一组数:[2, 5, 3] 硬max:直接挑最大的数字5,权重分配 [0, 1, 0]。 含义:只采信最大值对应的那一项,其余全部忽略。

0.2.2 Soft Max

softmax 做平滑的概率分配

\[ \sigma(z_i)=\frac{e^{z_i}}{\sum_j e^{z_j}}. \]

同样输入 [2, 5, 3]:

\[ e^{2}\approx 7.389,\quad e^{5}\approx 148.413,\quad e^{3}\approx 20.086. \]

总和 \(7.389+148.413+20.086\approx 175.888\)。

  • \(z_1=2\):\(7.389/175.888\approx 0.042\)
  • \(z_2=5\):\(148.413/175.888\approx 0.844\)
  • \(z_3=3\):\(20.086/175.888\approx 0.114\)

输出:[0.042, 0.844, 0.114],总和为 1。最大的值拿到最高权重,其余项仍保留一小部分。输出是概率分布:全部 \(\ge 0\),总和等于 1。对比硬 max:它是平滑,可求导的选择,适合神经网络训练。

但是,softmax 是非线性运算,这带来两个底层难题。

第一,引入非线性后,式子不再满足矩阵乘法结合律,(线性函数和矩阵乘法 \(f(AB)C = A\,f(BC)\) )在这里我们直接给出标准注意力表达式来看: \(\mathrm{softmax}(QK^\top)V\)。如果没有 softmax,表达式为 \((QK^\top)V\),依据矩阵乘法结合律可重排为 \(Q(K^\top V)\)。两种计算顺序的代价对比如下:

L 是输入序列的 token 长度,随文本变长而增大;d 是向量维度,属于模型固定常量,不随输入文本变化

  • 顺序 1 \((QK^\top)V\):先算 \(QK^\top\)。\(Q\),\(K\) 形状都是 \([L,d]\),相乘得到 \(L\times L\) 的相似度矩阵,这一步复杂度 \(O(L^{2}d)\)。序列长度 \(L\) 变大,算力按平方增长。
  • 顺序 2 \(Q(K^\top V)\):先算 \(K^\top V\)。\(K^\top\) 是 \([d,L]\),\(V\) 是 \([L,d]\),结果是 \(d\times d\) 的固定大小矩阵,复杂度只有 \(O(L d^{2})\),随序列长度线性增长。无论文本多长,这一步的输出永远是 \(d\times d\)。

一旦插入 softmax,它作用在 \(QK^\top\) 得到的 \(L\times L\) 矩阵上。我们只能采用第一种昂贵计算顺序,必须完整算出全部 token 两两之间的相似度,复杂度 \(O(L^{2}d)\)。

第二,归一化引发注意力稀释。softmax 强制一行所有权重之和等于 1。当序列很长,一个 query 要分摊权重给大量 key,每个 key 分到的权重被摊薄。即便所有 token 全部参与计算,远距离 token 也很难拿到足够大的权重,难以建立远距离关联。

0.2.3 带温度的 softmax

把任意实数向量 \(z\in\mathbb R^{V}\) 变成概率分布:

\[ p_i = \frac{\exp(z_i/\tau)} {\sum_j\exp(z_j/\tau)}, \qquad \tau>0. \]

\(\tau=1\) 是标准 softmax。\(\tau\) 变大,分布变平;\(\tau\) 变小,质量更集中在最大的几项。第 1 章的采样和第 9 章的路由都用温度(或等价写法)控制尖锐程度。

  • 交叉熵与困惑度:LLM 预训练唯一的损失函数就是 next-token 的交叉熵。困惑度 = exp(loss),直观理解为"模型在每一步平均在多少个候选词之间犹豫"。
  • KL散度:

两个离散分布 \(p,q\) 的 KL 散度:

\[ D_{\mathrm{KL}}(p\|q) = \sum_i p_i\log\frac{p_i}{q_i}. \]

它非负,且仅当 \(p=q\) 时为 0。衡量的是「用 \(q\) 去编码来自 \(p\) 的样本」时多付的代价;不对称,\(D_{\mathrm{KL}}(p\|q)\) 与 \(D_{\mathrm{KL}}(q\|p)\) 一般不相等。第一册在对齐与蒸馏语境里会再次碰到;系统展开在第三册与 OPD。

  • 采样与分布截断:从概率分布里取样,以及只保留头部候选(top-k / top-p)的做法。

0.3 微积分与训练机制

  • 梯度与链式法则:反向传播的基础知识。
  • 反向传播
  • 梯度爆炸与消失:为什么层数堆到几十层网络会训崩。

0.4 深度学习组件

  • 残差连接:让梯度有一条高速公路直达浅层。
  • 归一化:BatchNorm LayerNorm 等(第 5 章接着讲)。
  • 激活函数:ReLU / GELU,第 5 章会讲带门控的 SwiGLU。
  • Dropout 与正则:Dropout的基础,注意,现代大模型预训练阶段基本不用 dropout——数据量足够大,欠拟合才是主要矛盾。
  • 优化器 AdamW:作为最常用的优化器的基本原理。
  • 学习率调度与 warmup:cosine 与 WSD(warmup-stable-decay)是当前两种主流调度方式。
  • 初始化:各种初始化方法,和第 5 章的稳定性直接相关。
  • 混合精度 bf16 / fp16 与梯度裁剪:bf16的动态范围大,不容易溢出。

0.5 序列建模

都不了解也没关系,只需要跟随本书一起理解attention即可

  • RNN 的隐状态:把历史压缩进一个固定大小的向量,逐步更新
  • LSTM 的门控与遗忘:用可学习的门决定记什么,忘什么
  • seq2seq 与注意力的诞生:固定向量装不下整句话,于是让解码端回头看编码端的每一个位置。
  • Transformer

0.6 工程与硬件常识

  • PyTorch 与 HuggingFace 的最小用法
  • 参数大小和实际存储的关系:8B bf16 模型光权重就是 16 GB。
  • 显存由什么组成:权重 + 激活 + KV Cache(推理)/ 优化器状态与梯度(训练)。
  • 算力与带宽:

0.7 本书记号约定与自查清单

统一记号(全书不变):

符号 含义 8B 模型的典型值
d 隐藏层维度 hidden_size 4096
L 层数 36
h 注意力头数 32
d_h 每头维度 head_dim 128
n_kv KV 头数(GQA) 8
d_ff FFN 中间维度 12288
n 序列长度 视场景
B batch size 视场景
V 词表大小 151936
P 总参数量 8.2 B

快速回答

Q1:困惑度到底在说什么? 困惑度 = exp(交叉熵),可以理解为"模型每预测一个词时,等价于在多少个候选之间随机猜"。loss=2.0 意味着 ppl≈7.4,相当于在 7 个词里挑。

Q2:为什么 LLM 不用 BatchNorm? BN 依赖 batch/位置维的统计量,变长 padding,因果性和推理时 batch 变化都会造成麻烦,跨卡还要同步统计量。LayerNorm 只在每个 token 的特征维归一化,与 batch 和序列长度无关。第 5 章会讲它如何进一步简化成 RMSNorm,完整对照见附录 A.4。

Q3:bf16 和 fp16 该选哪个? bf16。两者都是 16 位,但 bf16 牺牲精度换来了和 fp32 一样的指数范围,训练时不容易溢出,基本不需要 loss scaling。现在的开源权重几乎都以 bf16 发布。