这份讲义怎么用
这是老师的草稿,不是给学员的材料。学员看
课件,你看这一份。
课程作者 Chris Yang · Google Cloud AI Infra 架构师。
| 🎯 | 这一讲要留下什么 讲完之后学员脑子里应该剩的那一句话。 |
| 🗣 | 讲稿 接近逐字,可以照着念。黄底的是必须说出口的原话。 |
| 🖥 | 屏幕 这一段该滚到课件的哪里。 |
| ⚠️ | 别讲什么 这一讲最容易跑偏的方向(在最后一节「⚠️ 最容易跑偏的三个方向」里)。 |
⏱ 怎么排时间(⭐⭐ 2026-09-13 重排:现在有三档,别再按 62 分钟排)
⛔ 先说清楚为什么改。这一版把每一节的「它是怎么被发明出来的、为什么可行」
都补上了 —— 新增 10 张图、约 35 分钟的逐字稿。
照旧的 62 分钟排,一定讲不完。
⭐ 判据:过期的时间表比没有时间表更糟 ——
它会让你在第 40 分钟才发现自己只讲到一半。
| 节 | 主线 70′ | 标准 113.5′ | 全量 136.5′ | 这一节多出来的是什么 |
|---|---|---|---|---|
| §前 课前 + 骨架 | 10 | 14 | 17 | ⛔ 原先一分钟预算都没有:开场白 + 两道课前题(6 个小问,光收答案就 6–8 分钟)+ 骨架图 + 编年史 + 44 行大表 |
| §零 RNN | 8 | 12 | 12 | —— |
| §一 MHA | 8 | 13 | 17 | ⭐ 1.0 发明史(4′)+ 1.2b 为什么非 softmax 不可(3′) |
| §二 两条动机 | 6 | 8 | 11 | ⭐⭐ 2.3b 信息账的严格版本(3.5′) |
| §三 FlashAttention | 2 | 2 | 2 | ——(已降级) |
| §四 三个旋钮 | 6 | 8 | 8.5 | ⭐ 4.2b 事后压 vs 从头训这条判据(2.5′) |
| §五 旋钮① | 8 | 13 | 16 | ⭐ 凭什么敢压(3′)+ 砍头这一支怎么想出来的(3′) |
| §六 旋钮② | 8 | 15 | 20.5 | ⭐ 滑窗完整故事(4′)+ DSA(4′)+ NSA(3.5′)+ CSA/HCA(3′) |
| §七 旋钮③ | 6 | 10 | 13 | ⭐ 记事板(6′)+ A_t 谱系(4′)+ chunkwise(3′) |
| §八 混合 | 4 | 4 | 4 | ⭐ 配比轴(新,但替换了念表) |
| §8.5 六十秒课后题 | — | 2.5 | 2.5 | ⭐⭐ 2026-09-13 新增。全讲唯一一次让台下动手 —— 六十秒答题 + 对答案。时间紧可整段跳,但别只讲题不对答案 |
| §九+§10.1 落点 | 4 | 4 | 4 | ⛔ 时间再紧也不能压 |
| §10.2+10.3 落到 TPU | — | 5 | 6 | ⭐⭐ 2026-09-12 新增。台下是 infra 的人就必讲 —— 这是这门课唯一有资格讲的五分钟;纯算法听众可以整段跳过 |
| §十一 时间线 | — | 3 | 3 | —— |
| 合计 | 70 | 113.5 | 136.5 |
⭐⭐ 60 分钟版怎么砍 —— 砍的原则只有一条: 「为什么可行」的那些图,留住能迁移的那几张,其余只念结论。
- ⭐ 必讲,砍了这一讲就散了:§四 三个旋钮 + 4.2b 那条判据(这是全课的坐标系); §九+§十 落点(那条「任何倍数必须带上在多长的上下文下」)。
- ⭐ 只挑一张深讲:§五 的「凭什么敢压」或 §六 的「滑窗完整故事」—— 两张都是完整的侦探故事,讲一张就够立住「看一个机制先找它在修什么毛病」这个姿势。 ⛔ 别两张都讲,也别两张都不讲。
- 可以只念结论的:DSA / NSA / CSA 那三张(把落点带念一遍即可)、 §七 的 A_t 谱系(指着图说「区别只有 A 长什么样」就够)。
- 60 分钟版直接不讲:§二 的严格版本(L2M)、§十一 时间线。 ⚠️ 但 §八 讲「纯线性必然兜不住」时要补一句「这有理论下界,课后材料里有」, 否则那句会变成没有依据的断言。
⭐ §零 为什么值 12 分钟(60 分钟版压到 8):它不是补课,是舞台说明。 「Transformer 解码时又变回 RNN 的形状」这一格立起来之后, 后面三个旋钮才有一个共同的落点 —— 它们拧的都是「让解码那一行每步要搬的东西变小」。
⚠️ §三 FlashAttention 那一节,别按「科普」的时长去排: 它在课件里已经折叠,主线上只剩两句 —— 矩阵没被存下来过,以及它跟三个旋钮不是一类东西。 展开版(块大小的三堵墙、head_dim=128 锁死的 50%)留给有人追问时用。
① FlashAttention 那一节早就降级折叠了,主线上只剩两句;
② §零 / §一 / §二 / §四 / §五 / §六 / §七 / §八 / §九+§十 现在全都有逐字稿。
⭐ 判据:过期的元信息比缺失更糟 —— 它会让人不去翻那些真的稿子。 (⛔ 这个坑在这份讲义里踩了三次:「§四起只有提纲」、这一条,以及被这一条宣判作废、却又原样印在它正下方两个月的那个旧块 —— ⭐ 那一次最说明问题:诊断、判据、病灶三样同屏,说明当时的修订模式是加注解,不是改内容。2026-09-12 才真删掉。)
现在的实际状态: 全部主线小节都有接近逐字的讲稿,每个数都回到一手论文核过, 自己推的结论都当场标了「这是推导不是引用」。
⚠️ 仍然薄的只有两处:§十一 时间线那一段(只有骨架), 以及 §十二「明确不讲什么」(只有清单)。
🖥 投屏怎么放 —— ⛔ 别整张投(⭐ 2026-09-13 量过了)
⭐⭐ 正确的放法:一次只放大一格。 三栏图的一格是 440/1400,占满投影区就是 2.8× —— 11px 到屏幕上变成 31px,后排也看得清。
操作上就两句:
① 浏览器里把图点开单独一张(或直接开那个 .svg),
用 Ctrl/⌘ + 滚轮放到只剩一格;
② 讲完一格再横向平移到下一格 ——
下面每一段讲稿里的「指第二格」「切第三格」,本来就是按这个节奏写的。
⚠️ 构建时有一条「投屏体检」在盯这个数(build-all.sh 里),
因为图一变高它就往下掉,而在电脑屏幕上什么都看不出来。
这一讲要留下的一句话
现场原话:「长上下文才带来了智能,原来 2K 的上下文玩个毛?」
「2020 年的 GPT-3,上下文是 2048 个 token。那时候它是个很聪明的补全器。
今天你让它干的事完全不一样了 —— 读完整个代码库再改一处 bug、 连着跑几十轮工具调用、记住整场对话里你反复改过的主意。
上下文长度就是 agent 的工作记忆。记不住,什么都干不成。
而每加长一分上下文,KV cache 就线性涨一分。
所以今天这一讲,讲的是这么一件事:这六年,大家怎么把「记得住」变成一件付得起的事。」
⭐ 整讲只留这一句: 「这一讲前半程只有一个账本 —— KV cache。三个旋钮是它的三个面: 每份多大、每步读多少、干脆别让它变长。」
① 「那个中间的注意力矩阵有多大」—— 它不落地,不占显存, 讲它的显存是在教旧常识;
② 「FlashAttention 是第四个旋钮」—— 它在哪种注意力下都一样, 对这一讲没有区分度,已降级成一段话。
📌 骨架图(课件开篇那张)怎么用:六段,每段只问三件事 ——
图啥、带来了什么、欠下了什么。讲的时候手指着横着走一遍就行,别逐格念。
最后落在底下那两行:能跑的长度涨了,同一长度下要付的钱降了 ——
两件事同时发生,才有今天的 agent。
⚠️ 那两个数别相乘(512 倍与 846 倍是两把尺子),图上专门写了这条。
🎙 逐字稿 —— 开场 + §零 图一(可以直接照着念,约 5 分钟)
【开场】
2020 年的 GPT-3,上下文是 2048 个 token。那时候它是个很聪明的补全器。
今天你让它干的事完全不一样了 —— 读完整个代码库再改一处 bug、 连着跑几十轮工具调用、记住整场对话里你反复改过的主意。
上下文长度就是 agent 的工作记忆。记不住,什么都干不成。 而每加长一分上下文,KV cache 就线性涨一分。
所以今天这一讲,讲的是这么一件事: 这六年,大家怎么把「记得住」变成一件付得起的事。
⭐ 下面这句原来只在收尾说,2026-09-12 口述后挪到开场 —— 它是导航,
不是总结:「如果整讲只带走一句,带这句:这一讲前半程只有一个账本
—— KV cache。后面那三个旋钮,是它的三个面:每份多大、每步读多少、
干脆别让它变长。」
⚠️ 台上只说这一句承诺,别在这儿展开三个面分别是什么 ——
那是骨架图之后的活(课件里也是这么分的)。
【§零 钩子】—— 开场就是钩子,不要铺垫。
先说一件可能反直觉的事。你现在用的每一个大模型,往外吐每一个字的时候, 都退回成了 1990 年那条链的形状 —— 一步一个,每步把全部权重 从显存搬一遍。
Transformer 没有治好 RNN 的病。它只是把病从训练挪到了推理。 今天这一讲后面所有的东西,都是在治这个被挪过去的病。
⏸ 说完停两秒再翻第一张图。(「停」的做法:闭嘴、心里默数两拍。)
【图一 · 它是什么】约 2 分钟,快走。
先给它的出发点:序列有先后,所以得有个东西把历史带下去。 RNN 的答案是 —— 带一个固定大小的状态向量。 全部设计就这一句。它后面所有的好处、所有的痛点, 都是这一个决定的后果。
左边这张是 Elman 1990 年的原图。我只讲那条虚线:它把隐藏层原样抄一份
到 context 层。原文写死的是
one-for-one basis, with fixed weight of 1.0
—— 不是学出来的,是硬接线。整个循环,就靠这一条抄写。
右边展开成链。这里有一句最容易被忽略的话,我要点出来: 竖着的那些箭头彼此不相干,一直都可以并行。被卡住的只有横着那一根。 后面所有让 RNN 变快的努力,动的都只是那一根。
底下那一格:两个矩阵乘、一个加法、一个非线性,就这些。 而那个 d,就是它能记住的全部容量 —— 喂它十个词,还是十万个词,盒子一样大。
LSTM 和 GRU 没改这个形状,只是把非线性换成几个门。链还是那条链。
⛔ 这里我口述时踩了一跤,记下来:我把「门数别说错、这门课自己犯过一次」
连着说明一起念出去了。「这门课自己犯过一次」是给你自己的提醒,
不属于讲台。
⭐ 台上要么只说正确的数(LSTM 三个门 + 一个候选 = 四块矩阵;
GRU 两个门 + 一个候选 = 三块),要么整句不说。
判据跟专题二同一条:解释「为什么这么讲」的句子属于讲义,不属于讲台。
⭐ 段落收尾用前向钩子,别直接停(口述时临时加的,效果好): 「下一段讲第二张图 —— RNN 为什么在加速器上就是快不起来。 那是这一节的重心,而且我要先拆掉一个几乎所有人都有的想当然: 它慢,不是因为算得多。」
【图二 · 为什么慢】约 5 分钟,本节重心。 ⭐ 开口先把上一段那个钩子兑现,别重新起头。
开始之前,我要先拆掉一个几乎所有人都有的想当然。 不要说「RNN 慢是因为算得多」。这句话经不起推敲。
RNN 的计算量是 n 乘 d 平方,自注意力是 n 平方乘 d —— 谁大取决于 n 和 d 谁大。而 Vaswani 那篇原文写的恰恰是 n 小于 d 的时候自注意力更快,而那正是 2017 年的常态。
⚠️ 口述时我多说了半句:「台下只要有人当场解一下不等式就穿帮了。」 那半句是对讲者说的 —— 台上只讲理由(n 和 d 的大小关系), 「会穿帮」留在讲义里。(同一条通则这一讲已经踩到第二次了。)
那正确的说法是什么?看论文表一中间那一列。 计算量那一列会变。这一列不会 —— 串行步数。 RNN 是 O(n),注意力是 O(1)。这才是差别。
那「串行」在硬件上的具体形态是什么?
就是同一块权重被从显存搬了 n 次,而每一次搬上来,
只配一条 batch 那么窄的向量去乘。
NVIDIA 有句原话说得特别准:a GEMM with one dimension of one
—— 名义上是矩阵乘,实际上是矩阵乘向量。
然后把账走一遍。这三行板书,别只念。
⭐⭐ 这里有个讲法值得固定下来:念完前两行就停一拍,别顺口把答案带出来。 让台下自己看着那两行等一秒,第三行的冲击力完全不一样。
搬进来:k · d · d · 2 字节
算了多少:2 · k · d · d · B 次
相除 —— (停一拍)—— 算术强度 = B。那个 k 上下一约就没了。
而且请注意,这个结果跟 d 无关。不管你的隐藏维是 512 还是 8192, 算术强度就等于 batch size。这是一个非常硬的结论。
⭐⭐ 收口这一步是 2026-09-12 口述时加的,原讲稿只给数、没给出处:
TPU v7 每芯片 BF16 是 2307 TFLOP/s,HBM 带宽 7.37 TB/s,一除 —— 313。
「每从显存搬一个字节,机器配套能算 313 次。」
⭐ 紧接着点名:「这个 313 就是专题二整整一节在立的那条屋脊线。」
专题二花了十几分钟把它立起来;不点名,这个数在两讲之间是断的
—— 台下不会自己接上。
所以:batch 得开到 313 以上才喂得饱。
⭐⭐ 这时候滚到 fig3-rnn-hw 最下面那根横轴。 「两头堵死」以前是我说给你们听的,现在它在图上。⭐⭐ 三步,一步一指,别抢答:
①「先看那根最粗的竖线 —— 313。这是地板,站到它右边才算喂饱。」
②「再看上面那两个蓝三角 —— 那是显存的天花板。序列一长,它往左走。」
③「现在看这两样之间那块画满斜线的地方。」—— 停住。
那一段就是「硬件要你站进来,显存不让你进来」。
⛔ 「两头堵死」这四个字,一定要等他们看完斜线区再说 ——
先说了,斜线只是插图;后说,斜线就是证据。
再念 Vaswani 那句原话收口 ——
memory constraints limit batching across examples。
⭐ 顺带提醒:那句后面还跟着半句
becomes critical at longer sequence lengths ——
这正好就是图上「▼ 往左走」的文字版,两者说的是同一件事,
不是我们把两条证据拼在一起。
「那两个三角具体是多少 batch?」—— 图上故意没标数字, 因为它取决于模型和显存。这张图只承诺方向:S 一长它必然往左,早晚越过 313。 ⛔ 别当场编一个数 —— 编了就得为它辩护一整节。
「横轴为什么不用对数?」—— 因为换成 log,batch 1 和 313 会挤在一起, 「差两个数量级」这个唯一的论点当场就看不见了。 ⭐ 轴的选择在这张图里是论证的一部分,不是审美。
📌 被问「那当年怎么办的」才答:persistent RNN —— 把权重钉在片上不搬。 ⭐ 加一句收得更紧(口述时加的):七年之后 FlashAttention 做的是 「不让中间结果落 HBM」—— 同一个念头,换了个对象。
⭐ 段尾钩子:「下一段讲第三张图,那是这一节真正的落点 —— 今天的 Transformer 在解码的时候,又变回了这个形状。 而且我会指出它跟 RNN 唯一的那个区别在哪儿。」
讲稿 · 前 课前两道题 + 骨架图 + 44 行大表(⭐ 2026-09-13 补:原先这块完全没有指令)
【两道课前题】⏱ 6–8 分钟,含收答案。 ⭐ 规则说死:四个都选对才开揭晓;四个都选了但没全对,就说「三对一错,继续努力」。
⭐ 第一题(KV cache 有多大)的价值在 §五 收网 —— 讲到四种存法对照那张图时回头点一句「这就是课前第一题」。⚠️ 第二题也要收:(a) 那个 313 在 §零 图二念到的时候补半句 「这就是课前第二题 (a)」;(b) 那半道(VMEM 屋脊线)在 §7.4 讲 「块内矩阵放不进片上内存」时收 —— 正好同源。
【骨架图 fig3-arc】⏱ 1 分钟。 只说一句:「今天要讲的所有名字,都在解同一道题,而且只有三个旋钮可以拧。」 ⛔ 别逐段念那六段骨架。
【编年史图 + 44 行大表】⏱ 60 秒,⛔ 绝对不要念。
⭐ 投影上 44 行谁也看不清 —— 只讲两列: 「排 KV 那一列:从 576 GiB 到 697 MiB,846 倍。 再排上下文那一列:过 1M 的十二家,无一例外动了旋钮②或③。」⚠️ 口径:声明值 ≥1M。RWKV-7 那行写的是「无限(理论)」,不计入 —— 有人问就说「算上它十三家,结论一样」。
然后一句收:「剩下的课后自己排序看 —— 这张表是拿来查的,不是拿来念的。」 ⚠️ 846 倍那个数要自己先把口径说了,别等人问: 「两头都是反事实 —— GPT-3 的上下文本来只有 2K, 是把它的形状放到 128K 上算的;另一头 V4 还叠了一层跟注意力机制无关的 KV 量化。 这个数是用来看量级的,不是用来引用的。」
讲稿 · 0 起点:RNN(四张图)
「先说一件可能反直觉的事。你现在用的每一个大模型,往外吐每一个字的时候, 都退回成了 1990 年那条链的形状 —— 一步一个,每步把全部权重从显存搬一遍。 Transformer 没有治好 RNN 的病,它只是把病从训练挪到了推理。 今天这一讲后面所有的东西,都是在治这个被挪过去的病。」
说完停两秒再翻第一张图。
【图一 · 它是什么】给 2 分钟,快走。
先给它的出发点:序列有先后,所以得有个东西把历史带下去。RNN 的答案是带一个 固定大小的状态向量。「全部设计就这一句 —— 它后面所有的好处、 所有的痛点,都是这一个决定的后果。」
左边那张是 Elman 1990 的原图。只讲那条虚线:它把隐藏层原样抄一份到 context 层, 原文写死「one-for-one basis, with fixed weight of 1.0」—— 不是学出来的,是硬接线。 「整个循环就靠这一条抄写。」
右边展开成链。这里要点一句最容易被忽略的话: 「注意竖着的那些箭头彼此不相干,一直都可以并行。被卡住的只有横着那一根。 后面所有让 RNN 变快的努力,动的都只是那一根。」
底下那一格:两个矩阵乘、一个加法、一个非线性,就这些。 d 就是它能记住的全部容量—— 「喂它 10 个词还是 10 万个词,盒子一样大。」 LSTM/GRU 没改这个形状,只是把非线性换成几个门。链还是那条链。
【图二 · 为什么慢】给 5 分钟,这是本节重心。
正确的落法:指着表 1 中间那一列。「计算量那一列会变,这一列不会: 串行步数,RNN 是 O(n),注意力是 O(1)。这才是差别。」
然后落到硬件:串行在硬件上的具体形态,就是同一块权重被从显存搬了 n 次, 而每次只配一条 batch 那么窄的向量。把 NVIDIA 那句原话念出来: 「a GEMM with one dimension of one」—— 名义上是矩阵乘,实际是矩阵乘向量。
接着把账走一遍(板书这三行,别只念):
搬进来 k·d · d · 2 字节
算了 2 · k·d · d · B 次
相除 算术强度 = B ← 那个 k 上下一约就没了
这里要强调「跟 d 无关」:「不管你的隐藏维是 512 还是 8192, 算术强度就等于 batch size。这是个非常硬的结论。」
⭐ 收口用这个,效果最好:先给拐点 —— 「v7 每芯片 BF16 是 2307 TFLOP/s,HBM 带宽 7.37 TB/s, 一除,313 FLOP per byte。也就是说 batch 得开到 313 以上才喂得饱。」
再念 Vaswani 那句 —— 「memory constraints limit batching across examples」
然后问一句:「batch 是它唯一的算术强度来源,而序列一长显存又不让你开大。 两头堵死了,对吧?」
📌 台下如果问「那当年怎么办的」:persistent RNN—— 把权重钉在片上不搬。 这跟七年后 FlashAttention「不让中间结果落 HBM」是同一个念头。 可以顺势预告第一节。
【图三 · 解码时又变回来了】给 3 分钟,这是全节的落点。
三行摆在一起:Ⓐ RNN 串行、Ⓑ Transformer 训练并行、Ⓒ Transformer 解码—— 又串行了。 「Ⓑ 是它当年赢下来的地方。但你今天用它,用的是 Ⓒ 这一行。」
⭐⭐ 然后整个人挪到最后那一格去,那一格是这张图的收口 —— 它把 Ⓐ 和 Ⓒ 真的摆在了一起。读法有严格的先后,别跳。
① 先讲上面那排灰色的 W:「这一排两边一模一样 —— 都是一步一个 token,每步把整份权重重搬一遍。」 然后立刻把它判掉:「所以这一排解释不了任何事, 两条路在这儿是完全同一件事。」 ⭐ 这一步不能省。先把「相同的部分」清出去, 下面那两排的宽度差才是唯一还站着的变量。
② 手放到红色那一排,从左划到右:「六格一样宽。RNN 每步额外搬的是 一个固定大小的状态 h —— 跟上下文多长完全无关。」
③ 同一个动作,在紫色那一排再划一遍:「每一步都比上一步长。 到 tn 这一格,它已经冲出格子了 —— 这就是 KV cache。」 ⭐ 划到头就停住,别急着解释。让台下自己看完 那根冲出去的条。这张图全部的劲都在这两次划手的对比上。
④ 收一句:「128K 上下文的时候,紫色这一条能比权重本身还大。」
「所以今天这一讲后面三个旋钮,拧的全是同一件事 —— 让 Ⓒ 这一行每步要搬的东西变小。存少一点、看少一点, 或者干脆换回一个固定大小的状态。」
【图四 · 三个痛点】给 2 分钟,不要逐条讲。
三条一句话带过:算不快、记不住、装不下。 重点指最底下那一格:「第①条后来被反着又走了一遍 —— Transformer 用放弃状态换并行度,而线性注意力那一支想把状态请回来; 状态一回来串行也回来,于是又得靠 chunk 化和 parallel scan 把并行度找回来。」 讲完就翻页—— 这是伏笔,兑现在第六节。
另外别说错出处:「固定长度向量是瓶颈」是 Bahdanau 说的, 不是 Sutskever—— Sutskever 那篇只是描述做法。
讲稿 · 1 MHA:把循环拿掉(四张图)
🎙 逐字稿 —— §一 MHA(可以直接照着念)
【接住 §零,别重新起头】
刚才那三个痛点里,第一条 —— 算不快 —— 是 2017 年被解掉的。 解法很暴力:把循环整个拿掉。
但你马上会看到,这一刀解掉一个痛点,当场欠下另外一笔账。 而这笔账,我们今天后面全部时间都在还。
【图一 · 换掉了什么】约 2 分钟,快走,只看两个数。
左边是上一节那条链。右边是它的替代品 —— 一张 n 乘 n 的表。 串行步数从 O(n) 掉到 O(1);要算的格子从 n 变成 n 平方。
⭐ 一句话说清这个交换(这句比念两个复杂度有效得多): 「左边那条链,t1 想影响 t6 得走五跳;右边这张表,任意两点只隔一格。」
顺手指一下灰色那半边 —— 因果遮罩,softmax 之前置成负无穷。 不展开,看一眼就懂。
⭐⭐ 但这张图上真正要说出口的是另一件事,后面全靠它:
「被换掉的不只是那根箭头 —— 状态也没了。
RNN 那个固定大小的 h,被换成了『把所有历史原封不动留着』。」
【1.1b · 那它到底怎么把信息传过去的】约 2.5 分钟。这是 2026-09-12 新加的一节。
上一张说的是结构换了。这一张说的是 —— 信息怎么走。 我们跟着最后那个 token 走一遍就够了。
第一栏。每个位置,拿自己那个向量,乘三个不同的矩阵,长出三样东西。
q,是「我想找什么」。k,是「我这儿有什么」。v,是「被选中我就交这个」。
⭐ 这里主动埋一个坑,别急着填: 「为什么非得三个?我先按下,落点带里回答。」 —— 台下会自己惦记着,比你直接讲有效。
第二栏。t6 拿它的 q,去跟每一块 k 牌子对一下,每对一次出一个分数。 六个分数过一遍 softmax,变成六个权重 —— 加起来正好是一。
⭐ 指着那个 45% 说一句人话,比念「权重分布」有用: 「你看那个四十五 —— t6 这一次,主要想听 t4 说话。」
第三栏。按这组权重,把所有人的 v 加起来。 图上箭头的粗细就是权重。六股汇进去,出来一个方块 —— t6 的新向量。 这一个向量里,现在装着全场按需加权的内容。
⭐⭐ 落点分两句说,第二句比第一句重要:
第一句:一层注意力,等于一次「全员报价、按需取货」。
第二句:「但不只是最后那个 token 在做 —— 六个位置在同时做同样的事。 所以一层过后,每个位置的向量都变成了『全场的一个加权视角』。 堆 L 层,就是把这件事重复 L 次。这就是「理解」在 Transformer 里的全部形式。」
【最后说那个标题,因为它最常被读反】
「『Attention Is All You Need』—— 它说的不是「注意力很强」。 它说的是:混合序列信息这件事,只要它就够了。循环不需要,卷积也不需要。」
⭐ 紧接着给证据,别让它停在口号上: 「证据就在刚才那张图上 —— 一跳够到全场,六个位置同时做, 整个过程只有矩阵乘和一次 softmax,没有任何东西需要排队。」
⭐ 段尾钩子:「下一段讲 1.2,一层里到底在算什么 —— 那里会回答我刚才按下的那个问题:为什么非得投三次。 而且还有一个根号 d,大家都知道要除它,但很少有人讲得出为什么。」
【1.2 · 一层里到底在算什么】约 4 分钟。开口先还上一段那两笔债。
第一笔:为什么非得投三次。⭐ 别讲抽象版(「q 和 k 是两回事」)—— 讲图书馆那个画面,图里的落点带就是这么写的:
「你去图书馆找书:你脑子里那个需求,跟书脊上印的标题,
不是同一个东西 —— 所以 q 和 k 得分开。
那 v 为什么还要跟 k 再分一次?因为你按标题挑中它,
可你真正要拿走的是书里的内容。k 是书脊,v 是内容。」
⭐ 顺带一句:query / key / value 不是我们编的比喻,是论文自己的措辞
—— mapping a query and a set of key-value pairs to an output。
「检索」这个框架,人家从第一天就是这么说的。
第二笔:那个根号 d。 ⛔ 「防止 softmax 饱和」不能当理由讲 —— 那是结论。 理由在论文脚注 4,两行。
板书这两行(图里蓝框有,但要写一遍,别只指):
第一行:q、k 各维独立、均值 0、方差 1
→ q·k 是 d_k 个乘积相加 → 方差 = d_k,标准差 = √d_k。
第二行:除掉 √d_k,只做一件事 —— 把打分的方差拉回 1。
⭐ 然后才讲它在防什么,顺序别倒: 「维度越高,分数摊得越开。不拉回来,softmax 就被推到几乎全是 0 和 1 的角落 —— 梯度没了,训练推不动。」
⭐⭐ 说到这儿指图里那两根横条 —— 别停在「梯度没了」。 那是训练侧的后果,台下当场验不了;两根条是他们当场就能看的那个后果。⭐⭐ 两根条,一句话对照,这是这一格最值钱的十秒:
「左边是不除:整条被『抽屉』一家吃掉 ——
模型只看得见一个词。
右边是除了:混出来的是『放进 + 抽屉』——
这才答得上『放在哪儿了』。」
⭐ 然后把这句钉死:「所以 √d_k 防的不只是梯度 ——
它决定了这一层到底在『挑一家』还是在『混一碗』。」
⭐⭐ 收口用这句,台下对 √d 的印象会当场换一层: 「所以它不是玄学,也不是什么经验常数 —— 它就是一个标准差。」
⭐⭐ 【回到图本身】这一格还有一个更常见的误解要破,就在这两根条上。⏸ 先问,别先答:「注意力是不是『找出最像的那一个』?」
—— 等他们点头,再指右边那根条。
「不是。右边这一条是五家的货按百分比混出来的 ——
五家一个都没落下,只是有的多有的少。输出是个混合物,不是一个胜者。」
⭐ 「而且这一整条的长度永远是 100% ——
softmax 不许有人弃权,这一百份购买力必须全部花掉。」
📌 这句要留着 —— §六讲 attention sink 时会回来:
既然必须花掉,模型就只好自己造一个「不想买的时候丢票给它」的摊位。
然后再看打分那一步的形状 —— n × n 个数。
⛔ 别说成「整层里唯一一个随长度平方长大的东西」 ——
那是存储口径,而 FlashAttention 之后这一步根本不落地。
正确的说法:它贵在要算的次数,不在显存。
⭐⭐ 这一节真正的落点,也是整个专题的病根,慢一点说:
「K 和 V,要留着给下一个 token 用。 因为你生成第 n+1 个 token 的时候,前面这 n 个位置的 k 和 v 一个都不能少 —— 它们还得再被查一遍。留下来的那两份,就叫 KV cache。」
⏸ 停一拍,然后点题:「请记住这个时刻 —— KV cache 就是在这一步出生的。 上一节我说『解掉一个痛点,当场欠下另外一笔账』—— 这就是那笔账。 而今天后面全部时间,讲的都是怎么还它。」
⭐ 段尾钩子:「下一段讲 1.3,多头。先破一个特别常见的误解 —— 多头不是堆算力。而且多头正好是这笔账的放大器: 它把要留下来的东西,乘了个八。」
【1.3 · 多头在多什么】约 2 分钟。开口先破误解,别先讲机制。
「多头不是堆算力。很多人第一反应是『八个头等于八倍计算』—— 不是。
八乘六十四等于五百一十二。总维度没变,参数量没变,计算量也基本没变。
多头是把一个 512 维的空间切成八份,不是复制八份。是切开,不是加倍。」
⭐ 那切开图什么?先念论文半句,再翻译成人话 —— 两步都要:
原文:With a single attention head, averaging inhibits this。
人话:「一个头,要同时盯语法、盯指代、盯主题 —— 它只能给一个折中的答案。
切成八个,各盯各的,互不干扰。」
⭐⭐ 然后给这个重命名,台下会当场记住: 「所以多头买到的不是算力,是分辨率。」
落点在代价上,别停在好处上: 「每个头,都要自己的 K 和 V。于是要留下来的东西,乘了个八。 刚才 1.2 里出生的那份 KV cache,在这一步直接被放大了八倍。」
⏸ 「记住这个八 —— 今天后面第一个旋钮,第一刀砍的就是它。」
【1.3b · 128 个数凭什么够用】约 2 分钟。⭐ 这一段是台下一定会想、 而我们以前答不上来的那个问题 —— 主动问出来,比等人举手好。
⭐ 开口先替他们问:「刚才说一个头 128 维。 那我问你们一个问题:128 个数,凭什么记得住一整篇文章里上万个词的区别? —— 这个问题我第一次想明白的时候,比整套 attention 都更让我意外。」
先给硬上限,再拆掉它: 「如果要求每两个方向都互相垂直—— 桌面上最多两根, 屋角最多三根,128 维最多 128 根。第 129 根一定能被前面那些拼出来。 照这个标准,一个头一辈子只认得 128 个概念。显然不是这样。」
⭐⭐ 转折就一句话,这一句是全段的题眼: 「所以模型根本没按这个标准办事。它把『垂直』放宽成了『差不多垂直』。」
指图②,只让他们读一个对照: 「我们当场算过了:128 维里随便丢一万根,最挤的那一对还差 61 度才重合。 根数涨了 78 倍,最挤的那一对才挤了 9 度。 —— 容量几乎是白捡的。」
⏸ 「但天下没有白捡的。『差不多』的意思就是『有点像』,而有点像会漏票。」
指图③,这里要慢,两个数分开念:
「一个干扰项漏走多少?正主的万分之一。细到画都画不出来,完全可以忽略。
可是 —— 『可以忽略』不能乘以一万。
一万个加起来,正主只剩 46%。」
⭐⭐ 落到生活里,这句说完停一下: 「一个人在台下小声嘀咕,你听不见;一万个人同时小声嘀咕,台上的人就喊不过了。 —— 这就是『记混』。它不是模型偷懒,是 softmax 逼着所有票加起来等于一的直接后果。」
⭐ 段尾钩子,一次埋三个伏笔: 「这一段后面要还我三次:为什么不是 8 维(8 维里丢一千根,最挤的一对只剩 12 度, 基本是同一根);为什么 MLA 敢压到 512; 还有 —— 为什么稀疏注意力少看几个,反而可能更准。」
【1.4 · 主线图】约 2 分钟。⛔ 不要逐格讲。
「这张图我不逐格讲。一层 Transformer,每一步的张量形状都标出来了。 我只让你们做一件事 —— 在形状里找那个 S。」
「S 是 KV 的长度,是那个会一路变长的维度。 全图只有两处带着它 —— K 的输出,和 V 的输出。 那就是唯一需要跨 token 留下来的东西。 其他所有张量,算完就扔;只有这两个,得一直背着。」
⭐ 顺手预告,这张图是全讲的骨架: 「它后面还会出现四次,每次只点亮一处 —— 那四次就是三个旋钮,各自跟这个 S 较劲的方式。」
【1.5 · 收尾】约 1 分钟。
⭐⭐ 这一段的力量全在「不是我们说的,是原文说的」:
「这个形状的代价,不是我们今天的推论 —— 2019 年就有人把它命名成问题了。
Shazeer 那篇,也就是 MQA 的出处,摘要里写着:训练很快,因为序列方向可以并行;但 ——
incremental inference is often slow, due to the memory-bandwidth cost of
repeatedly loading the large keys and values tensors。」
「增量推理很慢,慢在反复搬那两个大张量。 这句话把 §零 图三 Ⓒ 那一行,从我们的推论变成了原文 —— 2017 年造出这个形状,2019 年就有人指着它说这是个问题。」
⭐ 段尾钩子:「下一段进第二节 —— 我们把这笔账算成具体的字节数。那个数会让屋子里安静一下。」
⭐ 2026-09-13 新增:滚到 1.2b,fig3-why-softmax。⏱ 约 3 分钟。 这两条很少有人讲,而且各自能串起后面一整段。【为什么非得是 softmax】 「先别管 softmax 长什么样,先看它要服务什么 —— 注意力最后那一步是加权平均。那这组权重就被逼出三条硬要求: 非负,因为『负着看一眼』没有意义; 加起来等于一,否则输出的尺度会随序列长度乱飘; 可导,否则『该看哪儿』根本学不出来。」
「softmax 三条全中,还白送一条:指数把差距放大 —— 它其实是一个能求导的 argmax:既能聚焦到一两个位置,又留着梯度。」
⭐⭐ 然后抛一个反问,这是这一段的钩子: 「那 softmax 是不是必须的?—— 不是。 今天后面讲 DSA 的时候你会看到,它那个索引器用的是 ReLU,不是 softmax。」⏸ 停一拍再解释。
⭐⭐ 「为什么它敢换?—— 因为索引器只拿分数去排序,挑 top-k; 它不做加权平均。不做加权平均,『加起来等于一』这条就不需要了。」
⭐ 判据,这句值得写下来: 「拿到一个打分,先问 —— 这个分数是拿去加权,还是只拿去排序? 两者对归一化的要求根本不一样。只排序的那个,可以换成便宜得多的东西。」【为什么 k 和 v 不能是同一个】 「k 是书脊上印的字,v 是书里的内容。你照着书脊找,但拿走的是书里的东西。」
⏸ 问一句:「那如果让 k 就等于 v 会怎么样?」⭐ 答案:「那就只有『跟我像的』会被取回来。 可你要的经常不是像你的那个 —— 是能补上你缺的那块的那个。 代词要找的是它指代的名词,不是别的代词。」
⭐ 「所以注意力要的是一次非对称的检索:按 A 去找,取回 B。 这就是为什么非得有三个投影,不是两个。」 📌 ⛔ 交代口径:这一格是推导加类比,不是论文原话。
⭐⭐ 段尾把两条并起来,抬成一个通用判据: 「softmax 那条『一行加起来等于一』,在这里是优点; 等会儿到稀疏那一节,同一条性质就是 attention sink 的成因。 —— 看到一个设计的副作用,先回头看它的优点是靠哪条性质换来的, 十有八九是同一条。」⛔ 原来这一节直接从「2017 年有人问」开始 —— 那是结果,不是过程。 而这门课后面那一长串名词,学员能不能自己判断,靠的就是 「看一个机制先找它在修什么毛病」这个习惯。
⭐ 开场一句立住: 「注意力不是谁一次想出来的。它是被三次『这儿不对』推出来的 —— 我们一步一步看。」
指第一格。① 2014 年,毛病是「一个向量装不下」。 「当时的做法叫 encoder-decoder:读完整句原文,把它压成一个固定长度的向量, 再从这个向量解码出译文。听着挺优雅。问题是 —— 句子一长就崩,而且这是当时实测出来的。」
⭐ 这里有个很多人不知道的细节,讲出来很有意思: 「Bahdanau 的第一个念头不是『注意力』,是『对齐』。 机器翻译里本来就有这个概念 —— 这个译词对应原文哪几个词。」⭐⭐ 「而真正关键的一步,是那个『软』字。 硬切一段原文出来 —— 不可导,学不了。 改成 softmax 加权平均 —— 可导, 于是『该看哪儿』这件事可以跟翻译模型一起训出来。」
⭐ 论文自己那句话很漂亮,可以直接念: 「上下文向量,就是在所有可能的对齐上取的期望。」⛔ 别展开成概率论课,点到为止 —— 它的作用是让「加权平均」听起来不再像个技巧。 指第二格。这一格是本课主线第一次露面,要停一下。
② 2017 年第一刀:把打分函数换掉。 「Bahdanau 那个打分,是一个小前馈网络。Transformer 把它换成了一个点积。」
⏸ 先问一句再给答案:「为什么换?」⭐ 台下十有八九会答「点积更准」—— 不是。
⭐⭐ 「论文自己写得很清楚:两者理论复杂度相仿,小的 d 下表现也差不多。 换的理由是 —— 点积快得多、省内存,因为它能用高度优化的矩阵乘实现。」
⭐⭐ 然后把它抬成这门课的主线,说慢一点: 「选点积不是因为它更准,是因为它能变成矩阵乘。 —— 硬件反过来决定了公式长什么样。」埋钩子:「今天后面你还会见到它三次:head_dim 128 撞 MXU 的 256、 稀疏为什么按块选不按 token 选、DSA 为什么必须搭 MQA 模式。都是同一件事。」
⭐ 「顺带说那个 √d 从哪来 —— 也在同一节的脚注里。 假设 q 和 k 的各个分量独立、均值 0、方差 1,那点积的方差就是 d_k。 d 一大,分数就拉得很开,softmax 被推进饱和区,梯度小到学不动。 除以 √d_k,就是把方差拉回 1。」
指第三格。③ 第二刀:既然能直连,那还要 RNN 干什么。 「关联任意两个位置要几步?卷积那一路是线性的,ByteNet 是对数的, 自注意力是常数 —— 不管多远,一步到位。 那句标题就是从这儿来的。」
⭐⭐ 最后这一点最值得讲,因为它纠正一个流传很广的说法: 「论文在同一句话里就承认了代价:『把注意力加权平均起来,降低了有效分辨率』—— 然后紧接着说:『这个效应我们用多头注意力来抵消』。」⛔ 「所以『多头等于多个视角』是个营销式说法。 论文给的因果是反的:先有平均带来的损失,多头是补丁。」 ⭐ 段尾收口,把这一格的方法带走: 「三步,每一步都能指出它在修哪一个具体毛病。 —— 这就是今天我希望你们带走的读论文的姿势: 看一个机制,先找它在修上一版的什么毛病。」 ⭐⭐ 2026-09-13 新增:§一 现在从 1.0「它是怎么被发明出来的」开讲。 ⏱ 跟着 fig3-attn-invented 走。
⛔ 原来这一节直接从「2017 年有人问」开始 —— 那是结果,不是过程。 而这门课后面那一长串名词,学员能不能自己判断,靠的就是「看一个机制先找它在修什么毛病」这个习惯。 ⭐ 1.0 的逐字稿在上面那块「🎙 逐字稿 §一 → §六」里,别在这儿再写一遍。(2026-09-13 删重复:同一段 70 行逐字稿原先在两处各有一份。) 课件第一节。接着 §零 的钩子往下走,别重新起头。 ⛔ 最容易讲砸的方式:把它讲成「Transformer 入门」。 台下都见过 QKV 那张图。他们没被讲清楚的是三件事: ① 那个 √d 到底哪来的;② 多头为什么不是「堆算力」; ③ KV cache 是在这一步出生的。时间全压在这三点上。
「刚才那三个痛点里,第一条 —— 算不快 —— 是 2017 年被解掉的。 解法很暴力:把循环整个拿掉。但你马上会看到,这一刀解掉一个痛点, 当场欠下另外一笔账,而这笔账我们今天后面全部时间都在还。」
【图一 · 换掉了什么】2 分钟。左边是 §零 那条链,右边是 n×n 的表。 只讲两个数:串行步数 O(n)→O(1),要算的格子 n→n²。 「左边那条链,t1 想影响 t6 得走五跳;右边这张表,任意两点只隔一格。」
⭐ 顺手指一下灰色那半边:因果遮罩,softmax 之前置成 −∞。 不用展开,学员看一眼就懂。
⭐ 这一格必须说出口(后面全靠它):「注意,被换掉的不只是那根箭头 —— 状态也没了。 RNN 那个固定大小的 h,被换成了『把所有历史原封不动留着』。」
【图二 · 在算什么】4 分钟,重心在 √d。 QKV 三件套快走,但要强调它是论文自己的措辞,不是我们编的比喻。 重点讲「为什么要投三次」:「我想找什么」和「我能提供什么」本来就是两回事; 而 V 又跟 K 分开,是因为「凭什么被选中」和「被选中之后交出什么」也是两回事。
q、k 各维独立、均值 0、方差 1 → q·k 的方差 = d_k → 标准差 = √d_k「除掉它,只做一件事:把打分的方差拉回 1。 维度越高分数摊得越开,不拉回来 softmax 就被推到几乎全是 0 和 1 的角落,梯度没了。」
⭐ 这段推导在论文脚注 4 里,两行讲得完,讲完台下对这个 √d 的印象就换了一层。
【图三 · 多头】2 分钟。先破一个常见误解:多头不是堆算力。 「8 × 64 = 512,总维度没变、参数量没变、计算量也基本没变。多头是切开,不是加倍。」 然后念论文那半句:「With a single attention head, averaging inhibits this」 —— 单头不是不够用,是会把该分开的关注平均掉。
⭐ 这一节的落点在这儿,慢一点说:「多头的好处清楚了,代价也清楚了 —— 每个头都要自己的 K 和 V。 于是要留下来的东西乘以了 8。今天后面第一个旋钮,第一刀砍的就是这个 8。」
【图四 · 主线图】2 分钟,只做一件事。
不要逐格讲。指着 BTNH 那两块(K 和 V):
「全图唯一需要跨 token 留下来的,只有这两块 ——
三个旋钮全都在动它们,只是动的面不同。这张图后面还会出现四次,每次只点亮一处。」
⛔ 别再说成「唯一一个随长度平方长大的东西」(那是 softmax 前那个 BTSKG)
—— 那是存储口径,而 FlashAttention 早就让它不落地了。
讲一个不存在的显存开销,是在教旧常识。
⭐ 收尾一句交给第二节:「这个形状的代价,2019 年就被点名了 —— Shazeer 那篇说,训练很快,但增量推理慢,慢在反复搬那两个大张量。 下一节我们把它算成具体的字节数。」
讲稿 · 2 两条独立的动机(硬件账 + 信息账)
🎙 逐字稿 —— §二 两条动机(可以直接照着念)
⭐⭐ 【2.0 · 为什么是现在】⏱ 90 秒,跟着 fig3-flip 走。 ⛔ 这一段放在两条动机之前 —— 不先回答「为什么是现在」, 后面两条线听起来就像两条凭空冒出来的技术路线。
⭐ 先抛一个时间线上的怪事:「Transformer 是 2017 年的东西。
KV cache 会涨这件事,2019 年 MQA 那篇论文的摘要里就写着。
那我问一句 —— 为什么全行业真正动手改注意力,是 2024 年以后?
中间那几年,技术一个字都没变。」
指两根柱子,只让他们盯灰色那一段:
「同一个模型。灰色那段是权重,两边完全一样,625 GiB,一个字节没动。
我只拧了两个东西:上下文从 4K 到 128K,同时服务的人从 1 个到 64 个。」
⭐⭐ 然后念右边那三个数,最后一个要停一下:
「KV cache 从 0.27 GiB 涨到 549 GiB;
占总量从 0.04% 变成 46.8%;要的卡从 7 张变成 13 张。
—— 什么都没改。是工作负载变了,不是技术变了。」
⭐⭐ 2026-09-14 改版:第二格已经不是两张写着数字的卡片了, 是四根摆在同一把尺子上的条,横轴就是「要几张卡」。 —— 所以这一段是用手在尺子上走,不是念数。
⭐ 再补一刀,这一刀是给后面 §五 埋的: 「别忘了,那根红柱子已经是 MLA 压过之后的。 我把『假如它用 MHA』也摆到同一把尺子上了。」
手从上往下滑,四根条,前三根一根一句,快:
「MLA 一个人,7 张。MHA 一个人,12 张。
MLA 六十四个人 —— 13 张。」
⏸ 停住,用两只手把第 2、3 根条一起框起来:
「就看这两根。差一张卡,伺候的人数差六十四倍。
同样一台机器 —— 一个换六十四个。」
⭐⭐ 最后一根条,先别报数,让他们自己看见它冲出去:
「那 MHA 伺候六十四个人要几张?」
—— 手顺着第四根条一路划到图框外面,划出去:
「337 张。按这把尺子,还得往右再画十一个多图宽。
到这儿,问题已经不是『要几张卡』了,是『做不了』。」
⛔ 讲者须知:这一格最容易被听成「MHA 只是贵了一点」。 防它的办法不是多说一句「很贵」,是别把第四根条的数字先报出来 —— 先让他们看着那根条撞到图框上出不去,再报 337。 看见「装不下」,和听见「三百三十七」,完全是两件事。
⏸ 「所以 §五 那个 56.9 倍不是一次优化, 它是把这件事从做不了变成做得了。」
【§二 · 两条独立的动机】约 8 分钟。整节只有一张图,别照着念,跟着图走。
⭐ 开口先立规矩,不然后面会乱: 「接下来这两条必须分开讲。它们指向同一批技术, 但出发点完全不同 —— 混在一起讲,就成了名词罗列。」
【左栏 · 线索 A:硬件账】约 4 分钟,重心在那条阶梯。
⭐⭐ 一行一行念,别跳到结论(这是全讲第一个「让屋子安静」的时刻, 冲击力全在逐级放大的过程里):
每 token 每层,2 × 128 × 128 —— 三万两千七百六十八个数。
乘六十一层 —— 将近两百万。
乘两字节 —— 一个 token 三点八一 MiB。
再乘十三万一千零七十二个 token —— (停一拍)——
四百八十八 GiB。
⏸ 停死,别马上解释。(做法:闭嘴,心里默数两拍。) 然后一句:「一个用户。一段 128K 的输入。」
接着走三个对照 —— 这一步是让那个数「站住」,不是凑数据:
一块 v7 device 的可分配 HBM 是 94.74 GiB —— 一个用户就要 5.2 块。
V3 全部权重 625 GiB(671B,原生 FP8)——
单用户就占 78%,两个并发,KV 就超过权重本身。
换 GQA-8 省 16 倍、换 MLA 省 56.9 倍 —— 但 GQA 那个数还是装不进一块卡。
⭐⭐ 左栏的落点是这一句,比 488 本身更重要: 「权重是所有用户共享一份,KV cache 是每人一份。 所以它不是显存里的一项开销 —— 它直接决定你能同时服务多少人。」
⭐ 判据:同一组数有两个落点,就一定会长出两个版本 —— 所以现在讲义这一段只是复述图上的数,不自己再算一遍。
⛔ 必须自己先说的一条限定,别等人问:
「这 488 是『假如 V3 用 MHA』的反事实值,不是 V3 的实测
—— V3 从第一天就是 MLA。而且口径沿用论文比较表(K、V 都按 128 维),
V3 真实的 K 每头是 192 维,严格算还会更大。」
⭐ 这门课自己的规矩:推出来的数必须带推导链和口径。说出来,不是心虚,是立信。
【右栏 · 线索 B:信息账】约 3 分钟。这条更少被讲,讲好了很加分。
⭐ 用一个问句起头,比陈述有效: 「一个 128K 的序列,真的需要 128K 份独立的 KV 吗?」
三个观察,指着图上那三个小画面走,各二十秒:
① 实测极其稀疏 —— 绝大部分权重集中在很少的位置。
「那把那些近零的算出来,算的是什么?」
② Attention sink —— 大量注意力被「停放」在开头几个 token 上,
跟内容无关。说明有一部分权重根本不是在做检索。
③ 远近有别 —— 近处密集细粒度、远处稀疏粗粒度。
「凭什么用同一套精度处理这两种?」
【新增 · 信息账的严格版本】⏱ 跟着 fig3-info-law 走。
⭐⭐ 这一段可以不讲,但讲了会让整堂课的分量完全不一样 ——
因为它顺手回答了一个学员要到最后才会问的问题:
「为什么第三个旋钮必须混着用?」那不是工程经验,是有理论下界的。
⭐ 开场先承认上一格是直觉版: 「刚才我说『远处的信息可以少看』—— 这句话听着像常识。 但它其实是可以算的,而且算出来的结论跟直觉有出入。」
① 先分清两个互信息。 「第一个是两点互信息:两个 token 之间的相关性,随距离幂律衰减。 这里有个很漂亮的结论:任何马尔可夫过程、隐马尔可夫过程,互信息都是指数衰减的; 而实测的自然语言是幂律。这就是语言不能用马尔可夫模型近似的原因 —— 幂律的尾巴,指数怎么都够不着。」
「第二个不一样:双部互信息。把一段序列从中间切开, 问前一半和后一半之间有多少互信息。这个量随长度是幂律增长的。」
⭐ 学员一定会觉得这两句矛盾,主动拆开: 「一个在衰减,一个在增长,不矛盾 —— 单对的相关性越来越弱,可是成对的数量越来越多。」 指第二格。② L2M 条件。 「有一条很朴素的界:模型能表达出来的互信息,受限于它历史状态的维度 —— 缓存里装不下的东西,它就是不知道。 于是得到一个必要条件:状态维度必须至少以同样的幂律增长, 否则总存在一个长度,它兜不住。」
「Transformer 呢?—— 它的 KV 随长度线性增长, 线性比那条次线性的幂律还快,所以它自动满足。」
⭐⭐ 这句要点透,它是整堂课的一个支点: 「注意 Transformer 的『自动满足』是拿平方计算换来的 —— 它其实是供给过量。」 指第三格。⛔ 先说口径再讲内容。⚠️ 「下面这一格是我按定义推的,论文没有逐个旋钮分析。」 「旋钮①,MLA、GQA 压的是每个 token 存多少 —— 阶还是 L,动的是常数,安全。 旋钮②,稀疏 —— 注意,KV 照样全存着,只是这一步不读它,状态仍然是 L,安全。 旋钮③,固定大小的状态 —— 阶掉到 O(1)。」
⭐⭐ 落点,慢: 「前两个旋钮动的是常数,第三个动的是阶。 这是一条质的分界 —— 也是为什么今天没有一个纯线性注意力的前沿模型,它们全都是混合的。」⭐ 埋钩子:「等会儿第八节讲混合的时候,回来想这一格。」 ⛔ 最后补三条口径,一条都别省: 「一,L2M 是必要条件不是充分条件 —— 状态够大只是『有可能记住』, 不等于『真的学会了』。二,第三格是我的推导。 三,两点互信息和双部互信息是两个不同的量,别拿一个去推另一个。」
⭐ 右栏收口:「于是压缩、稀疏、分层都变得合理 —— 它们不是三个技巧,是这三个观察各自的直接后果。」
【交汇处】约 1 分钟。⭐ 这一节真正的产出在这儿,别当收尾一带而过。
「A 说必须省,B 说可以省而不太亏。这两句缺一不可。
只有 A:你得到的是一堆有损压缩的权宜之计,效果掉了只能认。
只有 B:你没有动力去付 kernel 那么难写的代价。
两条合起来,才解释了为什么这个方向三年里投了这么多人 ——
它同时是一件不得不做、又做了不太亏的事。」
⭐⭐ 最后给出这一讲的判卷标准,后面每一支都要用它: 「所以判一个变体好不好,就看它在「省了多少」和「亏了多少」之间落在哪。」
⭐ 段尾钩子:「下一节本来要讲 FlashAttention —— 但它不在这三个旋钮里。我只用两句话交代,然后直接进骨架。」
⭐ 但它不能整节拿掉:上一节刚砸完 488 GiB, 不先说清「那个大家伙根本不落地」,后面所有「怎么少算」的讨论都建在恐慌上。
📌 课件外面只剩两样:那句「矩阵从来没被完整存下来过」, 和「它跟三个旋钮不是一类东西」那张对照表。台上默认也只讲这两样,2 分钟。
【默认版 · 2 分钟】只说两句:
① 「那个 n 乘 n 的注意力矩阵,从来没有被完整存进显存过 —— 所以这一讲的账本里根本没有它,488 GiB 那笔账不受影响」
② 指对照表:「注意它跟今天后面三个旋钮不是一类东西:
三个旋钮改的是算什么,模型变了、通常要重训;
FlashAttention 一个字都不改数学,它改的是怎么算,
跟谁都能叠,而且必须叠。」
⭐ 然后翻页,别恋战。
⛔ 其余情况一律不开 —— 那一段是硬件细节,展开就把主线冲散了, 而这一讲的主线是「三个旋钮」,不是「怎么把一个算子写快」。
📌 历史包袱说明:这一节 2026-09-04 从原来的第七节提到前面, 当时的理由是「先说清怎么算这条路已经走到头,剩下的省法只能去改算什么」。 那个逻辑今天仍然成立,所以位置没动 —— 动的只是详略。
讲稿 · 3 FlashAttention(⚠️ 2026-09-08 起降级为「可跳过」)
🎙 逐字稿 —— §三 FlashAttention(两句版)(可以直接照着念)
【§三 · FlashAttention】⏱ 只给 2 分钟。⛔ 课件里已折叠,别默认要讲。
现场原话:「FlashAttention 在这个专题里不合适,它过于底, 太容易把主线给忽略了。」—— 所以台上只说两句:
第一句:「那个 n 乘 n 的注意力矩阵,从来没有被完整存下来过
—— 它在片上一块一块地过,不占显存。所以这一讲的账本里没有它。」
⭐ 这句不能省:上一节刚砸完 488 GiB,不先说清「那个大家伙根本不落地」,
后面所有『怎么少算』的讨论都建在恐慌上。
第二句:「而它跟三个旋钮不是一类东西 —— 它数学一个字不改,只改访存顺序,在哪种注意力下都一样, 对这一讲没有区分度。」
⭐⭐ 【3.3 · 只在被追问时讲】约 90 秒。台下最常问的那一句是: 「softmax 不是得看完整行才能算吗?一块一块过,怎么可能算得对?」 —— 被问到就翻到 fig3-online,不问就别展开。
「⭐ 答案是:手里只攥三个数 —— 目前最高分、目前总和、
目前的加权和。一块一块改,改完的卷子就扔。
万一新的一块里冒出个更高分?不用把前面的卷子重翻一遍 ——
把手里已经算出来的那两个数各乘一个系数就行。」
🏠 这句说完停一下,它是整段唯一要他们记住的: 「改到一半发现有人考得更高,只要把手里的总分缩一下。」
⭐ 再补一句堵住「那是不是近似」: 「图③两条路算出来的差是 0,不是『误差很小』。 它是恒等变换,不掉点。」
⚠️ ⛔ 但别停在「它很聪明」上,落点是代价:
「那个系数每来一块就得乘一次,而它不是矩阵乘,
还卡在归约链上 —— 下一块要用上一块刚更新出来的数,
排不进矩阵乘的流水里一起跑。
后面那个『融合完还是只跑到 35%』,有一部分就在这儿。」
⭐⭐ 翻页之前,必须补上第三句 —— 这一节真正的作用在这句上。
「所以『怎么算』这条路,到这儿就走到头了:中间产物已经不落地,
块大小已经贴着三堵墙,算子还是只跑到三成多。
剩下的空间不在『怎么算』里,只能去改『算什么』 ——
下一节那三个旋钮,就是『改算什么』的全部可能位置。」
⛔ 前两句是「这东西不归我们管」,第三句才是「所以该轮到我们了」。
只说前两句,台下记住的是「有个很牛的东西我们不讲」;
加上第三句,这一节才从岔路变成转轴。
⚠️ 这也是 2026-09-14 把本节标题从「已经是标配,所以这一讲不展开它」
改成「『怎么算』这条路已经走到头了」的原因 ——
课件正文(3.7)一直是这么收的,缺的只是标题和台上这一句。
⭐ 第三句说完就翻页。想深挖的同学点开折叠自己看(里面有块大小的三堵墙、 head_dim=128 锁死的 50%、以及为什么连 50% 都到不了)。
讲稿 · 3 FlashAttention(原逐字稿,展开时用)
原理快走,天花板慢走。 台下要的是「它的极限在哪」,不是「它怎么工作」—— 后者他们多半已经知道。
开口一句话定位:三个旋钮改的是算什么, FlashAttention 一个字都不改数学,它改的是怎么算。
然后快走原理:朴素写法三步,中间那个 L×L 的 S 每一步都要落一趟 HBM,
三步四趟;128K 单头就是 32 GiB。融成一个 kernel,S 整项消失。
⭐ 顺带把可迁移的那句说出口:FLOPs 一分不省,省的全在
「中间产物不落地」这一行 —— 这是所有算子融合共有的形状。
那张经典图画的是第一版的循环顺序:外层 K/V,内层 Q。
指着内层那三行说:O 和那两个统计量每一轮外循环都要读进来、写回去一次。
为什么躲不掉?—— 因为下一块 K/V 还会碰到同一个 Q 块。
第二版把两层对调,两个后果: ① O 整个内循环待在片上,一次都不落 HBM; ② 不同 Q 块彻底独立,铺到几百个执行单元上互不通信。
⭐ 这句要说出口,它是本节最可迁移的一句: 「外循环放谁,谁的中间状态就不用来回搬。」 ⭐⭐ 2026-09-14 新增:滚到 3.2b 的 fig3-loop-order。⏱ 约 4 分钟。 ⛔ 这一节原来只有伪代码 —— 台下会以为「省了个数量级」, 而真数一遍只有 1.49 倍。这一格就是把这件事摊开。 指第一格,两张一样的块网格。「同一张网格,行是 Q 的块、列是 K/V 的块。 每个格子上挂两个点:左上蓝点是『这一格要载一次 K/V』, 右下橙点是『这一格要搬一次 O』。」
⭐⭐ 这一句是整格的钥匙,说完停一下让人看图: 「你看这两个点 —— 左边和右边正好换了位置。 FA1 蓝点每列只有一个、橙点每格都有;FA2 反过来。」 ⭐ 同一张网格上还标了两件东西:青色的那一片 = 这一趟外层循环会碰到的格子; 红框圈住的那一行 = 某一个输出要等齐的格子。 两张图的红框画在同一个位置 —— 那是数学定的,跟循环怎么写没关系。⭐⭐ 「看左边 FA1:青色是一列,红框是一行,
它们只交于一格。 也就是说这一趟外层循环跑完,
这个输出才凑齐六分之一,剩下五格还没来 —— 所以只能先写回 HBM。
再看右边 FA2:青色那一片,正好就是红框那一行。
走完这一趟,这个输出直接定稿,一次都不用落盘。」
⭐ 记住这句,等下讲到 warp 那一格还要再用一次 —— 是同一句话。 指第二格,三对柱子。
⭐⭐ 「那到底省了多少?我们把四个张量分开数了一遍。
只看 O 那一行:4160 对 64,是六十五倍 —— 很吓人。
可是四个一起数:6368 对 4288,只差 1.49 倍。」
⭐ 所以这次对调换来的不主要是带宽,是并行度 —— FA1 只能按 batch × head 铺,FA2 多出「Q 块」一整维。 batch 小、头数少、上下文长的时候,前两维本来就铺不满卡。 ⚠️ 这里有三句一定要补,否则就讲过头了: 「第一,那个 1.49 是我们自己按两份伪代码数出来的,不是论文报的 —— FA2 连 IO-complexity 定理都没有。 第二,论文从没说过『对调是为了让 O 不落 HBM』, 它给的理由是减少 non-matmul FLOP 和提高 occupancy —— 正好跟我们数出来的结论一致。 第三,这个顺序不是 FA2 首创,论文自己归功于 Phil Tillet 的 Triton 实现。」 指第三格。
接着讲 warp 那一层 —— 同一个原则又用了一遍: 第一版切 K/V,warp 之间要写共享内存、同步、再加起来; 第二版切 Q,warp 之间完全不用通信。
⚠️ 两个小地方,说错了会被懂的人抓: 「论文管第一版那种切法叫 split-K,不是坊间常说的 sliced-K —— 『sliced』这个词两篇论文里一次都没出现过。 另外这段描述出自 FA2 §3.3:FA1 论文里『warp』出现 0 次, 是 FA2 回头替它总结的。」 ⭐⭐ 两个尺度合成一条判据,慢慢说: 「切『要被累加的那一维』就得合;切『各自独立出结果的那一维』就不用合。」再补一句它的适用面:任何融合 kernel 分工时, 先问『我切的这一维在不在求和号里』。
⛔ 2026-09-14 更正:下面这一段原来连着三条 cue 都把节号写成了第一节的。
其中两个号真实存在(是「多头在多什么」「本节落点」),第三个压根不存在 ——
而讲义↔课件对账当时全绿。
⭐ 根因不是判据松,是那条 lint 只对了五份讲义里的一份,
这份从头到尾没被读过。「0 条对不上」和「0 条被检查」,在输出里长得一模一样。
(⚠️ 这段本身不是「滚到哪儿」的指令,所以写成正文而不是 board ——
否则它复述的那几个旧节号会被 lint 当成真指针报出来。)
「那两个 running 值确实很小,每行各一个标量。 真正占地方的是 S 那一整块 —— 它是 [bq, bkv], 512 见方就是 1 MB,2048 见方是 16 MB。」
然后讲生命周期:S 要连着走完「产出 → 求最大值 → 减完取指数 →
喂给第二个矩阵乘」四步才能扔,而中间两步是向量单元的活、两头是矩阵单元的活
—— 矩阵单元想开工,输出却还被向量单元占着。
再加流水线要重叠,就得同时留住好几块 S。
先把表读对,这句别省:「基线是 223.6,全 2048。
下面那个 228.4 不是块大小的功劳 —— 那一行还开了 max_logit 这个开关。」
⛔ 不说这句,学生记下来的就是个错数(这一节此前的版本就是这么错的)。
指第一格,三堵墙一堵一堵指:往下是碎块开销; 往上是容量墙 —— S 块是 b×b,块翻倍它翻四倍; 往上还有一堵并行度(KV 方向只剩一块,流水塌)。
⭐ 最反直觉的那句,停一下: 「装得下,却更慢。」 指第二格。这一格是这一节真正的判决,别跳。 ⭐⭐ 本节最值钱的三十秒,慢慢念: 「两条轴是按同一把尺画的。seq 从 4096 拉到 16384,长了四倍 —— 最优块纹丝不动,还是 2048。 它在上面那条轴上是 seq/2,在下面那条上是 seq/8: 两次的共同点是那个绝对值,不是比例。」然后指那个空心圈:「规则要真是按比例,最优点该跑到这儿(8192)。实测没有。」 指第三格。
给出为什么必然如此:「片上要放的是 Q、K、V 三个 b×d, 加一个 b×b 的 S。这四项里一个 seq 都没有 —— seq 只决定你要绕几趟。甜点由 VMEM 顶死,而 VMEM 不知道你的 seq 是多少。」
⭐ 落点两句: 「换序列长度不用重扫块大小,换硬件才要。」再补那个闭环:「块开到跟 seq 一样大,就是『切 1 块』—— 压根没分块,S 就是整张注意力矩阵。 那堵容量墙,就是 §3.1 里 FlashAttention 本来要解决的那一堵。」 滚到 3.6。这一段是这一节真正的分量,给足时间。
三层,顺着讲:
① 记账口径虚高(FLOP 记的是不折 causal 的全量);
② 形状锁死 50%(head_dim=128 撞 256 的 MXU,两个矩阵乘各撞一次);
③ 寄存器生命周期把 50% 压到 35%(回指 1.3)。
讲稿 · 4 三个旋钮:全课骨架
🎙 逐字稿 —— §四 三个旋钮(可以直接照着念)
【§四 · 三个旋钮:全课骨架】⏱ 6 分钟。⛔ 不许压 —— 一压后面全散。
⭐⭐ 这一节的目标不是「介绍三类方法」,是让台下拿到一个封闭感: 没有第四个位置可以动。拿到了,后面四节都有地方挂;拿不到, 后面就是四组并列的名词。
照着图从左往右走,别从右边的方案讲起:
「回到注意力那个式子。一个 query 要做的事,只有三步。
第一步,从每个位置取出一份 K、一份 V —— 可动的是存什么、存多大。
第二步,决定跟哪些位置算,然后加权求和 —— 可动的是求和的范围有多大。
第三步,用 softmax 那个式子做这个加权 —— 可动的是用哪种运算。」
⏸ 停一拍,然后把右边三张卡一一对上: 「三个旋钮,就是这三步各自可以动的地方。一一正对,不多不少。」
⭐⭐ 这句是本节的落点,慢一点说: 「所以除此之外,没有第四个位置可以动 —— 你想省 KV,只能从这三处下手。」
然后补两条关系,别漏:
① 「① 和 ② 可以叠加 —— 一个让每份更小、一个让读的份数更少,
省的是同一样东西的两面。」
② 「③ 是换赛道 —— 它不再有『随长度增长的 KV』这个概念,
代价是把无损的检索换成了有损的状态压缩。」
⭐ 唯一的例外要主动交代,否则台下会拿 FlashAttention 来问: 「那 FlashAttention 算第四个吗?不算 —— 它不改算什么,只改怎么算。」
⭐⭐ 最后落到今天各家的实际答案,这一句给后面 §八 埋线: 「①+②+③ 混着来,就是 Hybrid —— 不同层用不同方案。 V4 的 CSA+HCA、K3 的 KDA+Gated MLA。这是今天各家的实际答案,不是折中。」
📌 那张名词收纳表怎么用:建议做成板书, 讲完每个支线回来填一格 —— ⛔ 不要在这里逐行念, 十三行念完十分钟就没了,而且那时候台下还没有挂靠的地方。
【4.2b · 事后压 vs 从头按压缩训】⏱ 跟着 fig3-when-axis 走。
⚠️ 2026-09-12 降级:上一版把它讲成「第二个轴」—— 它在旋钮③ 上一行都没有,撑不起「轴」这个词。现在的讲法是「一条在旋钮①②上反复出现四次的判据」,被问到旋钮③ 就直说:本讲那张表里线性模型全是 native,事后线性化那一支我们没核过数,这一格留空。
⭐⭐ 这一段的位置很讲究 —— 必须放在骨架立完之后、逐支展开之前。
放早了没有例子支撑,放晚了学员已经自己乱归类了。
⭐ 「三个旋钮回答的是『改什么』。但还有一个问题它们回答不了 —— 『什么时候改』。」
滚到 fig3-when-axis。「同一件事,你可以拿一个训好的模型去凑,也可以从第一天就按这个约束训。 这两条路一直并存,而且今天这一讲里,它会出现四次。」
⭐ 「左边这一列是事后的:低秩分解、GQA 的 uptraining、H2O 的驱逐策略、 还有一批推理期加的选择器。共同点是便宜、不用重训、随时可开关。 右边这一列是从头的:MLA、DSA、NSA。共同点是要重训,而且往往要专门的 kernel。」
⭐⭐ 结论那句要说透: 「事后那一列的天花板,基本就是『接近原来那个』。 右边这一列能持平甚至超过,还能顺带省训练成本。」 ⛔ 然后立刻补口径 —— 不补的话这张图会教出一个错的心智模型: 「注意:『事后还是从头』说的是这个方法这一次被怎么用, 不是方法本身的属性。GQA 最初是 uptraining 出来的,在左边这一列; 可今天很多模型从第一天就是 GQA,那它就在右边。 —— 别问『这个方法属于哪一列』,要问『这次它被怎么用』。」 ⭐⭐ 段尾把两个轴合起来,这是整堂课的组织方式: 「一个轴是『改什么』,一个轴是『什么时候改』。 两个轴一交叉,这一讲就从一张清单变成了一张地图。 拿到任何一个新名字,先把它放进某一格 —— 放得进去的,它的优点和代价你已经知道了;放不进去的,那才值得你花时间。」⭐ 段尾钩子:「骨架立完了。下面四节,就是一个旋钮一节 —— 每一节回来这张表上填一格。」
⛔ 2026-09-12 改:这里原先写着「只有提纲,没有逐字稿」—— 稿子早就补上了,这句话却留在原地。过期的元信息比没有更糟, 它会让人不去翻那块真的稿子。
骨架:先给三个旋钮那张收纳表(每个token存多少 / 每个query看多少 / 换一套数学),把所有名词一次收进去;再逐支展开; 最后用代价对照表和时间线收尾。
⭐ 讲这几节时反复回到同一个动作: 「拿到一个新名字,先判它在哪一格。」 这一讲的价值是那把尺子,不是那些名字。讲稿 · 5 旋钮①:让每一份更小
🎙 逐字稿 —— §五 旋钮①(可以直接照着念)
【§五 · 旋钮①:让每一份更小】⏱ 约 7 分钟(含开场 1 分钟的接线图)。
⭐⭐ 2026-09-14 新增 · 开场先用 fig3-wiring 铺 1 分钟,别直接上散点。
滚到 fig3-wiring,四格并排那张。一个数都不要念。
「先不看数。就看接线:MHA 每个头各问各的;GQA 几个头合用一份;
MQA 全部头合用同一份。再看最下面那排行李箱 —— 这三家的算力几乎一样,
差别全在这段对话得一直背着多少东西。」
⏸ 停在 MLA 那一格,这一句要慢:
「MLA 不在这条谱上。它箱子里只有一个盒子,而且那个盒子不是 K/V ——
它是一份压缩件,每个头要用的 K/V 是从它现场展开的,
那几个虚线盒子用完就扔,不进箱子。」
⛔ 讲到这儿就停,「省多少」一个字都别说 —— 下一张图才是算账的。
⭐⭐ 接着用课前第一题收网 —— 那道题就是为这一刻埋的: 「还记得课前那道题吗?四个数:488、30.5、3.81、8.58。 现在把它们摆在一起看。」
【左栏 · 四种存法】约 3 分钟。从上往下念,但把题眼留到最后。
MHA 每头各存一份,128 份,488 GiB。
GQA-8 分八组组内共用,省 16 倍。
MLA 不按头存,压成 512 维隐向量加 64 维 RoPE,省 57 倍。
MQA 所有头共用一份,省 128 倍。
⏸ 停一拍,然后把题眼抛出来: 「你们注意到没有 —— MQA 只要 3.81,比 MLA 的 8.58 还小。 MLA 根本不是最省的那个。」
⭐⭐ 这一节全部的分量在下面这句上,说慢点: 「MQA 2019 年就把体积压到头了,代价是质量掉得厉害。 所以这一支比的从来不是「谁存得最少」 —— 是「同样一份字节,换回多少能力」。」
⭐ 顺带把一个方法论点出来(后面会反复用): 「GQA 的价值不在它是个新机制 —— 它只是把 MHA 和 MQA 之间的空白填上了。 把一个二选一变成一个可调的连续量 —— 这门课后面你会反复见到这个套路。」
【新增 · 凭什么敢这么压】⏱ 跟着 fig3-mla-why 的三格走。
⭐⭐ 这一段是 2026-09-13 补的,补的是这一节最大的一个洞:
⛔ 原来我们讲了 MLA 是什么、省多少,
唯独没讲它凭什么敢这么压 —— 学员带走一个 56.9 倍,
带不走任何可迁移的东西。
① 先算一笔账。「MHA 每个 token、每一层,要存三万两千七百六十八个数。 但你想想这些数是哪来的 —— 它们全是拿一个七千一百六十八维的 h 乘两个矩阵算出来的。一次确定性的线性映射。」
⭐ 这句是这一格的落点,说慢一点: 「确定性映射不会凭空造出信息。把一张纸复印一百二十八份,信息还是那一张 —— 复印件再多,也回答不了原件回答不了的问题。」然后落到数上:32,768 ÷ 7,168 = 4.57 倍,这一段是白送的。
② 那为什么大家一直存三万多? 「因为存的是算好的结果,不是原料。 存结果,读的时候直接用;存原料,读的时候得现算一遍。 这是一笔拿计算换存储的交易,不是一个错误 —— 早年序列短、显存不紧张,这笔交易很划算。」
「MLA 走了两步。第一步就是改成存原料 —— 这一步白送 4.57 倍。 第二步才是真正的赌注:原料也不全存,从 7,168 压到 512。」
⛔ 「赌」这个字要落实,别当形容词: 「压到 512,数学上等于强制 K 的那个投影矩阵,秩不许超过 512。 原来它可以是 7,168。这是一个实打实的能力限制。」③ 那凭什么敢赌? 「因为『K 和 V 的投影本来就是低秩的』不是 DeepSeek 猜的,是量出来的。 MLA 前后有一批工作专门干这个:拿一个已经训好的模型,把 K/V 投影做低秩分解, Eigen Attention 省四成,Palu 省一半。这就是证据。」
⭐⭐ 2026-09-14 改版:这一格不再是四张卡片,是两张稿纸。 —— 先用手比一下右边那两张的宽度,让台下看见它们一样宽, 再分别说。这一格的全部论点就在「一样宽」三个字上。指左边那条流水线:「一张写开了的稿子,拿去缩印 ——
看这些笔画,挤成一团了。挨上的那些就是被丢掉的方向。
写的时候,谁也不知道以后要缩。」
再指右边那张:「MLA 这张一样宽,可它根根分明
—— 因为它没有『原稿』那一步。训练的时候格子就这么大,
模型自己决定这三笔写什么。」
⛔ 说完立刻埋钩子:「记住这个对立。等会儿讲稀疏的时候它会原样再来一次, 名字叫『推理期稀疏』对『native 稀疏』,结论也一样。」 ⭐ 段尾把方法论抬出来 —— 这才是学员该带走的东西: 「以后看任何一个压缩方案,先把它拆成两段问: 哪一段是表示冗余、白送的?哪一段是赌它低秩、赌来的? 白送的那段不用做实验;赌的那段,必须看掉点。」 ⚠️ 口径,别讲过头:有人会问「那 MLA 是不是比 MHA 还强」。 稳妥的说法是「在同等预算下不吃亏」 —— DeepSeek 自己的对照是 对齐总参数量之后比的,社区复现里也有「带 RoPE 时 MHA 略好」的结果。 ⛔ 别说成「压缩使它变强」,台下只要有人追问口径就穿帮。
【新增 · 砍头这一支是怎么想出来的】⏱ 跟着 fig3-mqa-why 走。
滚到 fig3-mqa-why,拉到最下面那一格 —— 那上面只有两根轴。⭐⭐ 这一格是个彩蛋,讲出来台下会「哦」一声。 ⛔ 但别上来就念结论 —— 这张图的全部力气都在「两根轴是垂直的」上, 而那是看出来的,不是听出来的。先让他们看,你只负责按顺序指。
⭐⭐ 三步,一步一句,每句之间都停住:①「先看横轴。」上面两个点 —— 只看一个局部邻域、压缩历史位置的个数。
②「再看纵轴。」上面也是两个点 —— 八个人共用一本、只派一个人去查。
③「现在看原点那个小方角。」—— 停住,什么都别说。 等台下自己把「垂直」或者「正交」两个字说出来。
⛔ 这两个字你替他们说了,这张图就白画了。
「这些全出自 2019 年 Shazeer 那篇 MQA 论文的第 2.4 节。 横轴那两条,是他列给别人的选项;纵轴那条,是他自己走的。 而『正交』—— 是他的原话,不是我事后安上去的词。」
⭐ 落点:「横轴就是今天的旋钮②,纵轴就是今天的旋钮①。 也就是说 —— 今天这三个旋钮里的两个,2019 年那篇论文里 就已经是垂直的两根轴了。」⛔ 价值不在考古:它证明这门课的骨架不是我们事后归纳的,是当事人自己列的。 台下要是有人觉得「三个旋钮是你编的分类法」,这一格就是回答。
「左边那个灰虚线框为什么飘在平面外面?」—— 限制序列长度也在他那张单子上,但它不是旋钮: 它既不改每个 token 存多少,也不改每个 query 看多少,它直接把 S 变小。 画在平面外才诚实 —— 硬塞到某根轴上就是撒谎。
「纵轴上的 GQA 标着 2023,不是 2019 啊?」—— 问得对。横轴上那两条也标着「后来叫滑窗」「后来叫稀疏 / 压缩」, 一个意思:图上带年份或带「后来」的,都是后人填进去的; 2019 年那篇只贡献了轴,没贡献满图的点。
「那旋钮③ 呢?」—— 不在这张平面上。 换机制(§七)不是在这两根轴上往外挪,是换掉整个坐标系 —— 所以 2019 年那张单子上没有它,也不该有。
「同一篇论文的表。第一行是正常的多头,困惑度 29.9。 第二行是 MQA,所有头共用一份 K/V,30.2 —— 只掉了 0.3。 第三行你们看一眼:把模型改成真的只有一个头,31.2。」
⭐⭐ 这三行的题眼要自己点破,别指望台下自己看出来: 「第二行和第三行,缓存的 K/V 是一样多的 —— 都只有一份。 差别只在 query 那一侧还留不留八个不同的问法。 就这一点,把困惑度拉回了整整 1.0。」 ⭐ 然后把它抬成判据,这是这一段要留下的东西: 「瓶颈的伤害,不在于它多窄,在于它剥夺了多少自由度。」立刻回扣上一张:「所以 MQA 只存 256 个数、比 MLA 的 576 还窄一倍多, 却明显更差 —— 因为 MQA 逼所有头收到同一份 k 和 v, 而 MLA 只要求它们从同一份压缩里各自解码。」 指右边 GQA 那一格。⏱ 40 秒,别展开。
「GQA 的发明点有两个,都不是『折中一下』。 第一个:不用从头重训 —— 把一组里所有头的 K/V 投影取个平均, 再用 5% 的原始预训练算力续一下,它就是个 GQA 模型了。 论文实测这比『挑一个头』和『随机初始化』都好。」
「第二个更有意思:模型越大头越多,MQA 一律砍到一份,削减力度是随规模失控的。 GQA 固定的是组数,于是削减比例可控。所以它是一个旋钮,不是一个新机制。」
【插入 · 把这个旋钮真的画出来:那块 0/1 矩阵】约 3 分钟。 ⭐ 用 fig3-copy-matrix,顺序就按图上从左到右:MHA → MQA → GQA-2 → MLA。
指第二格四块矩阵。先把「看什么」说清楚: 每一块都是同一个位置上的同一件东西 —— 把压出来的 c 摊回四个头要的 K, 那一步用的上投影矩阵。竖着是 c 有多宽,横着是 4 个头 × 每头 2 维 = 8 列。「先看两头。最左边 MHA:8×8 的单位阵 —— 一个数都没复制,也一点都没压,c 就是 K 本身。 第二块 MQA:只有 2 行,同一份被抄了 4 遍 —— 只存 2 维,代价是四个头拿到的 K 一模一样。」
⭐⭐ 然后是这张图唯一要留下的东西,慢一点讲: 「右边这两块,形状完全相同 —— 都是 4×8,cache 都是 4 维。 GQA 的 32 格里只有 8 个 1,其余 24 格恒为 0,而且不可训练; MLA 的同样 32 格,全部可训练。 就这样。这就是全部的区别。」⛔ 图里 MLA 那块刻意没填数字 —— 有人会问「那些实数是多少」,答:编出来的小数会被当成 V3 的真权重,所以只画深浅。
⭐ 接着把顺口但没用的那句话破掉:「常听到『MLA 就是给 KV 做低秩分解』。 这话没错,但它区分不了 GQA 和 MLA —— 把 GQA 所有的 K、V 叠在一起看,GQA 本身就是一次低秩投影。 低秩这一步,MHA 也好 MLA 也好,大家都在做。」
「真正不同的是低秩之后那一步:GQA 用『分割 + 复制』把 c 凑成四个头的 K, 而分割和复制本身就是线性变换 —— MLA 只是把这个写死的线性变换,换成一个一般的、可学的。」
⛔ 段尾必须补这一句,否则下一小节就白铺了: 「但你们马上会想到一个问题:矩阵一放开,四个头的 K 又各不相同了 —— 照常缓存 K 的话,cache 不就退回 MHA 那么大?省的初衷当场作废。 对。所以这张图是『吸收』那一小节的前提,不是它的替代 —— MLA 能成立,靠的是等会儿那个恒等变换:只缓存 c,把上投影挪到 q 那一侧去。」 ⚠️ 归属别讲错,两条,被问到再展开: ① 苏剑林的原话是「MLA 被视为 GQA 的一般化」, 不是「MHA / MQA / GQA 都是 MLA 的特例」 —— 后一句是网上转述放大的。 ② 他没有否认 MLA 是低秩分解;准确说法就是上面那句 —— 低秩没错,只是区分不了这两个。他给的d_c < d 这个条件在 MHA 那一端还会失效,
那一端 c 就是 K、V 本身,根本没压。
⭐ 段尾把暗线第二次点出来(第一次在上一张):
「GQA 是『事后』的典范:平均池化加 5% 续训,便宜,但天花板就是『接近 MHA』。
MLA 是『从头』的典范:要重训,换来 56.9 倍而不是 16 倍。
这两条路今天还并存 —— 等会儿讲稀疏的时候,它们会再出现一次。」
【右栏 · 为什么 RoPE 必须单独走一路】约 2.5 分钟。 ⛔ 讲义原话:「这是最容易讲糊的一步。」
⭐⭐ 讲糊的原因是上来就讲 RoPE。正确顺序是:先讲「本来能做成什么」, 再讲「RoPE 把它破坏了」。照图上 ①②③ 走:
⭐⭐ 2026-09-14 改版:这一格重画了,而且是故意跟 §5.4b 用同一套画法 —— 那块紫色的 W_UK 方块两处是同一块。 这一格只多一样东西:一道闸。 所以讲的时候先指那块紫方块,别先念公式。
「① 先看没有 RoPE 的情况。」
手点着紫方块,往左一划:
「MLA 想做的事就这一个动作 —— 把这块紫的搬到 q 那一侧去。
搬过去之后,仓库里那些压缩包一个都不用拆。
写成式子是 qᵀ(W_UK c) 变成 (W_UKᵀq)ᵀc,
但记住动作就够了,式子等 5.4b 再细看。」
「② 现在把 RoPE 插进来。」
指第二行那个画着横杠的红框:
「它在 q 和紫块中间立了一道闸。紫块想搬 —— 搬不过去。
搬不过去,W_UK c 就只能在仓库里先算出来,
那等于又存了一份没压缩的 K。MLA 白压了。」
⭐⭐⭐ 这里有一层可以多讲三十秒,讲完这节的分量就不一样了 —— 台下总有人会想「不就是中间多个矩阵吗,乘进去不就完了」。 他想得没错,所以得正面回答他。
指黄框,左右各一堆牌 —— 这一格靠的是「一块」和「一摞」两个形状, 不靠念字:「有人会说:中间多一块矩阵怕什么,乘进去就是了。」
先指左边那一块:「对。如果那块是固定的,真就乘进去完事了
—— 三个矩阵乘成一个,跟 ① 没有任何区别。」
再指右边那一摞:「可 RoPE 是相对的。第 t 个词看第 j 个词,
中间那块转多少度,是按 j 减 t 来的 ——
每一对词,都是一块不一样的。」
⏸ 停一秒,把手按在那一摞上:「所以它不是一个矩阵,是一摞。 你要预乘,得预乘出一整套 —— 有多少种距离,就有多少块。 预乘不出『那一个』,因为根本不存在那一个。」
⛔ 顺手把论文那句话摆正:「论文写的是『矩阵乘法不满足交换律』。 那是结论 —— 吸收这一步要的其实是结合律,而结合律一直成立。 真正预乘不出来的,是 R 身上那个下标。」
「③ 所以 MLA 的解法是把一条轨劈成两条,
让那道闸只站在其中一条上:」
指最后那两行:「上面这条 512 维,不带位置 ——
闸不在这儿,紫块照旧搬走。下面这条 64 维,专扛位置 ——
不吸收,老实存着。
576 = 512 + 64。」
⛔ 补一句堵误会:「注意这不是把 RoPE 关小了 ——
位置信息一点没少,只是被赶到一条窄轨上,好让宽的那条保住刚才那个搬家动作。」
⭐⭐ 然后把它抬成套路,别让它停在 MLA 的实现细节上: 「为了保住某个代数变换,把功能拆成两路 —— 这个动作后面还会换面貌出现:V4 的部分 RoPE、K3 的 NoPE。 值得当成一个套路记住。」
【5.4b · 回头把「吸收」坐实】约 2 分钟。⭐ 刚才 ① 里那句
qᵀ(W_UK c) = (W_UKᵀ q)ᵀ c 是一带而过的 ——
它是 MLA 能不能真省下来的前提,值得停一下。跟着 fig3-absorb 的三格走。
⭐ 先把台下那个疑问替他们问出来: 「压成 576 维存着,听着很美。可生成下一个词的时候, 不还是得把它们拆回来才能比对吗? —— 而且拆完还不能留,留下来就等于又存了一份没压缩的 K。 那不就白压了?」
指 ① 格:「论文的原话就是这个意思:
must recompute the keys for all the prefix tokens
—— 每生成一个词,把缓存里全部 token 重拆一遍。」
⭐⭐ 转折只用一句,这句是全段的题眼:
「不用拆。把括号挪一下就行。」(指 ② 格那行式子)
「左边括号在 c 那侧 —— 缓存里有几个包就算几次。
右边括号在 q 那侧 —— 一步只有一个 q,所以只算一次,
而包一个都不用拆。」
🏠 生活版说完停一下,这是他们会记住的那句: 「与其把一万本外文书全翻译过来,不如把你的搜索词翻译过去。」
⭐ 省多少 —— 这里要主动打掉一个直觉,别让他们自己算错(指 ③ 格):
「直觉会说『解压从 S 次变成 1 次,那就省 S 倍』。不对。
吸收之后每个 token 的点积从 128 维变成 512 维,这一头贵了 4 倍,
在把省下的吃回去。
两笔加起来,省的倍数有个上限 —— 而这个上限正好是每头维度 128。
S 再长也过不去。」
⭐⭐ 最后给它起个名字,台下会当场记住:
「所以 MLA 这一节真正的两条定律是:
结合律允许你挪括号,交换律不许你换顺序。
能吸收,靠的是前一条;RoPE 把它挡住,靠的是后一条
—— 那个 R 夹在中间,挪不出去。刚才 ②③ 两格讲的就是这件事。」
⚠️ 作用域要说,别让人以为 prefill 也这么省: 「吸收只在 decode 用得上 —— prefill 时一批里有很多个 q, 『只变换一次』这个便宜就没了。这正是开头那张表里『压缩不生效』那一行的意思。」
【三条必须说的限定】约 1 分钟,图的落点带上都有,指着念。
① MLA 的代价是用计算换显存 —— 多了一对降维/升维矩阵乘。
② ⛔ MLA 省的是推理时的 KV cache,不是训练时的激活
—— 训练前向里 K/V 会被解压出来算。这是个非常常见的误解,要主动说。
③ Gated MLA 一个字节的 KV 都不省 ——
它让模型能学会「这一层这个位置,注意力的输出干脆不要」。
放在旋钮 ① 里只是因为它改的是 MLA 这一支的形状。
【5.4c · 那条窄轨,功劳到底记给谁】约 3 分钟。 ⭐ 这一格是 §五 唯一一次谈「质量」,前面全在谈字节。
⭐⭐ 开口前先把立场摆正,别让人听成「MLA 不行」。 这一格说的是功劳的排序,不是否定 MLA —— 同一张表里 MLA 仍然是最好的几档之一。 ⛔ 讲砸的典型说法是「原来低秩没用啊」,那是听反了。
① 先提那个学生一定会问的问题:「咱们这一节从头到尾在算能省多少字节 —— 4.571、12.4、56.9 倍、一张卡换 64 个人。那我压这么狠, 模型会不会变笨?这个问题我到现在一次都没回答过。」
② 手放在紫色那条虚线上:「这是 MLA 的水位。现在看这三级台阶 —— 它们的 KV Cache 一模一样,全是 512,一个字节都没多花。」 ⭐ 先把「代价不变」说死,再往下走,不然后面的台阶就没有意义。
③ 一级一级往下走,每级只报「改了什么」:
「第一步,只把 head_dims 从 128 放宽到 256 —— 掉 0.030。
第二步,把这 256 拆成 192 加 64,只给那 64 维加 RoPE —— 再掉 0.009。」
⭐ 停在第二级,让台下自己看见它已经在紫线下面了。别急着报数字。
④ 这时候再回头翻自己前面的话:「§5.3 我讲那条 64 维窄轨的时候,
用的词是『被赶到一条窄轨上』—— 我把它当成被代数逼出来的妥协。
可这组实验说的是反话:那一拆,本身就是在涨分。」
原作者的原话是 —— 「看似无奈的设计,极有可能是它效果优异的关键原因」。
⑤ 面板② 一句话带过:「反过来看另一头:MHA 拿 7 倍的 KV Cache, 换回来的 loss 跟 MLA 一模一样 —— 一分没赚。」
⑥ ⛔ 面板③ 不许跳。台下但凡有做实验的,第一反应就是 「宽的那档参数量本来就多」。「作者自己也想到了 —— 把窄的那档头数翻倍, 两边都是 943 M,还是宽的赢 0.003。」
⚠️ 两条限定,念完再走: 「一,这是 900M 的小模型、16B token 的消融, 方向可以信,幅度别往 671B 上搬。 二,这不推翻前面那笔 56.9× 的账 —— 那笔账管『存多少』, 这一格管『同样存这么多、学得多好』,是两件事。」
⭐ 如果时间紧,这一格可以压成三句: 「同样的 KV Cache,把头放宽、再拆一小段给 RoPE,loss 就掉到 MLA 以下了。 而这两样都不是低秩。所以 MLA 好,功劳大概率不在那个 512 维瓶颈上。」
⭐ 段尾钩子:「旋钮 ① 让每一份更小。 下一节是旋钮 ② —— KV 照存,但每步只读一部分。 两个旋钮省的是同一样东西的两面,而且可以叠加。」
讲稿 · 6 旋钮②:每步只读一部分
🎙 逐字稿 —— §六 旋钮②(可以直接照着念)
【§六 · 旋钮②:KV 照存,但每步只读一部分】⏱ 约 6 分钟。整节跟着 fig3-knob2 走 —— 五张 mask 从左往右念过去就是讲稿,不要另起炉灶。
滚到 fig3-knob2,先不说话,让五张图在屏幕上停两拍。「上一个旋钮拧的是每一份多大。这一个换了个方向 —— 每一份照样存,但我每一步只去读其中一小部分。」
⭐ 先要形状,再要名字。指着五张 mask 从左往右: 「全看 → 砍成一条带 → 带子再补回最左边一列 → 不给固定形状、让模型自己挑 → 挑之前先把历史压一遍。」然后才把名字贴上去:SWA / +sink / NSA·DSA / CSA+HCA。 ⛔ 反过来先报名字,五个名词会糊成一片。
【三条路的共同结构】指图中间那条带子: 「不管哪家,拆开都是同三件事 —— 粗看一遍全局、细看挑出来的几块、近处永远保留。 差别只在这三份各占多少、以及谁来决定『挑哪几块』。」
⭐⭐ 这是这一节真正要留下的东西,说慢一点: 「看到一个新的稀疏注意力,别问它叫什么,问它这三份怎么分。」【新增 · 滑窗的完整故事】⏱ 跟着 fig3-swa-why 走。
⭐⭐ 这一段按时间顺序讲:先有办法,再出事故,最后才找到原因。
⛔ 别先讲 attention sink 是什么 —— 那样就把悬念提前拆了,
而这个故事的全部魅力就在那个悬念上。
① 凭什么敢砍。「滑窗听起来很暴力:每个 token 只让它看最近的 W 个。 可它凭什么敢?—— 因为下一层看的是上一层的输出。 第一层我只看到身边 W 个;第二层我看到的那 W 个,每一个自己又看过它身边的 W 个。 递归下去,k 层之后,信息最远能走 k 乘以 W。」
⭐ 给个具体的数,学员才有感觉: 「Mistral 7B:窗口 4096,32 层 —— 乘出来是十三万一千零七十二。 所以一个只看四千的模型,理论上够得着十三万。」⭐ 熟悉 CNN 的人这里会笑一下 —— 这就是感受野,一模一样的道理。 ⚠️ 紧接着就要把它压回去,别让人当真: 「注意这是理论射程,不是有效射程。信息每跨一层只挪一格窗口, 而且一路被后面的信息稀释。滑窗真正做到的是 —— 把远处从『看不见』变成了『看得见但很模糊』。」
⭐ 这句话正好解释了后面为什么还要加一条「挑着看」的路。 指第二格。这里放慢,念数字。
② 然后就出事了。「Llama-2-13B,一本书。纯窗口,缓存 1024 —— 困惑度 五千一百五十八。这不是变差,这是废了。」
「然后有人试了一下:什么都不改,只把最前面四个 token 留着不扔。 困惑度 五点四。」
⏸ 停死。让这两个数在屏幕上待两拍。 ⭐ 这是全课最震撼的数字对比之一,不要急着解释。⭐⭐ 然后给判决性实验,这一步最漂亮: 「你可能会想:那四个 token 一定很重要吧?文章开头嘛。 —— 他们把那四个 token 换成了四个换行符。困惑度 五点六。」
⭐⭐ 落点,说慢: 「几乎一样。所以起作用的不是那四个 token 的意思,是那四个位置。」再补一句量化的结论:「留一个不太够,留两个好一些,留四个就到头了,留八个没有更好。」 指第三格。揭晓原因。
③ 为什么会有这么个东西。 「原因在 softmax 身上。softmax 要求一行加起来等于 1。 可是一个 query 常常『没什么特别想看的』—— 它自己那点信息就够预测下一个词了。 但规矩摆在那儿,多出来的那部分权重总得放在某个地方。」
「那放哪儿呢?—— 放在所有人都够得着的地方。 因为是自回归,最前面那几个 token 对所有后续位置都可见,全场只有它们人人可达。 于是模型就把它们训成了一个停车位。」
⭐ 两个更彻底的解法各一句,别展开: 「一,预训练的时候专门加一个可学的 sink token —— 有了专用车位,一个就够。 二,干脆换个 softmax:分母上加个 1,允许这一行什么都不看。」 ⭐⭐ 段尾把它抬成判据 —— 这比 sink 本身值钱得多: 「attention sink 不是 bug,也不是谁设计的特性, 它是归一化约束逼出来的副产品。 以后你在模型里看到一个『毫无道理却极其稳定』的现象, 先去找是不是某个守恒或者归一化约束逼出来的 —— 量化里那批总也压不下去的 outlier,跟这是同一件事。」 ⛔ 最后一句,是这门课自己的方法论,一定要说: 「这个 bug 从公式上完全看不出来。是有人把注意力矩阵画出来, 看见最左边永远有一道亮条,才发现的。 —— 今天你们看到的这一整套图,都是这个道理。」 ⭐ attention sink 的完整故事在上面 fig3-swa-why 那一段已经讲过了 —— 这里不要再讲第二遍。 指右下角那笔 2% 的账。「GQA-8、一百万上下文,KV cache 244 GiB。走完这一支, 每步真正要读的降到百分之几 —— 省的不是显存,是每一步的搬运量。 这两件事经常被混着说,今天分清楚:旋钮①省的是存下来的,旋钮②省的是读上去的。」
⭐⭐ 【6.1c · 那张弃权票有什么用】⏱ 90 秒,跟着 fig3-overmix 走。 ⛔ 这一段是刚才那个比喻的后半句,缺了它,前半句会被记成「sink 是个病」。
⭐ 先设问:「刚才说 softmax 不许弃权,模型就自己造了个弃权用的候选人。 那我问一句 —— 这张弃权票有什么用? 如果它纯粹是个副作用,StreamingLLM 特意把它留着,就只是在打补丁。 —— 不是的。」
指两张网格,只让他们看最后一行:
「同一句话、同一个扰动、同样四层。右边只多了一个 sink。
左边最后一行 —— 旁观的三个词被推动得跟当事人一样多,整句话都被污染了。
右边只有四分之一。红墨水被困在原地了。」
⭐⭐ 机制要讲两半,第二半台下一定想不到:
「① 吸得多 —— Llama 405B 里将近 80% 的注意力落在第一个 token 上。
② 吐得少 —— 而它的 value 几乎是零。
吸走的那一大块,不带任何内容回来。」
⛔ 这里要主动堵一句:「只讲第一半是讲不通的 ——
如果它吸走的注意力照样带内容回来,那信息一样会混,只是换了条路。」
⭐ 落点一句,这句是要他们带走的: 「所以 StreamingLLM 砍掉开头几个 token 模型就崩 —— 不是丢了信息,是刹车没了。 那几个 token 本来就没什么内容,这正是它们能当 sink 的原因。」
⚠️ 两个 80% 别说串:「80% 的注意力落在第一个 token 上」 跟「80% 的注意力头形成强 sink」是两回事,数字一样、含义毫不相干。
【新增 · 凭什么只看 2048 个就够】⏱ 跟着 fig3-dsa-why 走。
⛔ 开场先把三个问题拆开,否则这一段一定会讲成一锅粥:
「① 能不能只看一小部分?② 怎么知道该看谁?③ 那个判断本身要不要钱?
这是三个不同的问题,DSA 真正解决的是第二个。」
① 这个是经验事实,而且早于 DSA。 「2023 年 H2O 那篇文章量了一批密集训出来的模型,发现推理的时候, 注意力矩阵九成五以上是稀疏的;而且累计注意力分数服从幂律 —— 就是图里这个形状:前面几根柱子吃掉大半,后面一条长尾每个都接近零。」
⭐ 用大白话把幂律翻译一遍(这句比术语管用): 「你正在写的这一句话,跟三万字之前那一段,大概率没什么关系。 真正跟它有关的,来来回回就那么几处。」「DSA 取的 k 是 2048。128K 上下文下,这是百分之一点六。」
指第二格。这是这一段的重心。⭐⭐ 先把难点摆出来,别直接给答案: 「问题来了 —— 你怎么知道该看哪 2048 个? 要判断谁重要,你得先算出注意力分数; 可注意力分数正是你想省掉的那个东西。这是个鸡生蛋。」
⏸ 停一拍,让这个矛盾立住,再给 DSA 的答案: 「DSA 没有去设计一个启发式来猜。它让真注意力自己当老师。」「具体就四步。热身阶段:注意力照样是密集的,整个模型冻住, 只训那个索引器。造一个目标:把主注意力的分数跨所有头加起来、归一化, 这就是『真答案』。损失:让索引器的分布去逼近它,一个 KL 就完了。 代价:一千步、二十一亿个 token —— 然后就可以开稀疏了。」
⭐⭐ 这一段真正要留下的是这条套路,说慢一点: 「要省掉一个贵的东西,先让它自己说出答案,再训一个便宜的去复制那个答案。」⛔ 别让它停在 DSA 上:推理优化里这个套路到处都是, 投机解码的小模型、各种 router、各种 early exit,骨子里都是这一招。 指第三格。⏱ 一分钟,快走。
「这个复制品便宜在三处:头很少、用 ReLU 不用 softmax、跑在 FP8 上。 ReLU 这个选择,论文自己说了就是为吞吐。」
⭐ 两个设计决策值得各说一句: 「一是梯度断开 —— 索引器只由那个 KL 训,主模型只由语言建模 loss 训。 别让『该看谁』这个信号去污染主模型的表示。 二是进入稀疏阶段以后,KL 只在选中的那批上算 —— 它已经不需要对全序列排序了,只要在自己挑出来的那批里排对。」
⭐ 最后那条硬约束,是全课落点的一个具体例子: 「DSA 必须搭在 MQA 模式的 MLA 上。因为在 kernel 那一层, 一条 KV 必须被多个 query 共享,稀疏读取才划算。 也就是说 —— 旋钮①和旋钮②,在这里是被硬件绑在一起的。」 ⛔ 2048 这个数,一定会有人追问「为什么是它」—— 老实回答: 「论文没给 k 的消融。我能说的只有三件事: 一,128K 下它占 1.6%;二,H2O 量到的稀疏度是 95%, 而 1.6% 比那还狠,所以它靠的是挑得准,不是挑得多; 三,历史不足 2048 的时候,top-2048 就是全选 —— 所以短上下文下 DSA 就是普通 MLA,稀疏只在长上下文才启动。」⭐ 第三条是从定义直接推出来的,不是引用 —— 讲的时候就这么说。 ⭐ 顺手把暗线第三次点出来: 「H2O 是事后的 —— 一个驱逐策略,不改训练。 DSA 是从头的 —— 九千四百多亿 token 的继续训练。 今天这已经是第三次了:Eigen Attention 对 MLA、GQA 对 MLA、H2O 对 DSA。」
【新增 · NSA 的三条路是被什么逼出来的】⏱ 跟着 fig3-nsa-why 走。
⭐ 这一张的讲法跟别的不一样:先讲坑,再讲路。
因为论文自己就是这么写的 —— §2 整节在拆前人的坑,§3 的每条分支都对着一个坑。
⭐⭐ 开场一句立住框架: 「NSA 那三条分支,不是谁坐下来设计出来的,是被四个坑逼出来的。」
指第一格,四个坑一条一条念,别跳。「坑一,省了计算,没省时间 —— 有些方法在解码的时候是稀疏的, 可 prefill 阶段还得先把注意力图算出来、把索引建好。总账没省。」
「坑二,离散操作把梯度断了 —— 用 k-means 聚类、用 SimHash 去挑, 这些动作不可导。模型永远学不到『我该怎么挑』,只能被动接受别人挑好的。」
「坑三,按 token 选,访存就不连续 —— 你要从 KV cache 里捞一个个散落的 token,FlashAttention 那套连续块访问就用不上了, 直接掉回低利用率。」
⭐⭐ 坑四最值得停一下,它也最容易被忽略: 「在 GQA 模型上,每个头各选各的 —— 看着很稀疏。 但一组里的头共用同一份 KV,真正要搬进来的是这一组所有头选择的并集。 于是:计算稀疏了,访存没稀疏。」 指第二格。「于是三条路就出来了。压缩:把连续的块用一个可学的 MLP 压成一个 key, 负责粗看一遍全局。选择:细看要紧的几块 —— 注意,是按块选,不是按 token 选, 这是坑三逼的;而且组内共享选择,这是坑四逼的。 滑窗:近处的一段原样保留。」
⭐ 「三条路并行跑,最后用一个门加权合起来。那个门是一个小 MLP 加 sigmoid —— 配比是学出来的,不是写死的三分之一。」
⭐⭐ 这一格的落点,也是整张图最值钱的一句: 「计算稀疏,不等于访存稀疏。」然后给用法:「以后看任何一篇讲稀疏的文章,先问一句 —— 它省的是 FLOPs 还是字节?省 FLOPs 很容易,省字节才算数。」 指第三格。⏱ 一分钟。
「native 到底 native 在哪?论文的论点其实就一句: 事后加稀疏,等于把模型推离它的预训练轨迹。 尤其是那些靠全局检索的头,最先被剪坏。」
⚠️ 这里有一处口径打架,一定要如实讲,别只挑对自己有利的那个: 「刚才 H2O 说『95% 稀疏、5% 的 KV 就够』; 而 NSA 引的另一篇说『top 20% 的注意力只覆盖 70% 的分数』。 这两个数方向一致,程度打架。」⭐ 给学员的结论:「别把任何一个当普适常数 —— 稀疏度随模型、层、上下文长度变。 真要用,自己在自己的模型上量一遍。」 ⛔ 这句比那两个数字本身重要得多。
「实证那一行也念一下:27B 的底座、2600 亿 token 预训练, 通用、长文、推理三类上持平或超过全注意力;64K 长度下解码、前向、反向三段都更快。」
⭐ 暗线第四次,这次可以升格成结论了: 「NSA 的 N 就是 Natively trainable。今天这个对立已经出现四次了 —— 凡是要改注意力形状的改动,事后做都便宜,但天花板明显更低; 要拿到上限,就得把约束写进训练。」 回到正文那张训练期 / 推理期的表。这张表是这一节唯一该用表讲的东西。「NSA 那个 native —— 训练的时候就这么稀疏,不是训练完再加的开关。 模型知道自己会被稀疏,权重就是在这个条件下学出来的,所以掉点小得多, 连反向都省了六倍。代价是没法给已有模型打补丁。」
⭐ 这张表顺手回答一个学员肯定会有的疑问,主动说出来: 「这就是为什么这些新注意力总是跟着新模型一起发布, 而不是变成推理框架里的一个开关。」【新增 · CSA 压的是 token 不是头】⏱ 跟着 fig3-csa-why 走。
⛔ 这一段一开口就要先校正一个非常常见的口误, 而且要说得温和 —— 因为犯这个错说明人家在认真想:「很多人第一反应是『CSA 把四个头压成一个』。不是头,是 token。 它是横着压的。」 滚到 fig3-csa-why 第一格,指那张小矩阵。
⭐⭐ 这个口误其实指向这一节最该留下的东西: 「你看这张表:一行是一个 token,一行里的格子是它的表示。 那么压缩就有两个完全不同的方向 —— 竖着压,是让每个 token 少存几个数,那是旋钮①,MQA、GQA、MLA 干的事; 横着压,是把连着的好几行合成一行,那才是 CSA 和 HCA。 再加上第三件事:这一步到底读哪几行 —— 那是旋钮②的稀疏。」
⭐⭐ 落点,说慢一点: 「这三个是三个轴,互不相干,所以可以同时拧。 DeepSeek-V4 就是三个一起拧的:MLA + 横着压 + 稀疏挑选。」然后给提问法:「以后拿到任何一个新方案,先问它动了哪几个轴。」 ⛔ 别把它们当三个竞品。 指第二格。⏱ 一分钟。
「CSA 三步。第一步,每 m 个 token 压成一条 —— 注意不是简单平均:两组 KV 各配一组可学的权重,softmax 归一之后加权合并, 而且窗口是重叠的。第二步,在压缩后的条目上跑 DSA,挑 top-k —— 挑的是压缩条目,不是原始 token,所以索引器要打分的对象一下子少了 m 倍。 第三步,再并上一小段滑窗,把近处的细节补回来。」
⭐ 这一格的落点: 「两个省法是相乘的 —— 压 m 倍,再只读 k 条。这就是它敢做一百万上下文的原因。」顺手回扣:「你看『近处永远保留』又出现了 —— NSA 有,CSA 也有。 这一支的共同结构,三次都对得上。」 指第三格。这是回答「HCA 图啥」的地方。
「HCA 很怪:它压得比 CSA 狠得多,每 m′ 个 token 才留一条,m′ 远大于 m; 但它不挑,全看。」
⏸ 停一拍,把问题抛给台下: 「压得那么狠,还不挑,那它到底图什么?」⭐ 等两秒再给答案 —— 「看它们各自是怎么坏的。」
⭐⭐ 「CSA 压得轻、要挑:被选中的那几块看得很细,
可没被选中的它完全看不见 —— 它会漏。
HCA 压得狠、不挑:一个位置都不漏,
可每个位置只剩一个很糙的摘要 —— 它粗。」
📌 ⛔ 一定要交代口径:「这个解释是我从两者的定义推出来的, 论文只说了采用交错混合配置,没给这个理由。」 ⭐ 说这一句不会减分,反而会让前面那些引用更可信。
「成绩:一百万上下文下,V4-Pro 只要 V3.2 的 27% 的单 token 推理 FLOPs、 10% 的 KV cache。」
⭐ 顺手让学员自己读出一个结论 —— 这种收尾比直接告诉他有效: 「注意这两个数不一样:算力省到 27%,显存省到 10%。 为什么显存省得更多?—— 因为横着压主要省的是存储,稀疏主要省的是计算。」 滚到 6.5b。⏱ 这一小段一分钟,但不要跳 —— 它是这一支的第二阶段。「前面四个方案有个共同零件:一个决定『该看哪几块』的索引器。 主体的账省掉之后,这个零件自己的开销浮上来了 —— 它要为每一层、每一个 token 跟几万个历史块打一次分。 2026 年年中两家几乎同时给出同一个答案:别每层都重算一遍该看谁。 GLM-5.2 叫 IndexShare,混元叫 IndexCache,做法一样 —— 每四层共用一个索引器。」
⭐ 证据不用查博客,打开 config 就看见: 指indexer_types 那串 full / shared 的循环,
再点一下 GLM-5.2 那个 index_topk_freq: 4 —— 那个 4 是写在配置里的。
⛔ 代价必须自己说出来,别等人问:
「四层共用一个索引器,就意味着这四层被迫看同一批块 —— 这是表达力上的让步。
两家都只报了省下的 FLOPs,没报这一项的质量代价。」📌 同时交代口径:这句是从机制推出来的,不是引用。 ⭐ 顺手给尺子:「看到『降 2.9 倍』这种数字,先找它换走了什么。」
⭐⭐ 段尾要抬起来 —— 这一段的价值不在稀疏: 「注意这里发生了什么:一个优化,制造出了新的被优化对象。 索引器本来只是稀疏方案的附属零件,省成了主体,它就成了新的大头。 三个旋钮都会走到这一步。」
⭐ 过渡到 §七:「旋钮①把每一份变小,旋钮②每步只读一部分 —— 但两者都还留着一份随长度增长的 KV。 下一节是第三个旋钮:干脆不要这份 KV,换回一个固定大小的状态。」
讲稿 · 7 线性注意力:一块固定大小的记事板
⛔ 这个比喻是现场给的,而且现场说它「对理解非常重要」—— 别把它当成一个可有可无的类比,它是这一节的主结构。
⭐ 开场就把比喻摆出来,一句话三代: 「想象一块固定大小的记事板。你可以疯狂往里写,后写的盖住先写的; 也可以先把要写的那个位置擦干净,再写; 还可以挑着擦 —— 哪些该留、哪些该擦,让模型自己学。 这三种写法,就是这一支的三代。」
指第一格,先说清「板子」是什么。「板子就是那个状态,一块 d 乘 d 的东西,大小固定,不随序列变长而变大。 写,就是把一对 key 和 value 的关联记上去;读,就是拿 query 去查。」
⭐⭐ 然后给出板子的物理上限 —— 这一句让比喻从「形象」变成「能算」: 「你一共写了 L 条,可板子只有 d 个方向。 L 一旦超过 d,就一定有东西被盖掉。论文里管这个叫 key 撞车。」 指第二格。这是这一节的核心,三代逐条钉到式子上。「第一代,疯狂往里写:S 加上 v 乘 k 转置,就完了。谁也不擦。 结果就是互相干扰 —— 刚才那个 L 大于 d 说的就是它。」
⭐⭐ 「第二代,先叉掉再写。看这个式子:
S 乘上 (I 减 β k k 转置),再加上 β v k 转置。
那个括号里的东西,就是『叉掉』。
它干的事是:在 k 这一个方向上,把板子上已有的内容按比例擦掉,然后再写新的。」
「第三代,选择性地叉:再加一个学出来的门, 擦多少、擦哪几个通道,由门决定。这就是 Gated DeltaNet 和 KDA 那一支。」
⭐⭐ 【7.0b · 把 GDN 和 KDA 分开说】⏱ 90 秒,跟着 fig3-erase 走。 ⛔ 上面那句把两者说成「一那一支」—— 它们差一处,而那一处正好能讲清「通道」是什么。
先用一句对仗把整支收住(指 ② 那五行,只让他们看颜色): 「decay 会忘但不会改,delta rule 会改但不会忘。 —— 五格一起变淡的,是会忘不会改;单格被掏空的,是会改不会忘; 又淡又掏的,就是 Gated DeltaNet。」
🏠 然后讲 KDA 差的那一处,这个比喻说完停一下:
「KDA 只改了一件事 —— 调光器从一个总开关,变成每个灯泡一个。
为什么要分开调?『你现在在写哪门编程语言』这条该留很久;
『刚离开的那个函数里的变量名』可以马上忘掉。
—— 一个总开关做不到这件事。」
⚠️ ⛔ 接着必须自己拆一下台,别让抽屉这个画面留下错觉:
「不过我得说破一件事:真实的『地址』不是一格一格的抽屉,是连续的方向。
所以擦的时候会顺带擦到相近的地址 ——
『定点擦』是个近似,不是真的只动一格。板子越满,擦得越串。」
⭐ 顺手回指 1.3b:「这就是前面那张图算过的账 ——
128 维里塞一万个方向,最挤的一对还差 60 度。『差不多不像』的代价,
在这里就变成『擦串了』。」
⭐⭐ 最后给板子会坏这件事配一软一硬两句,软的那句他们会记住:
「硬的是:d 维空间里最多只能有 d 个互相正交的方向。
软的是一句我很喜欢的话 —— 『记忆的敌人不是时间,是别的记忆。』
你忘掉一个电话号码,不是因为时间久,是因为你又记了新的。」
📌 出处要带上:那句是 Eagleman《Livewired》里的,Songlin Yang 讲 DeltaNet 时引过。
⭐⭐ 「那个式子还有个更深的读法。S 乘 k 是『按这个 key,板子现在能取出什么』; v 是『本来该取出什么』。按两者的差去改板子 —— 这不就是一步梯度下降吗?β 就是学习率。」
⭐⭐ 落点,慢: 「所以在这一支里,状态已经不是一个缓存了,它是一个边跑边被训练的小模型。 损失是 ½‖S k − v‖²,每来一个 token 训一步。」⭐ 这句话讲完,台下对线性注意力的印象会从「一个省内存的近似」 变成「一个完全不同的东西」—— 而那正是 7.3 要说的。 ⚠️ 代价也要当场说,别留到后面: 「先擦再写是串行的 —— 纯加法的各项互不依赖、可以一起算, 而擦这个动作依赖前一步的板子。论文自己的说法是: 表达力和并行度之间有一个根本的权衡。」
⭐ 这句直接接到 7.4 的 chunk 化。 ⛔ 最后纠一个学员一定会有的误解: 「别把板子想成一个装 token 的盒子。板子上存的不是 token,是『键到值』的映射。 所以『装不下』不是『条数超了』,是不同的键在同一个方向上互相覆盖。」 ⭐ 2026-09-13 新增:滚到 7.2,fig3-at-gallery。⏱ 约 4 分钟。 ⛔ 这一格原来是三张表 —— 现在是八个矩阵并排。讲法也要跟着换:指形状,别念名字。
⭐⭐ 开场一句把整格收住: 「上面讲的这些名字 —— 线性注意力、RetNet、Mamba、DeltaNet、GDN、KDA —— 它们长成同一个递推:S 等于 A 乘上一步的 S,再加 v k 转置。 区别只有一处:允许 A 长什么样。」
⛔ 然后就指图,一个一个指过去,别念表格: 「第一个,A 是单位阵 —— 什么都不做,只加不减。 第二个,对角线上挂个衰减 —— 陈年旧事自己淡出。 第三个 Mamba,还是对角,但那个衰减看输入。 第四个 Mamba-2 —— 注意,它往回退了。」 ⭐⭐ Mamba-2 那一格要停,它是这张图最好的故事: 「它把 A 退成最简单的『一个标量乘单位阵』。为什么要退? —— 正因为退了,才证得出它跟线性注意力是对偶的, 才能把递推写成矩阵乘、吃上 Tensor Core。 那篇论文的标题就叫《Transformers are SSMs》。」「下面一排是另一条路:单位阵减一个秩一的东西 —— 这就是刚才那块记事板上的『叉掉』。 GDN 在它前面乘一个门;KDA 把那个门从标量升成逐通道 —— 不同的特征维度,各有各的遗忘速度。」
⭐ 举个具体例子让「逐通道」落地: 「有些通道记语法,该快忘;有些记实体名字,该慢忘。 一个标量门做不到这件事。」 指最后那一格 —— 红色的那个。⭐⭐ 「最后一格是个反例:如果允许 A 是任意矩阵呢?表达力最强。 可是没有高效的并行扫描 —— 并行度直接归零。 所以它根本不在候选名单里。」
⭐⭐ 整格的落点,说慢: 「所以这张图不是一个『表达力越来越强』的单调故事。 每一步都在『A 能多复杂』和『还算不算得动』之间重新划一次线。 —— 表达力和可算性是一起设计的,不是先设计再优化。」⭐ KDA 那个 DPLR 特化就是最好的注脚:它不是先做一个强的再去优化, 是一边看着能不能算得动,一边设计。 ⭐ 顺手回答一个必问的问题: 「那 Mamba 呢?—— 它不是另一支,是这一支的祖宗。 证据不用推:Gated DeltaNet 那篇论文的标题就叫 《Improving Mamba2 with Delta Rule》,而千问用的就是 GDN。」 ⭐⭐ 2026-09-14 新增:滚到 7.2c,fig3-duality。⏱ 约 3 分钟。 ⛔ 上一格你刚说完「正因为退了才证得出对偶」—— 台下这会儿正等着「对偶是什么」。这一格就是还这笔账。 别跳过去,跳过去那个词就白抛了。
⭐⭐ 开场把欠条亮出来: 「我刚才甩了一个词叫对偶,还没解释。现在解释 —— 而且它不是一个术语,是一个很实用的读论文技巧。」
指第一格,左边那排 S。「左边是我们 7.1 讲的读法:一步一个状态, S 等于 A 乘上一步的 S,再加 v k 转置。这个读法的特点是 —— 它必须按顺序走,但每一步只碰一个小矩阵,代价跟句长成正比。」
指右边那张蓝色的下三角。「右边是完全不提 A 的另一种写法: 把整条序列的 Q 乘 K 转置摆出来, 再逐格乘上一张下三角的表,这张表叫 L; 然后一次矩阵乘就出结果。这个读法一眼全算完、天然并行, 但那张表是 L 乘 L 的,句子长一倍它大四倍。」
⭐⭐ 中间那个等号要停一下,这是整格的落点: 「注意中间这个等号 —— 不是近似,不是打比方,是逐元素相等。 Mamba-2 论文的原话:把那个矩阵摆出来做一次二次型乘法, 『is exactly the same as quadratic masked kernel attention』。」⭐ 想更硬气一点可以补一句:「这张图的脚本里,我用 numpy 把两条路 各算了一遍,断言逐元素相等 —— 所以那个等号是验过的,不是画上去的。」 ⭐ 紧接着把它跟本讲的暗线接上: 「两种读法差在哪?只差在先算哪一步。 Mamba-2 管这个叫 a different contraction ordering —— 翻成人话就是我们从第五节起一直在说的『换括号』。」 指第二格,四张小矩阵。
⭐⭐ 「这个骨架立起来之后,有件事就特别清楚了:
M 等于 Q K 转置逐格乘 L,你能换的从来只有 L。
全 1 的下三角 —— 线性注意力。
换成 γ 的 t 减 s 次方 —— RetNet。
换成每一步一个 a 连乘 —— Mamba-2。
再换成每个通道各有一张 —— 就是 GLA、GDN、KDA 那一支。」
⭐ 「最后记一个数就行,等一下 7.4 要用: 半可分矩阵的定义是 —— 对角线及以下的任意一块子矩阵,秩不超过 N; 而这个 N 就是状态维度。 一会儿你会看到块间那一整块被画成一根竖条 —— 那根竖条的高度就是这里的 N。」
⭐⭐ 2026-09-14 新增:7.4 现在是两半。先讲 fig3-two-brackets (凭什么能分块,⏱ 约 3 分钟),再讲 fig3-chunkwise(硬件上怎么排)。 ⛔ 顺序别倒 —— 台下这会儿只知道「要分块」,不知道「凭什么能分」。⭐⭐ 开场先把欠条亮出来,这一段的动力全在这句: 「我们前面说过两遍了:换括号能把平方变成线性; 可是因果 mask 把这个换括号挡住了。 然后我又说『所以真实实现是分块』—— 凭什么? 切成小块,mask 不还在里面吗?」
指第一格,那张没切块的 12×12。「先看不分块。左边这一整张就是 (Q Kᵀ) ⊙ M —— 要算它,必须把整张 12×12 摆出来;句子长一倍,这张表大四倍,这就是二次。 右边那条路 Q (Kᵀ V),中间只有 d×d,跟句子多长完全无关。 但你看那个 ⊙ M 卡在中间 —— 括号一挪,这个逐元素乘就无处安放。」
⚠️ 这里有一句必须补,否则就讲过头了: 「Mamba-2 的作者原话是『once the L mask is incorporated, we can no longer directly apply matrix associativity』—— 但同一段他紧接着写了:被挡住的是「结合律」这个特例,不是「重排」本身。 结合律只是张量缩并顺序的一个特例;换成更一般的缩并顺序,mask 是能被吸收进去的。 所以准确的说法是:分块是通常实现走的那条路,不是数学上的唯一解。」⭐ 这跟本讲反复出现的纪律是同一条:「做不到」和「这条路上做不到」是两句话。 指第二格。⛔ 先别急着讲颜色,先讲「画法本身就是信息」。
「同一张矩阵,只是切成 3×3 个块。你先注意画法: 对角块是一格一格画的,块间是一整块加一根竖条。 这不是排版偷懒 —— 画成格子,意思是它真的被摆出来了; 画成一整块,意思是它根本没被摆出来,整块的内容被压进了一个 d×d 的状态, 那根竖条就是『秩只有这么一条』。」
⭐⭐⭐ 然后是这张图唯一要留下的那句,慢,而且要停: 「你们看那些块间的紫块 —— 里面一个斜纹都没有。 被 mask 挡住的,从来只有对角块。 第 r 块里的每个 token,都能读前面每一块里的每个 token,没有谁被挡。 既然那里从来就没有逐元素乘挡路,结合律在那儿也从来没被挡住过 —— 根本不需要『绕开』它,它本来就是通的。」⛔ 台下最常见的误解是「块小所以算得动」。明确否掉它: 不是块小,是块间那片区域里压根没有 mask。
⭐ 然后把两个括号点名,这对词后面还会用: 「所以一张图里出现了两种算法: 对角块走左括号(Q Kᵀ 先算,⊙ M,再乘 V), 块间走右括号(先攒出状态 S,再 Q 乘 S)。 Lightning Attention-2 的论文就是这么叫的 —— left product 和 right product,块内用左,块间用右。」
指第三格那两笔账。⏱ 40 秒,别展开,念数就行。「句长 12:有效格子 78 个,落在对角块里、要老实算的只有 30 个。 句长翻到 24:有效格子变成 300 个 —— 涨了 3.85 倍,这就是二次; 而要老实算的从 30 变成 60,只涨了 2 倍,正好线性。」
⭐ 段尾一句收口,顺便把下一格接上: 「注意对角块那一部分不会随句长消失,它只是从平方变成了线性。 想再往下压,只能把 C 调小 —— 而 C 被什么顶死,就是下一张图的事。」 ⭐ 2026-09-13:滚到 fig3-chunkwise。⏱ 约 3 分钟。 ⛔ 这一段别省 —— 它是这一讲「落到硬件」那条线在 §七 的落点, 而且别人的课不会这么讲。⭐⭐ 开场先抛那个反讽,它比结论好记: 「第三个旋钮本来是为了省 —— 把平方降成线性。 结果你猜它先丢掉的是什么?并行度。」
指第一格。「S 依赖上一个 S,一个 token 一步。 训一条一百万 token 的序列,就是串行跑一百万步 —— 直接不用想。」
指第二格。「解法叫 chunkwise:把序列切成一段一段。 块内:一次矩阵乘全算完,完全并行。 块间:只把一个状态传下去。 于是并行度从 1 变成块长 C,串行步数从 L 变成 L 除以 C。」
⭐ 有一句一定要补,否则台下会以为这是个近似: 「注意它没有改数学 —— 算出来的结果跟逐 token 串行一模一样, 只是换了个算法。」 ⭐ 第二格右下角那个蓝方块,顺手点一下 —— 一句话,别展开。「交接单上只有那块板子,而板子多大是开工前就定死的 —— 跟这一批有几个人、跟整句话有多长,都没关系。 这才是它敢这么切的全部理由:交接单不会越传越厚。」
⭐⭐ 2026-09-14 新增:指第三格。这一格是手往下走,不是逐行念 —— 把手放在左边那根紫箭头上,从第一行滑到第四行, 边滑边说下面这段。四行只需要读最上和最下两行。⭐ 怎么念:「C 不是一个要调的参数,它是一条轴。 最上面这行 C 等于 1 —— 二十四批、二十三张交接单, 这就是第一格那个一个窗口,它没有消失,它是这条轴的左端。 最下面这行 C 等于整句话 —— 一批、零张交接单, 串行没有了,一整张矩阵一次算完。 往下滑,批越宽,交接单越少 —— 两端各少掉一样东西。」
⛔⛔ 这里有一个必须当场堵掉的误会,不堵一定有人问: 「右端不是回到 Transformer。」 —— 那一整张 L×L 是线性注意力的并行形式, 整条轴上从头到尾都没有 softmax。 轴换的只是「什么时候算」,换不出一个 softmax 来。 ⭐ 落点一句:「所以 chunkwise 不是第三种算法, 是连接那两端的一个旋钮。」 指第四格。「那块长 C 选多少?—— 两头都被夹住。 太小:串行步数多,而且每步那个矩阵乘太瘦,算力吃不满。 太大:块内那个中间矩阵放不进片上内存,只好往 HBM 上倒,白搭。」
⭐⭐ 落点,而且这是一次跨专题的回收: 「所以块大小是被片上内存顶死的 —— 这跟本讲 §3.5 里 splash attention 那个块大小,是同一类问题。 那一节的结论可以直接搬过来:最优块是个绝对值,不随序列长度缩放 —— seq 从 4096 拉到 16384,最优块都是 2048。换 seq 不用重扫,换硬件才要。」 ⭐ 最后用两个信号收口,说明这条路有多难走: 「一,Kimi 为了 KDA 专门写了一个 CUTLASS kernel —— 因为块内并行和块间串行交替的时候 SM 会空转。 二,长序列训练还得有 KDA 专用的上下文并行 —— 标准做法是把各段局部结果直接相加,但这对 delta rule 不成立, 它的状态更新是 token 相关的矩阵连乘。」⭐ 收:「线性注意力在纸上是 O(L),在硬件上是一场 kernel 战争。」 ⭐ 段尾给提问法: 「以后看到这一支的任何一个新名字,只问一句 —— 它的『擦』是怎么决定的? 读的方式三代几乎没变,全部的差别都在这儿。」
讲稿 · 8 混合:配比是一条轴
⭐⭐ 开场一句:「混合不是一个技巧,它几乎是唯一的答案。 因为单用任何一个旋钮都有致命短板。」
「只用滑窗 —— 跨不了长距离。只用纯全注意力 —— KV 和 FLOPs 都爆。 只用纯线性 —— 精确检索塌。」
⭐⭐ 第三条现在可以讲得比以前硬得多,这是今晚新加的: 「『纯线性不行』不只是实测不行。回到第二节那条 L2M 条件 —— 状态维度必须至少跟双部互信息同阶增长, 而纯线性的状态根本不增长。总存在一个长度,它必然兜不住。」⭐ 所以「必须混合」是有下界的,不是工程经验。 ⛔ 口径:论文分析的是状态空间模型那一类,套到「配比为 1:0」这一步是我们的推导。 ⭐ 指中间那格。那不是一条轴了,是一片点 —— 一个点一个模型,一共 14 个。别念型号,念形状。
① 先让台下看高矮:「哪一摞最高?3:1,五个模型。 这就是『大家都在哪』—— 不用数,堆在那儿。」
② 再让台下看最左边那一摞:「1:1,两个点, 都是橙的。橙色是滑窗 / 局部。绿色那一族最靠左的是 3:1 —— 做线性混合的,没有一家敢一比一。」 ⭐ 想不起来哪个色是哪族,就指下面那两条区间条的颜色, 不要现背。
⏸ 停一拍。
「一边是拿一个固定大小的状态去换长度,一边是干脆不看远处。 出发点完全不一样,最后停的地方却一样。这件事本身就是一条证据。」
①「橙色那族里为什么有 Llama 4 Scout?」—— 它的便宜层是分块局部注意力, 归在滑窗 / 局部这一族,不是线性。族的划分按 §8.4 逐家核过的旋钮来。
②「那条绿色阴影和重叠段为什么一样宽?」—— 如实答: 消融给的建议区间是 3:1~6:1,各家自己选出来的重叠段也正好是 3:1~6:1。 ⛔ 但别说成因果 —— 一个是扫出来的建议,一个是各家独立选的结果, 重合值得注意,不等于谁导致谁。
⏸ 停一拍,让台下自己反应过来这有多反直觉。
⭐ 「你想想:如果混合只是『拿便宜的层换点钱』,那全用贵的应该最好才对。 可它不是。这说明加线性层不只是省钱,它可能还带来了别的东西 —— 比如一种天然的时序归纳偏置。」
翻到 §8.2 那张新图,先指①左右两条曲线。⭐⭐ 「这句话底下是一张五行的表,数值全都公开了 —— 我们把它画出来了。左边是训练 PPL,右边是验证 PPL, 两张图的纵轴跨度一模一样,所以斜率可以直接比。」
「先看形状:两边都是 U 形,中间低两头高 —— 这就是刚才那句『两头都不好』的证据。」
⭐ 然后指左图中间那两个点: 「3:1 和 7:1,在训练集上一模一样,都是 9.23。 换到右边的验证集,它们才分开。训练 loss 看不出配比的好坏 —— 这个提醒待会儿还要再用一次。」 指②那六列格子。⭐⭐ 「现在是这张图真正想说的那件事。那个消融模型只有 16 层。 配比要摆得匀,每组的层数就必须整除 16。 而 16 的约数只有 1、2、4、8、16 —— 所以配比只能是 0:1、1:1、3:1、7:1、15:1。」
⏸ 停一拍,再落这一句: 「也就是说,这五个配比不是挑出来的,是被 16 除出来的。 4:1 从来没被试过 —— 它要 5 层一组,16 层摆到第 15 层多出一层, 右边那一列就是它。」⭐ 所以『为什么是 3 不是 4』这个问题,那张表回答不了。
⚠️ 这里要给自己划一道线:「『每组层数必须整除 16』是我们 对那张表做的算术观察,不是论文给的理由 —— 原文没有解释为什么选这五个。」
⚠️ 最后一句必须说,跟 §9.1 是同一条纪律: 「这整张表量的是 PPL,而全场五个配比一共只差 3%。 另一篇系统性消融把两个口径分开画,结论是一条平的、一条涨的: 语言建模分几乎不受配比影响,召回才会随全注意力层变多一路上涨。 所以 —— 说一个配比最优,得说清它是按哪个指标最优的。」 ⭐⭐ 抬成通用判据: 「当一个『纯粹为了省钱』的改动反而把效果做好了,那它就不只是省钱 —— 去找它顺带改变了什么。」 指第三格,⏱ 一分钟收尾。「最后:全局层为什么不用多?因为只要有几层能做无损检索, 信息就能沿着残差流传给其余层用 —— 不是每层都得自己查一遍。」
⭐⭐ 2026-09-14 新增:翻到 8.2b,fig3-ratio-or-count。⏱ 约 2 分钟。 ⛔ 这一段是专门用来防住刚才那句话被听歪的 —— 「不用多」很容易被听成「就那么几层,跟多深无关」。⭐ 先把它变成一个可以被证伪的说法,这是这一段的全部价值: 「刚才那句话如果按字面理解,它在预测一件事: 全注意力层的绝对条数跟深度无关,模型越深,比值就该越大。 —— 那我们去数一下配置文件,看它对不对。」
指第二格的散点图。「横轴是总层数,纵轴是全注意力层的绝对条数。 如果『几层就够』成立,点该落在那条红色的平线上。 但它们全落在蓝色那条斜线上。」
⭐⭐ 最有说服力的是 Kimi 自己,慢一点讲: 「Kimi Linear 是 27 层、7 条全注意力;K3 是 93 层、24 条。 绝对条数涨了 3.4 倍,比值纹丝不动。 千问那一族更干净 —— 七个尺寸从 0.8B 到 397B,layer_types 数组逐层写死,恰好 3:1,一次不差。」⛔ 所以那句「不需要很多」的准确意思是占比低,不是绝对条数少。 反过来说:模型越深,你要付的全注意力层就越多 —— 混合省下的是一个固定比例,不是「越深越划算」。 指第三格。⏱ 30 秒,这是给那两个小数一个交代。
「不过真实规则是两条叠加:主体按固定比例铺, 外加几个按「位置」钉死的全局层。 Kimi 两个模型都是『每 4 层一个 + 末层必为全局』—— 末层那多出来的一条,正好解释了表里那两个别扭的小数: 27 层时是 2.857,93 层时被摊薄到 2.875。」
⚠️ 被问到时的两条备料,不主动展开: ① Hymba 的全局层确实只有首 / 中 / 末三层、多深都是 3 —— 但它是按位置定的,不是按数量定的,两回事。 ② MiniMax-M2 干脆退回了全注意力,62 层全是 full attention —— 混合不是一条只进不退的路。⭐ 【8.3 · 意外红利】⏱ 90 秒,跟着 fig3-nope 的三格走。 「还有一个意外红利:Kimi Linear 的全注意力层完全不加位置编码 —— 没有 RoPE,没有 YaRN,什么都没有。(K3 是照搬它的。)」
⭐⭐ 为什么敢?这一句是题眼:「因为夹在中间的线性层 本身就是一步一步往下递推的,它的衰减和门控天生带顺序。 —— 位置这件事,已经有人干了。 论文原话就是『把编码位置信息的全部责任交给 KDA 层』。」
🏠 生活版,说完停一下:「原来是办公室里每个人都自己戴表对时; 现在流水线本身就是按顺序走的 —— 你在第几站是自明的, 表可以不戴了。」
⭐⭐ 第三格是这一节的收口,读法有先后,别跳。 先只看左边那半张:「R 在这儿。注意这三条红的是从 R 身上垂下来的 —— 吸收被挡住、多出 64 维、外推要重标定。 它们看着互不相干:一个是代数变换、一个是显存、一个是调参。 但它们长在同一个东西上。」
然后手平移到右半张,同一个高度:「一模一样的图, 只有该变的地方变了。」 ⭐⭐ 停住,什么都别说,让他们自己看。 三个槽空着,R 的位置只剩一个灰虚线的框。 数数的动作要台下自己做 —— 你一说「你看少了三样」,这一格就白画了。
等有人反应过来,再逐个落实:「① 吸收完全生效, MLA 推理时直接退化成纯 MQA;② 那 576 = 512 + 64 里的 64 整个消失 —— 看第②槽里那条,512 那段两边一样长,右边只是 64 那一格空了; ③ 没有位置编码,就没有外推要调。」
⭐ 同理右边一点强调色都没有:空着本身已经把话说完。
⭐⭐ 最后指一下那根穿过幽灵框的粗黑箭头 —— 这是全图唯一「左边没有、右边有」的东西: 「左边这条路是两段、中间拐一下;右边是一根直的。 这就是『吸收生效』长什么样。」
⛔ 这里必须主动堵一句,不然台下一定会记错: 「你们大概听过『Kimi Linear 把 KV 降了 75%』—— 那不是 NoPE 的功劳,是 3:1 配比的(四层里只有一层是全注意力)。 两笔账要分开记。」
⭐⭐ 最后把措辞抠死,这是这一段真正的价值: 「注意 —— 这不是『找到了绕过 R 的技巧』, 是让别人替它把活干了,于是 R 根本不用存在。 被绕过,和不存在,是两件事。」
⭐⭐ 这一段的落点,也是整堂课想教的那个能力: 「一个架构选择(混合),解开了另一个看起来完全无关的约束(位置编码)。 —— 看见约束之间的连接,这比记住任何一个名词都重要。」讲稿 · 8.5 六十秒课后题(⭐ 2026-09-13 新增 —— 全讲唯一一次让台下动手)
⭐ 开场就一句,不要解释规则太久: 「屏幕上三个机制,今天都提到过,但我一个都没明说它们归哪儿。 每个回答三个词:哪个旋钮、事后还是 native、省字节还是省 FLOPs。 六十秒,写在纸上 —— 写下来,不要只在脑子里想。」
⛔ 六十秒里你什么都别说。 (真的闭嘴。有人抬头看你,就指一下屏幕。)对答案时按这个顺序,最后一道留最久:
A · CLA —— 「旋钮①、native、省字节。旋钮① 到今天一共三招:
MQA 砍头数、MLA 压维度、CLA 减层数 ——
三招都在回答同一个问题:那份要留下来的有多大。」
B · KV 量化 —— 「都不是。这是个陷阱题,
而且是我在 §四 主动说掉的那个:三个旋钮管『存几个数、读几个数』,
量化管『每个数几个 bit』。它正交。」
C · IndexShare —— 「也都不是,而且这道最难。
它不改『读哪些』—— 它省的是旋钮② 自己的开销(那个索引器)。
所以它是旋钮上的优化,不是旋钮。而且注意:KV 一个字节都没少。」
⭐ 接回 §4.2b 那句:放得进去的,你已经知道它的优点和代价了; 放不进去的,才值得你花时间。
⚠️ 时间紧就整段跳 —— 它是 §八 之后的加餐, 但别只讲题不对答案:那比不讲更糟。
讲稿 · 9.1 把 ↓↓↓ 换成毫秒(⭐ 2026-09-14 R26 新增)
⭐ 开场先自嘲一句,台下会更买账: 「上面这张表每一格都是箭头。可我们这一讲从头到尾在说 『问省了多少之前,先问省的是哪一样』 —— 箭头恰恰答不了这个。所以把同一批方案,换算成一个能拿计算器核的问题: 吐一个字,要从显存上搬多少字节?」
指第一格,两样东西,快走。「一步要搬两样:激活权重,V3 每个 token 激活 370 亿参数、 原生 FP8,就是 34.46 GiB —— 所有方案完全一样,而且所有人共享。 另一样是这个人的 KV —— 每人一份。」
⭐ 第一个数,先让他们自己猜: 「MHA 那一步里,这两样谁占得多?」⭐ 台下多半会说「差不多」。答案是 KV 占 93.4% —— 权重只剩六点六。「KV cache 是瓶颈」这句话,到这儿才算画出来了。 指第三格右上那块红框。⭐⭐ 这条是必讲的。
⭐⭐ 这一段最值钱的一句,说慢一点:
「显存省了 56.9 倍,单用户 decode 只快了 7.08 倍。」
⭐ 停两秒让它落地,然后指那根三色横条 ——
⛔ 别只说「因为卡多了」,那会被当成搪塞。
整条的长度就是那 56.9 倍,被切成三段,一段一个去向:
「绿的这一段,是真正到手的七倍。
橙的这一段没了 —— 因为每一步还要读一份
所有人共享的权重,它把比例摊薄了四点七倍。
红的这一段也没了 —— 因为 MHA 装不下,
被迫用 12 张 device 而不是 7 张,它拿显存换来的卡,
顺手也把带宽换来了。」
⭐⭐ 然后让他们自己看一眼长短:
「橙加红,比绿的还长一点 ——
被吃掉的八倍,比到手的七倍还多。」
⚠️ 讲者须知,别讲给台下:三段是按对数切的,
所以它们才会正好铺满整条(乘法在对数里就是加法)。
⛔ 因此不要说「橙段占了三分之一,所以吃掉三分之一」 ——
长度对应的是倍数的对数,不是倍数本身。台下不问就别提,
问了就答「长度是按倍数的量级排的」。
⭐⭐ 落点:「所以 MLA 真正省下来的不是时间,是那 5 张卡 ——
而那 5 张卡可以拿去服务别人。」
⭐ 这个「把倍数拆开看它在哪一步被吃掉」的手法,台下在 §五 已经见过一次
(4.571 白送 × 12.4 赌出来)—— 可以点一句,他们会有「又来了」的快感。
⭐ 这句话顺手把下一段的主题递出去了 —— 下一段讲的就是瓶颈的搬家史。
讲稿 · 9+10 落点:三种资源之间的搬家史
⭐⭐ 一句话开场: 「今天讲了这么多名字。现在退一步看,这整部变体史其实是一件事 —— 在三种资源之间反复搬家:显存、算力、访存规整度。」
「早期搬显存:MQA、GQA、MLA。中期搬算力:滑窗、NSA、DSA、CSA。 现在在搬访存规整度:chunk 化的线性注意力。」
⭐⭐ 然后问一句,答案很漂亮: 「为什么是这个顺序?—— 因为前两样能用公式算。 显存多少字节,算力多少 FLOPs,坐下来就能估。 访存规整度算不出来 —— 它只出现在 kernel 里, 出现在 SM 空转的那几个微秒里。所以它被留到了最后。」 指第二格,四个取舍快走。「一,省显存不等于省计算 —— MLA 省显存却加了计算,DSA 省计算但 KV 还在。 二,训练时省不等于推理时省。 三,不规则访存的代价常被低估 —— 纸面 64 倍落到 gather 上远拿不到。 四,收益有天花板。」
⭐ 第一条要抬一下: 「问『省了多少』之前,先问省的是哪一样。」 指第三格。⛔ 这一格是全课最该带走的一句,慢慢讲。「看这三根条。4K 下,注意力的平方项只占一成二的算力; 到 128K 是八成二;到 1M 是九成七。 —— 同一个机制,两端差了八倍。」
⛔ 这里有两个坑必须当场说破,不然这一格会教出反效果:① 「这是算力不是时间。我们在 v7 上量到同样 4K 下 splash attention 占 23% 的时间,因为它是全场效率最低的算子 —— 效率最低的算子,时间占比一定高于算力占比。」
② 「而且那 12% 只是平方项。注意力自己的投影(Q/K/V/O)在 4K 下 还占 27% —— 所以别把剩下那格读成『全是 MoE』。」 ⭐⭐ 落点,说死: 「所以今天听到的任何一个倍数 —— 五十七倍、六十四倍、二点九倍 —— 必须带上『在多长的上下文下』。不带这句,那些倍数全是耍流氓。」
⭐ 这句话是给他们回去开会用的,比任何一个名词都实用。 ⭐⭐ 紧接着补上另一半(2026-09-14 R26 加) —— 「还要说清它是哪一样的倍数。刚才 9.1 算过:同一个 MLA, 显存是五十七倍,单用户 decode 的时间只有七倍。 两个数都对,差了整整八倍。报哪一个, 取决于你想让听的人以为你省了多少。」
⭐ 这两句连起来才是完整的防骗判据:多长的上下文 + 哪一样的倍数。 ⭐ 最后收全课: 「这也是为什么这一支的前沿工作,看起来越来越像『写 kernel』而不是『改模型』。 对应到评估上就一句话:别看 FLOPs 省了多少,看墙钟时间省了多少; 也别只看单算子,看端到端。」
讲稿 · 10.2+10.3 落到 TPU:这批机制是在另一台机器上想出来的(⭐ 2026-09-12 新增)
⭐⭐ 开场一句就把姿态定住,别让人听成 TPU 的黑历史: 「刚才那张表里有一行是『稀疏假设 gather 不太贵』。 这一行落到我们自己的机器上,是一整个还在打开的工程战场。」
指 fig3-tpu-gap 的左右两栏,一句话一栏。「左边是 TPU 的三条硬约束:形状要在编译期定死、 内存布局是粗粒度的、整条流水线为规整访存优化。 ⭐ 这三条不是缺点,正是它在规整稠密负载上效率高的原因。」
「右边是现代注意力的三个动态性来源:一批里各人长度不同、 KV 分页散在不连续的地址上、这一步读哪 2048 条要跑起来才知道。 ⛔ 这三样全是在 GPU 上先长出来的 —— 它们默认了一台『随手 gather 不太贵』的机器。」
⭐⭐ 这一段的判据,说死: 「所以移植的活儿不是翻译代码,是把那个隐含的硬件假设找出来, 再换一个等价但规整的做法。」 切 fig3-tpu-fix。三招只念共同形状,别逐条展开。⭐⭐ 怎么念:先指右上角那个带标注的小形状 —— 「运行时才知道的一个,换成开工前就备好的几个,来了挑一个。」
然后手往下一划,扫过三招左边那一列: 「三招的形状,跟它一模一样。」 ⭐ 这一划就是这一格的全部内容 —— 三个形状长得一样,「都是」这件事就不用你说了。
「怎么克服?公开的做法有三招 —— 细粒度 tiling、把 KV 更新融进注意力、 按长度分布编出好几个特化 kernel。 ⭐ 三招是同一个形状:把一个动态,换成一批静态。 这非常 TPU —— 不写一个动态 kernel,写一批静态的,跑的时候挑。」
⭐⭐ 下面两问几乎一定会被问,答案都要分两层,别答成一个字。问一:「那个『取哪 2048 条』的决定,谁来算?要不要发回 CPU?」
⭐ 「分两层。批次级的东西 —— 这一步有哪些请求、各自多长、页表长什么样 ——
本来就在 host 上,一步算一次,摊到几千个 token 上可以忽略。
但逐 token 的那个决定不出卡:一次 PCIe 往返以微秒计,
而这一步的预算只有几十微秒,发回去一次就废了。」
⭐⭐ 「更有意思的是它用的是哪部分硬件:
做 FlashAttention 的时候,向量单元忙得冒烟,标量寄存器基本闲着。
而地址计算恰好是标量活。所以这笔成本是拿闲着的那部分付的 ——
把元信息提前算好放进标量内存,跟矩阵乘重叠起来。」
问二:「SparseCore 能不能干这个?」
⭐ 「架构上非常对口:它就是为不规则稀疏访存做的,
原生支持数据相关的控制流和访存,还能做跨 lane 的排序、过滤、前缀和 ——
这正好是 top-k 要的那几样。」
⛔ 「但要说清楚两件事。一,它消化动态性的方式是要你先声明静态上界,
超了就得分批或者丢 ID —— 对 DSA 这反而天然满足,k 就是 2048。
二,公开的那套 TPU 生产注意力 kernel 走的是 TensorCore,不是 SparseCore。
所以这是一个看起来很对、但还没被公开验证的方向。」
⭐ 这条一定要诚实 —— 台下如果有 TPU 的人,含糊一句就被抓住了。
「一句话:在一台 static-first 的机器上,动态性的次数本身就是成本。」
⚠️ 这句是我们的推导,没有公开对照实测 —— 讲的时候把这句带上。
⭐ 台下最可能问的六个问题(⭐ 2026-09-13 补:其中四个原先没有答案;⛔ 2026-09-12 修:标题写「五个」而实际六条,且编号排成 ①②③④⑥⑤ —— 后补的那条插错了位又错了号)
① 「KV 量化算不算第四个旋钮?你刚说没有第四个位置。」
⭐ 「不算,因为它跟这三步正交。三个旋钮管的是存几个数、读几个数;
量化管的是每个数用几个 bit。两者能任意组合 ——
DeepSeek-V4 就是稀疏加 KV 混合精度一起上。精度那一维整个归专题八。」
⛔ 这条最好别等人问,在 §四 收尾时主动说掉 ——
那个「封闭感」一被戳破,后面挂东西的架子就塌了。
② 「线性注意力那块板子,到底占多少显存?」
⭐ 「跟长度无关,是个地板:头数 × d_k × d_v × 4 字节 × 层数。
按 32 头、128×128、fp32、69 层算,大约 138 MiB 一个请求。
跟 KV 的交叉点大概在 五百个 token ——
也就是说只在很短的上下文里它才更贵,8K 时 GQA 的 KV 已经是它的十六倍。」
(数在 fig3-notepad 的落点带上。)
③ 「DSA 的索引器自己还是 O(L²),那总账到底省了多少?」
⭐ 「对,索引器省的是常数不是阶。论文自己也承认,所以后来才有
IndexShare / IndexCache 那一步 —— 一个优化制造出了新的被优化对象。
端到端的数我手上只有官方那句『1M 下 27% FLOPs、10% KV』。」
④ 「3:1 里那个『1』放在哪一层?为什么末层常常是全注意力?」
⭐ 「证据就在这张 44 行表里:K3 末两层连着 full、Kimi Linear 末层强制 full、
V4-Pro 前两层是 HCA。现象很一致,但公开材料没给理由 ——
我只能给现象,给不了解释。」
⛔ 老实说「没有理由」比编一个强。
⑤ 「MLA 上多卡怎么办?TP 之后那 57 倍还在吗?」(⭐ 2026-09-13 补)
⭐ 「好问题,而且是每个上 DeepSeek 的人第一周就会撞的墙。
GQA 的 KV 是按头切的,TP=8 就每卡八分之一;
MLA 的 KV 是一份 576 维的隐向量,不按头分 ——
要么每卡各存一份(省下的 57 倍当场还回去 8 倍),
要么把 attention 那段改成数据并行(SGLang 给 DeepSeek 就是这么做的,
代价是跟 MoE 那段的并行策略不一致,中间要插 all-gather)。」
⭐ 顺手把它抬成本讲的主线:「一个在单卡上很漂亮的数学结构,
到了多卡上恰恰因为『不按头分』而失去了最自然的切法 ——
所以引用『省 57 倍』时要带一句『在什么并行配置下』。」
📌 口径:三条做法是公开实现里能看到的,各自的具体开销本课没有实测。
⑥ 「这些跟 vLLM / SGLang 里的 PagedAttention、prefix caching 是什么关系?」
⭐ 「正交。那一层管的是『同一份 KV 怎么放、怎么复用』;
今天讲的三个旋钮管的是『这份 KV 本身该有多大、每步读多少』。
⚠️ 但有一个真实的交互值得记:滑窗和线性注意力都会削弱 prefix caching ——
前者窗口外的本来就扔了,后者能复用的只有 chunk 边界上的状态快照,
粒度跟 KV block 不一样。这一条我没有实测,只是机制上的推论。」
讲稿 · 11.1 最后一件事:回到封面那 512 倍(⭐ 2026-09-14 故事线审计新增)
⭐ 判据:开场我们许了一个极其具体的承诺(那 512 倍)。 许了没还,学员散场时带走的是一个没闭合的圈。
⭐ 先把开场那句原样搬回来:
「今天一开始我说 —— 2020 年的 GPT-3 记 2048 个 token,
今天的模型记 100 万。这一讲讲的就是这 512 倍 是怎么换来的。
现在,把这笔账算完。」
手沿着上面那根条从左往右走:「显存账 ——
一个人要占多少。绿的这一大段,是旋钮① 的 MLA 把每一份压小,
56.9 倍;接着这一段,是混合三比一,再 4 倍。
⭐ 然后手停在最后那一小截红的上面:
「整条条就是那 512 倍。前面两段是省出来的,
末尾露出来的这一小截,才是六年里真正多买的硬件 —— 只有 2.25 倍。」」
再走下面那根,这一段要慢:「带宽账 —— 每走一步要读多少。
这一笔旋钮② 一个人还,而且它一个字节都不省显存,KV 全存着。
稀疏注意力每步固定只读 2048 个。一百万除以两千零四十八 ——
正好也是 512。」
⚠️ 诚实那一句不能省,就在这儿说: 「⛔ 我得说清楚:这是把今天学到的三样叠在一个模型上的推演, 不是某一个真实模型的实测。56.9 倍是 V3 口径核过的, 4 倍是 Kimi Linear 的配比 —— 两者不在同一个模型上。 而且两个 512 会相等是个巧合:GPT-3 的上下文长度和 DSA 的 k 恰好都是 2048。」
⭐⭐ 最后一句,慢,说完就结束,不要再补任何东西: 「所以这六年真正变的不是机器 —— 是『一个 token 到底该花多少钱』这件事,被重新定价了。」① §六 超时。 ⏱ 全量 20.5 分钟,是全场最长的一节, 而它前面还压着 §五 的 16 分钟。⭐ 对策:滑窗那个侦探故事和 DSA 那个鸡生蛋 只深讲一个,另一个只念落点带。
② §五 和 §六 的两个侦探故事都讲。 ⛔ 两张都是完整故事,讲一张就够立住「看一个机制先找它在修什么毛病」这个姿势; 两张都讲,第二张的惊讶感会掉一半,而且直接吃掉 §七 的时间。 ⭐ 也别两张都不讲 —— 那样这一讲就退回成名词表。
③ 照念那张 44 行模型表。 ⛔ 投影上没人看得清,念完十分钟没了。 ⭐ 只讲两列:KV 那一列 576 GiB → 697 MiB, 和上下文那一列 —— 过 1M 的十二家无一例外动了②或③。其余一律「课后自己排序看」。
🚧 还没想清楚的(2026-09-07 从教材搬过来)
⭐ 但也不能删:它们是真的没想清楚,删了就是假装想清楚了。 所以搬到这儿 —— 只有讲课的人会看的那一份。
[x] §1.1 要不要把 GQA-8 那一行也画进图里—— ✅ 已解决(2026-09-13):§五 那张四行表(MHA / GQA-8 / MLA / MQA) 把四个都列了,而且不靠柱子高度,靠数字并排。 ⭐ 顺带证实了当初那个直觉 —— 比例太悬殊的量,就不该用长度去编码。- [ ] §7.4 的 chunk 大小要不要真的给一个数(原写「§5.4」,已重编号)—— 给了就得说清是哪个硬件、哪个实现,否则会被当成通用常识背下去。 倾向于只给「被片上内存顶死」这个约束,不给数
- [ ] §十一 那条时间线的 2026 一行会过时(原写「第九节」,已重编号)—— 需要一个约定:每次开课前只更新这一行,前面几行是稳定的
📌 想清楚一条就从这儿划掉一条,并把结论写进对应小节。 ⛔ 别在教材里回答这些问题 —— 教材只呈现结论,不呈现「我们当时在纠结什么」。