第 5 周 · Day 4:系统复习(二)——28 个核心推导默写
Transformers and Large Language Models · Week 5 · Day 4。个人学习讲义与配套实验,按主题整理并持续修订。
Language Models / Foundations
课程源码 ZIP ↓个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。
本篇目录 ↓
时长 7 小时:§1 方法(0.5h)· §2–§7 推导默写(每个限时 10 分钟,约 4.5h)· §8 代码默写(1.5h)· 对照答案卷与补漏(0.5h)
对应学习计划 支线 1 的”手推 attention / LoRA / DPO 三个公式到不用思考”,以及面试题库里所有”推一下”的题。今天把全课的推导浓缩成 28 个,每个给出题目、提纲、容易错在哪、出处。提纲只写关键的一步步,完整的推导回到出处去看。
配套代码 w5day4_checks.py(纯 numpy):28 个推导的数值答案卷:每个推导出来的公式,都用有限差分、蒙特卡洛或暴力枚举核对一遍(28/28 通过)
§B 参考实现(code/ 目录):w5d4_drills.py(15 道”把推导写成代码”的挖空练习,自带判题);w5d4_drills_solutions.py(参考答案,先别看)。
今天的目标:28 个推导,每个能在 10 分钟内闭卷写完,并说出它的动机和一个数值检验的办法;15 道代码练习全部通过判题。
§0 今天怎么安排
- 先挑顺序:拿出昨天的漏洞清单(Day 3 §B 第 4 题)和期中、期末的错题记录(Day 2 §2.5)。清单里有的推导排在前面。
- 每个推导限时 10 分钟,纸笔,闭卷:写题目 → 按 §1 的方法推 → 写完后打开
out_w5day4.txt(或跑 python w5day4_checks.py)看对应的那一行,确认你的公式和数值核对的一致 → 对不上或超时的,回到”出处”重看,当天再默写一遍。
- 下午做代码默写(§8):15 道练习,每道 10 分钟。
- 记录:每个推导记一个状态:✓(10 分钟内写完且正确)/ △(写出来了但超时或有小错)/ ✗(写不出来)。△ 和 ✗ 进”三天后重做”的清单(Day 3 §A 的间隔重复)。
今天要用到的旧结论:全部。
§1 怎么默写一个推导
Week 0 Day 1 §5.0 的”五步推导法”在这里同样适用,稍作浓缩:
- 动机一句话:这个推导要回答什么问题?(“为什么要除以 dk""DPO 为什么不需要奖励模型”)写不出动机,说明你只记住了公式。
- 写清对象:变量是什么、形状是什么、要求的是什么(对谁求导、求什么的最优解、求什么的期望)。
- 按最朴素的方式展开:矩阵公式先写成索引形式、期望先写成求和、最优化先写出拉格朗日函数。不要跳步:跳步的地方就是考试和面试里被追问的地方。
- 化简并对照直觉:结果的形状对吗?特殊情况(β→0、k=1、B=0)对吗?符号的方向对吗(梯度该推高还是压低)?
- 说出一个数值检验:有限差分、蒙特卡洛、暴力枚举,哪一个能验证它?(这就是
w5day4_checks.py 在做的事,也是这门课每一个 checks.py 的精神。)
面试里的加分项:推完之后主动说”它的代价 / 局限是……”和”它在哪里被用到……”。
§2 基础
D1 softmax + 交叉熵对 logits 的梯度
- 提纲:L=−logpy,p=softmax(z)。∂logpy/∂zj=1[j=y]−pj(softmax 的雅可比 diag(p)−pp⊤ 与 −1/py 相乘,大部分项抵消)。所以 ∂L/∂z=p−ey。
- 容易错在:直接对 p 求导后忘了乘 softmax 的雅可比;或者把雅可比写成 diag(p)。
- 出处:Week 0 Day 1 §5.2。核对:D1。
D2 线性层的反向(VJP)
- 提纲:y=Wx,上游梯度 δ=∂L/∂y。索引形式 yi=∑jWijxj,所以 ∂L/∂Wij=δixj,即 ∂L/∂W=δx⊤;∂L/∂xj=∑iδiWij,即 W⊤δ。梯度与参数同形状,可以用”形状凑法”检查。
- 容易错在:转置的位置;batch 时 ∂L/∂W=∑bδbxb⊤(对 batch 求和)。
- 出处:Week 0 Day 1 §3–§4。核对:D2。
D3 LayerNorm 的雅可比是一个投影
- 提纲:x^=(x−μ1)/σ。对 x 求导:∂x^/∂x=σ1(I−d111⊤−d1x^x^⊤)。括号里是把向量投影到”与 1 和 x^ 都正交”的子空间:沿”整体平移”和”整体缩放”方向的扰动被消掉了。
- 容易错在:忘了 σ 也依赖 x(漏掉 x^x^⊤/d 那一项)。
- 出处:Week 0 Day 2 §4.3。核对:D3。
D4 Adam 的偏差修正
- 提纲:mt=β1mt−1+(1−β1)gt,m0=0。展开:mt=(1−β1)∑k=1tβ1t−kgk,若 E[gk]=gˉ,则 E[mt]=(1−β1t)gˉ。所以要除以 1−β1t;vt 同理。
- 容易错在:以为偏差修正只影响最初几步所以无所谓:没有它,前几步的有效学习率会被放大或缩小很多(取决于 m 和 v 谁的偏差大)。
- 出处:Week 0 Day 2 §2.6。核对:D4。
§3 架构
D5 为什么除以 dk
- 提纲:q,k 各分量独立、均值 0、方差 1,q⋅k=∑i=1dkqiki,每项方差 1,和的方差 dk,标准差 dk。除以 dk 让打分的方差回到 1,softmax 不会一开始就饱和。
- 容易错在:说成”防止数值溢出”(那是减最大值解决的);真正的理由是饱和导致梯度消失。
- 出处:Week 1 Day 1 §2.1;Week 0 Day 4 §5.5。核对:D5。
D6 注意力的反向
- 提纲:S=QK⊤/d,P=softmax(S)(按行),O=PV。dV=P⊤dO;dP=dOV⊤;softmax 的 VJP 按行:dSij=Pij(dPij−∑kdPikPik);dQ=dSK/d,dK=dS⊤Q/d。
- 容易错在:softmax 的 VJP 写成逐元素的 P(1−P)(那只是雅可比的对角线);漏掉 1/d;dK 的转置。
- 出处:Week 1 Day 1 §2.3。核对:D6;代码默写第 2 题。
D7 RoPE:打分只依赖相对位置
- 提纲:二维时把 q 看成复数,位置 m 乘 eimθ。Re[(qeimθ)(keinθ)]=Re[qkˉei(m−n)θ],只依赖 m−n。高维时 d/2 对维度各用一个频率 θi=base−2i/d。
- 容易错在:把 RoPE 加到嵌入上(它是乘到每一层的 q、k 上);对 v 也旋转(不需要)。
- 出处:Week 1 Day 5 §2.2–2.3。核对:D7;代码默写第 3 题。
D8 KV Cache 的显存
- 提纲:每个 token、每层要存 K 和 V,各 nkv×dhead 个数:字节数 =2×L×nkv×dhead×T×B× 字节数。70B(80 层、8 个 KV 头、头维 128)、bf16、batch 32、8192:2×80×8×128×2×32×8192=80 GiB。
- 容易错在:用查询头数代替 KV 头数(GQA 省的就在这里);忘了乘 2(K 和 V)。
- 出处:Week 1 Day 4 §1.4。核对:D8。
D9 每层参数 12d2 与 C≈6ND
- 提纲:MHA 的 Q、K、V、O 各 d2(4d2);FFN 两个 d×4d 矩阵(8d2);合计 12d2。训练:每个参数每个 token 前向一次乘加(2 FLOPs),反向约前向的两倍(对输入、对权重各一次,4 FLOPs),合计 6ND。
- 容易错在:SwiGLU 有三个矩阵(中间维常取 38⋅4d 左右以保持参数量);GQA 下 K、V 更小(Day 3 §2.1)。
- 出处:Week 1 Day 2 §5。核对:D9。
D10 online softmax
- 提纲:分块处理打分,维护当前最大值 m、归一化常数 ℓ、未归一化的加权和 a。新块到来:m′=max(m,maxjsj),ℓ←ℓem−m′+∑jesj−m′,a←aem−m′+∑jesj−m′vj。最后 a/ℓ。归纳法可证每一步都等于”到目前为止的精确结果”。
- 容易错在:更新 ℓ 时忘了给旧的 ℓ 乘修正系数;第一块时 m=−∞ 的处理。
- 出处:Week 1 Day 6 §3.2。核对:D10;代码默写第 4 题。
§4 训练
D11 Chinchilla 的最优配比
- 提纲:L(N,D)=E+A/Nα+B/Dβ,约束 C=6ND。把 D=C/(6N) 代入,对 N 求导令为 0:αAN−α−1=βB(6N/C)βN−1,解得 N∗=G(C/6)β/(α+β),G=(βBαA)1/(α+β);α≈β 时 N∗,D∗∝C0.5。
- 容易错在:直接在两个变量上求偏导而忘了约束;指数的分子分母写反。
- 出处:Week 2 Day 1 §3.2。核对:D11。
D12 MoE 负载均衡损失的梯度
- 提纲:Laux=n∑ifiPi,fi 是实际分到专家 i 的 token 比例(argmax,不可导,当常数),Pi=T1∑tpt,i。对路由概率求导:∂L/∂pt,i=nfi/T:越热门的专家(fi 大),它的路由概率被压得越狠。均匀分配时 L=1 最小。
- 容易错在:以为 fi 也能求导;忘了乘专家数 n(它让损失的尺度与专家数无关)。
- 出处:Week 2 Day 2 §3.2。核对:D12。
D13 LoRA 的梯度与初始化
- 提纲:y=(W+BA)x,上游 g。∂L/∂B=g(Ax)⊤,∂L/∂A=B⊤gx⊤。B=0 初始化:一开始 BA=0,模型与原模型相同;此时 ∂L/∂A=0 但 ∂L/∂B=0(A 随机),所以 B 先动起来、训练能启动。若两者都为 0,梯度全为 0,永远学不动。缩放 α/r 让改变 r 时更新的尺度大致不变。
- 容易错在:把 A、B 都初始化为 0;或者都随机(一开始就改变了模型)。
- 出处:Week 2 Day 6 §3.2、§3.4。核对:D13;代码默写第 5 题。
D14 推测解码的输出分布恰好是 p
- 提纲:草稿 x∼q,以 min(1,p(x)/q(x)) 接受;拒绝时从 (p−q)+/(1−α) 重采,α=∑min(p,q)。P(x)=q(x)min(1,q(x)p(x))+(1−α)1−α(p(x)−q(x))+=min(p,q)+(p−q)+=p(x)。
- 容易错在:以为推测解码是”近似”:它是精确的;期望产出 1−α1−αk+1 也常被问。
- 出处:Week 3 Day 1 §3.2。核对:D14;代码默写第 15 题。
§5 对齐
D15 从 Gumbel 噪声推出 Bradley-Terry
- 提纲:感受到的效用 ui=ri+ϵi,ϵ 独立同分布于标准 Gumbel。两个 Gumbel 之差服从 logistic 分布,所以 P(i≻j)=P(ϵj−ϵi<ri−rj)=σ(ri−rj)。损失 −logσ(rw−rl),梯度 ∂/∂rw=−σ(rl−rw):排错越厉害,梯度越大。
- 容易错在:只写结论不写噪声模型;忘了”奖励只确定到一个常数”这个推论。
- 出处:Week 3 Day 2 §2.2。核对:D15;代码默写第 6 题。
D16 策略梯度与基线
- 提纲:∇θEy∼πθ[r(y)]=∑yr(y)∇πθ(y)=∑yπθ(y)r(y)∇logπθ(y)=E[r∇logπ](对数导数技巧)。减去不依赖 y 的基线 b:E[b∇logπ]=b∑y∇π=b∇1=0,期望不变、方差可以大幅降低。
- 容易错在:基线依赖了动作本身(那就会引入偏差)。
- 出处:Week 3 Day 3 §1.2–1.3。核对:D16。
D17 PPO 裁剪目标的四种情况
- 提纲:min(ρA,clip(ρ,1±ε)A)。A>0:ρ>1+ε 时取裁剪项(常数),梯度 0;否则梯度 A。A<0:ρ<1−ε 时梯度 0;否则梯度 A。只在”已经往有利方向走过头”时切断梯度。
- 容易错在:以为裁剪是对称地限制 ρ 在区间里(往不利方向的偏离不被裁剪)。
- 出处:Week 3 Day 3 §3.2。核对:D17。
D18 KL 约束目标的闭式最优解
- 提纲:maxπ∑yπ(y)r(y)−β∑yπ(y)logπref(y)π(y),约束 ∑π=1。拉格朗日对 π(y) 求导:r(y)−βlogπref(y)π(y)−β−λ=0,得 π∗(y)=Z1πref(y)er(y)/β。(或者:目标等于 −βKL(π∥π∗)+βlogZ,最大化即令 π=π∗。)
- 容易错在:忘了归一化常数 Z,或者以为 Z 可以算出来(它要对所有回答求和,算不了:这正是 DPO 要消掉它的原因)。
- 出处:Week 3 Day 4 §1.2。核对:D18。
D19 DPO 的损失与梯度
- 提纲:由 D18 反解 r(x,y)=βlogπref(y)π∗(y)+βlogZ(x)。代入 Bradley-Terry:σ(rw−rl) 里 Z(x) 抵消。用 πθ 代替 π∗:L=−logσ(β[logπref(yw)πθ(yw)−logπref(yl)πθ(yl)])。梯度:−βσ(−Δ)[∇logπθ(yw)−∇logπθ(yl)],权重 σ(−Δ) 在隐式奖励排错时最大。
- 容易错在:说不清 Z(x) 为什么能抵消(两个回答来自同一个提示);把 β 的方向说反(β 大 = 离参考模型近)。
- 出处:Week 3 Day 4 §2。核对:D19;代码默写第 7 题。
D20 GRPO 的组内优势
- 提纲:同一道题采 G 个回答,A^i=(ri−rˉ)/std(r),回答里的每个 token 共用。二值奖励、组内正确率 p:答对 (1−p)/p,答错 −p/(1−p)。全对或全错时 std = 0,没有信号,概率 pG+(1−p)G。不需要价值网络:组内均值就是基线(D16)。
- 容易错在:忘了除以标准差(以及它带来的”难度加权”偏置,Dr. GRPO 把它去掉了)。
- 出处:Week 3 Day 5 §3.2、§4.1。核对:D20;代码默写第 8 题。
D21 pass@k 的无偏估计
- 提纲:采 n≥k 次、c 次成功。估计量 1−(kn−c)/(kn):它是”从这 n 个里无放回地抽 k 个,至少一个成功”的概率;对 c∼Bin(n,p) 取期望恰好是 1−(1−p)k。朴素的 1−(1−c/n)k 有偏(Jensen)。pass^k 同理:(kc)/(kn)。
- 容易错在:用 k 次采样直接算(方差大);用朴素公式。
- 出处:Week 3 Day 5 §5.1;Week 4 Day 4 §3.3。核对:D21;代码默写第 9 题。
§6 应用与评测
D22 InfoNCE 的梯度
- 提纲:S=QD⊤/τ,P=softmax(S)(按行),L=−B1∑ilogPii。由 D1,∂L/∂S=(P−I)/B;链式法则 ∂L/∂Q=(P−I)D/(τB)。logB−L 是互信息的下界,永远不超过 logB。
- 容易错在:漏掉 1/τ 或 1/B;说不清温度的作用(梯度集中在难负例上)。
- 出处:Week 4 Day 1 §3.3。核对:D22;代码默写第 14 题。
D23 BM25 的 IDF
- 提纲:二元独立模型:出现词 t 贡献 logq(1−p)p(1−q),p=P(t∣相关)、q=P(t∣不相关)。无标注时取 p=0.5、q≈(n+0.5)/(N+1):得 logn+0.5N−n+0.5。n>N/2 时为负,Lucene 用 log(1+⋅)。词频项 tf+k1(1−b+b∣d∣/avgdl)tf(k1+1) 饱和于 k1+1。
- 容易错在:说不出 IDF 的概率来源;忘了负 IDF 的坑。
- 出处:Week 4 Day 2 §1.2–1.4。核对:D23;代码默写第 10 题。
D24 NDCG
- 提纲:DCG@k=∑i≤klog2(i+1)2reli−1,除以理想排序的 IDCG。增益指数化(完全相关远比部分相关重要),折扣对数(越往下越不重要,但不像 1/i 那么快),归一化让不同查询可比。
- 容易错在:名次从 0 还是从 1 开始(折扣是 log2(1+名次),第 1 名是 1);IDCG 要用库里所有相关文档排序,而不只是返回的那几个。
- 出处:Week 4 Day 2 §3.2。核对:D24;代码默写第 11 题。
D25 检查与重试的成功率
- 提纲:每步做对概率 s;做错时检查器以召回 r 发现并重试,最多 m 次。递推 Sm=s+(1−s)rSm−1,S0=s,得 Sm=s∑j=0m((1−s)r)j→1−(1−s)rs。n 步 Smn。r=0 时重试无用。
- 容易错在:以为重试次数越多越好(上限由 r 决定)。
- 出处:Week 4 Day 4 §3.2。核对:D25。
D26 Cohen’s κ
- 提纲:po = 混淆矩阵对角线之和 / N;pe=∑kp1(k)p2(k)(两人各按自己的类别比例独立地乱打);κ=1−pepo−pe。两人各以准确率 a 标二分类(均衡):κ=(2a−1)2。
- 容易错在:pe 用了”均匀分布”而不是各自的边缘分布;忘了 κ 悖论(类别不均衡时 κ 低)。
- 出处:Week 4 Day 5 §2.2、§2.3、§2.5。核对:D26;代码默写第 12 题。
D27 Elo 是对 Bradley-Terry 的随机梯度上升
- 提纲:EA=1+10(RB−RA)/4001=σ(c(RA−RB)),c=ln10/400。一局的对数似然 ℓ=SlogE+(1−S)log(1−E),∂ℓ/∂RA=c(S−E)。所以 K(S−E)=cK⋅∂ℓ/∂RA:学习率 K/c、每局一个样本的 SGD。于是它依赖顺序、K 大时波动大;BT 的最大似然一次拟合全部对局。
- 容易错在:说不出 c 从哪来(10x=exln10)。
- 出处:Week 4 Day 6 §2.5。核对:D27;代码默写第 13 题。
§7 前沿
D28 掩码扩散的目标等于 −logp(x)(精确条件分布下)
- 提纲:遮住集合 M(∣M∣=k)的概率 tk(1−t)L−k,损失乘 1/t,对 t 积分 ∫01tk−1(1−t)L−kdt=L!(k−1)!(L−k)!,这正是”随机生成顺序里,轮到位置 i 时已生成的恰好是 Mc“的概率。所以目标 = 所有顺序的自回归损失的平均 = −logp(x)。
- 容易错在:说不清 1/t 的作用;把它和 BERT 的 MLM 混为一谈(BERT 固定 15%、不加权,不是似然的界)。
- 出处:Week 5 Day 1 §3.3。核对:D28。
§8 代码默写
code/w5d4_drills.py 里有 15 个挖空的函数,每个对应一个推导(注释里写了是哪一个):
| 题 | 函数 | 推导 |
|---|
| 1 | softmax_xent_grad | D1 |
| 2 | attention_backward | D6 |
| 3 | apply_rope | D7 |
| 4 | online_softmax_attention | D10 |
| 5 | lora_grads | D13 |
| 6 | bt_loss_and_grad | D15 |
| 7 | dpo_loss_and_grads | D19 |
| 8 | grpo_advantages | D20 |
| 9 | pass_at_k、pass_hat_k | D21 |
| 10 | bm25 | D23 |
| 11 | ndcg_at_k | D24 |
| 12 | cohen_kappa | D26 |
| 13 | elo_update | D27 |
| 14 | info_nce_grad | D22 |
| 15 | speculative_sample | D14 |
做法:把 raise NotImplementedError 换成你的实现,跑 python w5d4_drills.py 判题(✓ 通过 / ✗ 结果不对并打印第一组对不上的输入 / · 还没写);只判某几题:python w5d4_drills.py 2 7。判题用随机输入和参考答案比较(允许 10−6 的误差),第 15 题比较 20 万次采样的经验分布。不要看 w5d4_drills_solutions.py,全部通过或者实在卡住再看。
为什么要写成代码:推导写在纸上,错一个转置你可能看不出来;写成代码、和参考答案一比,错在哪一目了然。面试里的”白板写 attention”就是这个难度。
§A 推导的通用检查手段
- 形状:梯度与参数同形状(Week 0 Day 1 §3.1);矩阵乘法两边的维度要对得上。形状对不上的公式一定错,形状对上的不一定对。
- 特殊情况:B=0(LoRA)、k=1(pass@k 等于准确率)、β→∞(KL 约束:策略等于参考模型)、T=1(注意力退化成恒等)、只有一个类别(κ 没有定义)。
- 极限与单调性:温度 → 0 退化成 argmax;τ → 0 时 InfoNCE 只看最难的负例;检查器召回 r→1 时每步成功率 → 1。
- 对称性与守恒:GRPO 的组内优势之和为 0;softmax 的梯度之和为 0(∑j(pj−yj)=0);RoPE 的内积只依赖相对位置。
- 数值检验:有限差分(梯度)、蒙特卡洛(期望、概率)、暴力枚举(小规模的最优化、组合)。这是最可靠的一招:
w5day4_checks.py 的每一行都是一个例子。
§B 实操
- 推导默写(4.5h):按 §0 的顺序,28 个推导每个限时 10 分钟,纸笔闭卷,写完对照
python w5day4_checks.py 的对应行。记录 ✓ / △ / ✗。
- 代码默写(1.5h):
python code/w5d4_drills.py,15 道练习全部通过。
- 补漏(0.5h):△ 和 ✗ 的推导回到出处重看,当天再默写一遍;列进”三天后重做”的清单。
- 挑战(可选):从 28 个里随机抽 5 个,限时 30 分钟一口气写完。明天面试练习前再做一次。
参考实现:code/w5d4_drills.py、code/w5d4_drills_solutions.py。
§C 自测
从下面的清单里随机抽,每题 10 分钟,闭卷:
- 推导 softmax 交叉熵的梯度,并用它推出 InfoNCE 对查询的梯度。
- 推导注意力的反向传播(写出 dQ、dK、dV)。
- 证明 RoPE 下注意力打分只依赖相对位置。
- 推导 Chinchilla 的最优配比。
- 推导 KL 约束目标的闭式最优解,再推出 DPO 损失,说明 Z(x) 为什么抵消。
- 推导策略梯度,并证明基线不改变期望。
- 写出 PPO 的裁剪目标,分四种情况讨论梯度。
- 写出 GRPO 的组内优势,算出二值奖励下答对和答错的优势,以及没有信号的概率。
- 证明推测解码的输出分布恰好是目标分布。
- 证明 Elo 更新是对 Bradley-Terry 似然的随机梯度上升。
出关标准
疑问清单