附录 B · 自选阅读(学有余力再翻开)
核心推导:把正文的"直觉"变成"数学"
正文按你的要求以直觉为主,这里把全书最关键的公式补上严格推导。每个推导前都有"它到底在算啥"一句话,看不动就跳,不影响主线。
B.1 softmax 与交叉熵
它到底在算啥:把一组任意分数(可能为负、和不为 1)变成一组"看起来像概率"的数值(非负、和为 1),并让"分数高的概率高"。
B.1.1 softmax 定义
给定 n 个分数 z₁, z₂, …, zₙ,第 i 个的 softmax 为:
softmax(zᵢ) = e^zᵢ / (e^z₁ + e^z₂ + … + e^zₙ)
为什么用指数 e^z?两个原因:
- 非负性:e 的任何次方都大于 0,分母为正,结果天然落在 (0,1),且所有项之和恰好为 1——概率的两个条件自动满足;
- 放大差距:指数是"放大镜"——z 差一点,e^z 差很多,让"最高分"更突出。直观对比:z=[1, 2, 3],线性归一化得 [0.17, 0.33, 0.50],softmax 得 [0.09, 0.24, 0.67]——差距被拉开。
B.1.2 温度参数藏在哪
第 4.10 节的"温度 T"这样起作用:把 zᵢ 先除以 T 再做 softmax:
softmax(zᵢ / T)
- T 小(如 0.2):zᵢ/T 数值拉大 → 指数差距更大 → 分布更"尖锐",几乎总选最高分(保守);
- T 大(如 1.5):zᵢ/T 数值缩小 → 分布更"平坦",低分词也有机会(多样)。
T=1 就是原始分布。这个"除以 T"的技巧是第 5.6 节"温度滑杆"的数学本体。
B.1.3 交叉熵:两把尺子的关系
模型输出的概率分布 p(如 [0.1, 0.7, 0.2]),真实答案是一个"独热"分布 q(如 [0, 1, 0]——正确答案是第 2 类)。交叉熵:
H(p, q) = −Σ qᵢ·log(pᵢ)
因为 q 只有一位是 1(正确答案那位),求和只剩一项:H = −log(模型给正确答案的概率)。直觉:
- 模型给正确答案 0.9 分 → −log(0.9) ≈ 0.105,损失很小;
- 模型给正确答案 0.01 分 → −log(0.01) = 4.6,损失很大——"自信地答错"被狠狠惩罚。
这正是第 2.2 节说的:分类任务的尺子 = 交叉熵,"越小越好"。
B.2 注意力公式:QKᵀ/√d 的缩放之谜
它到底在算啥:把"每个查询 q 和每个键 k 的匹配度"批量算出来、归一化成权重,再加权汇总值向量。
B.2.1 公式逐块拆解
Attention(Q, K, V) = softmax( QKᵀ / √dₖ ) · V
- QKᵀ:Q 是 n×d 矩阵(n 个查询,每个 d 维),K 是 m×d,Kᵀ 是 d×m。乘起来是 n×m:第 i 行第 j 列 = qᵢ 与 kⱼ 的点积 = 词 i 对词 j 的匹配度原始分;
- /√dₖ:对每个分数缩放(下面证明为什么);
- softmax(按行):每一行(一个查询对所有键的分数)变成一组和为 1 的权重;
- ·V:权重矩阵 n×m 乘 V(m×d)——每个查询把自己那行权重加权平均所有值向量,得到输出 n×d。第 i 行 = 词 i 的"上下文感知"新表示。
B.2.2 为什么除以 √d:一个方差论证
假设 q 和 k 的每个分量都是均值 0、方差 1 的独立随机变量(归一化后常见假设)。点积 s = q·k = Σ(qᵢkᵢ):
- 单个项 qᵢkᵢ 的均值 = 0(独立且均值 0),方差 = 1(Var(qk)=E[q²]E[k²]−(E[q]E[k])² = 1·1−0 = 1);
- 求和 d 项,方差相加:Var(s) = d——维度越高,点积数值越"散"(标准差 √d);
- 散得越大,softmax 的指数里数值差异越夸张 → 权重接近"非 0 即 1"(极度尖锐),梯度趋近 0,训练不动。
把 s 除以 √d,方差变回 Var(s/√d) = d/d = 1——点积回到"稳定量级",与维度无关。这就是缩放的数学动机:让匹配度分数的散布不随模型宽度增长而爆炸。
B.3 梯度下降更新公式与学习率
它到底在算啥:给出"每个参数该往哪挪、挪多少"的具体算式。
B.3.1 一维起步:为什么取负号
损失 L(θ) 是参数 θ 的一元函数。θ₀ 处做一阶泰勒展开:
L(θ₀ + Δ) ≈ L(θ₀) + L'(θ₀)·Δ
想让 L 变小(ΔL < 0),只要让 L'(θ₀)·Δ < 0。最省事的选择:Δ = −η·L'(θ₀)(η>0),则 ΔL ≈ −η·[L'(θ₀)]² ≤ 0——损失必然下降(一阶近似下)。所以:
θ ← θ − η·L'(θ)
这就是"沿负梯度方向走"的来源:正梯度指向上升,取负号才下降。
B.3.2 多维版本
参数是向量 θ,梯度 ∇L(θ) = (∂L/∂θ₁, ∂L/∂θ₂, …, ∂L/∂θₙ):
θ ← θ − η·∇L(θ)
每一维各走各的:∂L/∂θᵢ 大 → 该维度多动;∂L/∂θᵢ ≈ 0 → 已到平缓区,几乎不动。
B.3.3 学习率 η 的三种命运
| η | 现象 | 数学原因 |
|---|---|---|
| 过大 | 在谷底附近来回震荡、甚至发散 | 一步跨过谷底,Δ 超出二阶近似的可信域,L 反而上升 |
| 合适 | 平稳收敛 | 每一步都在"下山"方向且步子够小 |
| 过小 | 收敛极慢,可能永远到不了 | 每步收益 ∝ η²(因为 ΔL ≈ −η·|∇|²),η 减半,收益只剩四分之一 |
实务:用 Adam 等自适应算法(自动为每个参数调步长)+ 学习率调度(先大后小),不用手调每个 η。
B.4 反向传播与链式法则
它到底在算啥:损失对"每一层的参数"的偏导数,怎么高效地算出来。
B.4.1 链式法则:误差的传导
复合函数 z = f(g(x)),则 dz/dx = f'(g(x)) · g'(x)——变化率沿计算链相乘。神经网络正是层层复合:
x → 层1 → h₁ → 层2 → h₂ → … → 输出 ŷ → 损失 L
损失对第 k 层参数的偏导,等于"从输出一路乘回来的所有局部导数之积":
∂L/∂Wₖ = (∂L/∂ŷ) · (∂ŷ/∂h_last) · … · (∂hₖ₊₁/∂Wₖ)
反向传播的聪明处:这些因子从输出往输入算一次,逐层缓存复用(每个局部导数只算一遍),总成本 ≈ 一次正向传播——而不是对每个参数单独算一遍(那要几万亿次)。
B.4.2 一个两层微型例子(数字走一遍)
网络:输入 x=1,单隐层权重 w₁=2,输出权重 w₂=3,无偏置,恒等激活。目标 y=10。损失取 L = ½(ŷ − y)²。
- 正向:h = w₁x = 2;ŷ = w₂h = 6;L = ½(6−10)² = 8。
- 反向(求两个梯度):
- ∂L/∂ŷ = ŷ − y = 6 − 10 = −4;
- ∂ŷ/∂w₂ = h = 2 → ∂L/∂w₂ = −4 × 2 = −8(链式:损失经 ŷ 传导到 w₂);
- ∂ŷ/∂h = w₂ = 3;∂h/∂w₁ = x = 1 → ∂L/∂w₁ = −4 × 3 × 1 = −12(误差穿过了两层)。
- 更新(η=0.1):w₁ ← 2 − 0.1×(−12) = 3.2;w₂ ← 3 − 0.1×(−8) = 3.8。
- 验证:新 ŷ = 3.8×(3.2×1) = 12.16,L = ½(12.16−10)² ≈ 2.33 ——比 8 小,方向对了。
注意第 2 步里"责任分摊"的几何意义:误差 −4 分别乘上"该参数下游的敏感度"(h、w₂、x),正是第 2.4 节"工厂质检倒推"的精确版。
B.4.3 梯度消失/爆炸:为什么深网络难训
链式法则意味着梯度是一串局部导数的连乘。若每层局部导数都 <1(如 sigmoid 最大才 0.25),几十层连乘 → 梯度指数级衰减到 0(消失),浅层参数几乎不动;若都 >1 → 指数爆炸。
解法家族:ReLU 激活(导数恒 1)、残差连接(捷径让梯度"抄近道"直通浅层)、归一化(稳定各层量级)——第 4.7 节的"两个加固件"在这里有了数学依据。
B.5 位置编码的 sin/cos
它到底在算啥:给每个位置一个"可区分、且能体现相对距离"的向量,加进词向量。
B.5.1 公式
PE(pos, 2i) = sin(pos / 10000^(2i/d)) PE(pos, 2i+1) = cos(pos / 10000^(2i/d))
pos = 词在句子里的位置(0, 1, 2…),i = 维度下标(0, 1, …, d/2−1),d = 向量维度。每个位置的向量 = 一半 sin、一半 cos,频率随维度从快到慢变化。
B.5.2 为什么是周期函数:像时钟
维度 i 小的(频率快)像秒针:位置差 1 就有明显不同(区分相邻位置);维度 i 大的(频率慢)像时针:大范围才转一圈(区分"靠前还是靠后")。不同频率的组合,让每个位置都有独一无二的"读数",同时低维度编码局部差异、高维度编码全局位置。
为什么要 sin/cos 而非直接写位置数字?两个原因:
- 数值尺度:直接写 0,1,2,…,10000 会淹没词向量信息(位置数比语义值大太多);sin/cos 把值限制在 [−1,1];
- 相对位置可用:sin/cos 有个好性质——位置 pos+k 的向量可以写成位置 pos 的向量的"线性组合"(三角恒等式),模型能轻易学到"距离 k"这个相对量,而不是只记住绝对位置。
现代模型(GPT 系)改用"可学习的绝对位置参数",原理等价:目的都是把"第几个位置"这个信息显式地给模型。
B.6 附:推导总览表
| 推导 | 一句话结论 |
|---|---|
| softmax | e^z 保证非负和为 1,并放大分数差距;除以 T 控制尖锐度 |
| 交叉熵 | −log(正确答案概率):自信答错罚最狠 |
| QKᵀ/√d | 点积方差 = d,除 √d 让方差回到 1,防 softmax 极端化 |
| 梯度下降 | θ ← θ − η∇L:负梯度必降(一阶近似),η 定步长 |
| 反向传播 | 链式法则连乘 + 从后往前缓存复用,梯度一次算完 |
| 位置编码 | 不同频率 sin/cos = 秒针到时针,区分位置又保留相对距离 |