专题三 · 注意力演进

这份讲义怎么用

这是老师的草稿,不是给学员的材料。学员看 课件,你看这一份。
课程作者 Chris Yang · Google Cloud AI Infra 架构师。

🎯这一讲要留下什么 讲完之后学员脑子里应该剩的那一句话。
🗣讲稿 接近逐字,可以照着念。黄底的是必须说出口的原话。
🖥屏幕 这一段该滚到课件的哪里。
⚠️别讲什么 这一讲最容易跑偏的方向(在最后一节「⚠️ 最容易跑偏的三个方向」里)。

⏱ 怎么排时间(⭐⭐ 2026-09-13 重排:现在有三档,别再按 62 分钟排)

先说清楚为什么改。这一版把每一节的「它是怎么被发明出来的、为什么可行」 都补上了 —— 新增 10 张图、约 35 分钟的逐字稿。 照旧的 62 分钟排,一定讲不完。
⭐ 判据:过期的时间表比没有时间表更糟 ——  它会让你在第 40 分钟才发现自己只讲到一半。

主线 70′标准 113.5′全量 136.5′这一节多出来的是什么
§前 课前 + 骨架101417原先一分钟预算都没有:开场白 + 两道课前题(6 个小问,光收答案就 6–8 分钟)+ 骨架图 + 编年史 + 44 行大表
§零 RNN81212——
§一 MHA81317⭐ 1.0 发明史(4′)+ 1.2b 为什么非 softmax 不可(3′)
§二 两条动机6811⭐⭐ 2.3b 信息账的严格版本(3.5′)
§三 FlashAttention222——(已降级)
§四 三个旋钮688.5⭐ 4.2b 事后压 vs 从头训这条判据(2.5′)
§五 旋钮①81316⭐ 凭什么敢压(3′)+ 砍头这一支怎么想出来的(3′)
§六 旋钮②81520.5⭐ 滑窗完整故事(4′)+ DSA(4′)+ NSA(3.5′)+ CSA/HCA(3′)
§七 旋钮③61013⭐ 记事板(6′)+ A_t 谱系(4′)+ chunkwise(3′)
§八 混合444⭐ 配比轴(新,但替换了念表)
§8.5 六十秒课后题2.52.5⭐⭐ 2026-09-13 新增。全讲唯一一次让台下动手 —— 六十秒答题 + 对答案。时间紧可整段跳,但别只讲题不对答案
§九+§10.1 落点444时间再紧也不能压
§10.2+10.3 落到 TPU56⭐⭐ 2026-09-12 新增。台下是 infra 的人就必讲 —— 这是这门课唯一有资格讲的五分钟;纯算法听众可以整段跳过
§十一 时间线33——
合计70113.5136.5

⭐⭐ 60 分钟版怎么砍 —— 砍的原则只有一条「为什么可行」的那些图,留住能迁移的那几张,其余只念结论。

  • 必讲,砍了这一讲就散了:§四 三个旋钮 + 4.2b 那条判据(这是全课的坐标系); §九+§十 落点(那条「任何倍数必须带上在多长的上下文下」)。
  • 只挑一张深讲:§五 的「凭什么敢压」 §六 的「滑窗完整故事」——  两张都是完整的侦探故事,讲一张就够立住「看一个机制先找它在修什么毛病」这个姿势。 ⛔ 别两张都讲,也别两张都不讲。
  • 可以只念结论的:DSA / NSA / CSA 那三张(把落点带念一遍即可)、 §七 的 A_t 谱系(指着图说「区别只有 A 长什么样」就够)。
  • 60 分钟版直接不讲:§二 的严格版本(L2M)、§十一 时间线。 ⚠️ 但 §八 讲「纯线性必然兜不住」时要补一句「这有理论下界,课后材料里有」, 否则那句会变成没有依据的断言。

§零 为什么值 12 分钟(60 分钟版压到 8):它不是补课,是舞台说明。 「Transformer 解码时又变回 RNN 的形状」这一格立起来之后, 后面三个旋钮才有一个共同的落点 —— 它们拧的都是「让解码那一行每步要搬的东西变小」

⚠️ §三 FlashAttention 那一节,别按「科普」的时长去排: 它在课件里已经折叠,主线上只剩两句 ——  矩阵没被存下来过,以及它跟三个旋钮不是一类东西。 展开版(块大小的三堵墙、head_dim=128 锁死的 50%)留给有人追问时用。

🚧 这一讲的成熟度(⭐ 2026-09-13 重写 —— 上一版已经完全过期)上一版写的是「第一节(FlashAttention)是成品,其余是已展开的大纲」。 这句话现在是错的,而且错得很误导
① FlashAttention 那一节早就降级折叠了,主线上只剩两句;
② §零 / §一 / §二 / §四 / §五 / §六 / §七 / §八 / §九+§十 现在全都有逐字稿
判据:过期的元信息比缺失更糟 —— 它会让人不去翻那些真的稿子。 (⛔ 这个坑在这份讲义里踩了三次:「§四起只有提纲」、这一条,以及被这一条宣判作废、却又原样印在它正下方两个月的那个旧块 —— ⭐ 那一次最说明问题:诊断、判据、病灶三样同屏,说明当时的修订模式是加注解,不是改内容。2026-09-12 才真删掉。)

现在的实际状态全部主线小节都有接近逐字的讲稿,每个数都回到一手论文核过, 自己推的结论都当场标了「这是推导不是引用」。
⚠️ 仍然薄的只有两处:§十一 时间线那一段(只有骨架), 以及 §十二「明确不讲什么」(只有清单)。

🖥 投屏怎么放 —— ⛔ 别整张投(⭐ 2026-09-13 量过了)

⛔ 这条不是讲究,是量出来的 二轮审稿逐张算了「整张图投到 1280×720 上,最小字剩多少像素」: 34 张里没有一张保得住 10px,最差的到 4.7px⭐ 根因不是字号定小了 —— 一张 1400×900 的三栏图本来就是三页内容, 整张塞进投影区要缩到 0.6~0.7,11px 的地板到那儿只剩 7 点几。 把地板提到 13px 也救不了:那只会让图更高、缩得更狠。

⭐⭐ 正确的放法:一次只放大一格。 三栏图的一格是 440/1400,占满投影区就是 2.8× ——  11px 到屏幕上变成 31px,后排也看得清。

操作上就两句
① 浏览器里把图点开单独一张(或直接开那个 .svg), 用 Ctrl/⌘ + 滚轮放到只剩一格
② 讲完一格再横向平移到下一格 ——  下面每一段讲稿里的「指第二格」「切第三格」,本来就是按这个节奏写的。

唯一需要整张投的时刻:一节讲完、要让人看见 「三格是一件事」的时候 —— 那一下是给结构看的,不是给字看的, 看不清字没关系。

⚠️ 构建时有一条「投屏体检」在盯这个数build-all.sh 里), 因为图一变高它就往下掉,而在电脑屏幕上什么都看不出来。

这一讲要留下的一句话

⭐⭐ 2026-09-08 换立意,开场白整个重写 旧立意是「名词一年换一批,尺子不换」—— 那是一把尺子,不是一个故事。 尺子能让人认名词,回答不了「为什么这六年非得这么走」
现场原话:「长上下文才带来了智能,原来 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 补:原先这块完全没有指令)

这一块原来在讲义里是空白的,而它在课件上占了开场整整一屏 ——  不给指令,代课的人要么跳过(那 8 条结论全丢),要么开始念(十分钟没了)。

【两道课前题】⏱ 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(四张图)

课件第零节。这一节是全讲的舞台说明,不是补课。 课件上只有四张图和几句话 —— 讲述全在这里 最容易讲砸的方式:讲成「RNN 科普」。 台下多半知道 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 没改这个形状,只是把非线性换成几个门。链还是那条链。

门数别说错LSTM 是三个门(输入/遗忘/输出)+ 一个候选值 = 四块矩阵; GRU 是两个门 + 一个候选 = 三块。 「四个门」是把 GEMM 块数当成门数了 —— 这门课自己犯过一次,别在台上再犯。

【图二 · 为什么慢】给 5 分钟,这是本节重心。

先拆掉一个想当然不要说「RNN 慢是因为算得多」。 O(n·d²) 和 O(n²·d) 谁大取决于 n 和 d 谁大 ——  Vaswani 原文写的恰恰是 n < d 时自注意力更快,而那正是 2017 年的常态照着「算得多」讲,台下只要有人解一下不等式就穿帮了。

正确的落法:指着表 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 上下文的时候,紫色这一条能比权重本身还大。」

一定会有人问「那红色那条为什么不算钱」——  如实答:h 比权重小两个数量级,账上一直是略去的(上一格刚讲过)。 这里比的是「会不会随 token 数变长」,不是比谁占得多。 图上那行小灰字写的就是这句,被问到直接指给他看。
这一节到此收口,一句话交给后面:
「所以今天这一讲后面三个旋钮,拧的全是同一件事 ——  让 Ⓒ 这一行每步要搬的东西变小。存少一点、看少一点, 或者干脆换回一个固定大小的状态。」

【图四 · 三个痛点】给 2 分钟,不要逐条讲。

三条一句话带过:算不快、记不住、装不下重点指最底下那一格「第①条后来被反着又走了一遍 ——  Transformer 用放弃状态换并行度,而线性注意力那一支想把状态请回来; 状态一回来串行也回来,于是又得靠 chunk 化和 parallel scan 把并行度找回来。」 讲完就翻页—— 这是伏笔,兑现在第六节。

⛔ 这一节不许展开的三件事: ① LSTM 三个门分别干什么(一展开就是十分钟,跟本讲无关); ② Bahdanau 的对齐公式(第一节再说); ③ Martin & Cundy 的 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 的成因。 —— 看到一个设计的副作用,先回头看它的优点是靠哪条性质换来的, 十有八九是同一条。」
⭐⭐ 2026-09-13 新增:§一 现在从 1.0「它是怎么被发明出来的」开讲。 ⏱ 跟着 fig3-attn-invented 走。
原来这一节直接从「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 分开,是因为「凭什么被选中」和「被选中之后交出什么」也是两回事。

√d 别只说「防止 softmax 饱和」 —— 那是结论不是理由。 板书这两行
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 早就让它不落地了讲一个不存在的显存开销,是在教旧常识。

⛔ 这一节不许展开的三件事: ① 位置编码(RoPE 那一支到旋钮①讲 MLA 时才需要); ② encoder-decoder 结构(本课只讲 decoder-only); ③ FFN / 残差 / LayerNorm(不在本讲的轴上)。
收尾一句交给第二节「这个形状的代价,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 是每人一份。 所以它不是显存里的一项开销 —— 它直接决定你能同时服务多少人。

⛔ 2026-09-12:这段数字曾经跟屏幕对不上 上一版讲义念的是「88 GiB / 5.5 块 / 权重 1250 GiB / 单用户 39% / 三个并发」, 而教材图上写的是「94.74 / 5.2 / 625 / 78% / 两个并发」——  讲台上照讲义念、屏幕上写着另一套数⭐ 两处错都很典型:88 是把一个 GiB 数当成 GB 又转了一次; 1250 是按 BF16 算的,而 V3 的权重原生就是 FP8
⭐ 判据:同一组数有两个落点,就一定会长出两个版本 ——  所以现在讲义这一段只是复述图上的数,不自己再算一遍。

必须自己先说的一条限定,别等人问「这 488 是『假如 V3 用 MHA』的反事实值,不是 V3 的实测 —— V3 从第一天就是 MLA。而且口径沿用论文比较表(K、V 都按 128 维), V3 真实的 K 每头是 192 维,严格算还会更大。」
⭐ 这门课自己的规矩:推出来的数必须带推导链和口径。说出来,不是心虚,是立信。

【右栏 · 线索 B:信息账】约 3 分钟。这条更少被讲,讲好了很加分。

用一个问句起头,比陈述有效「一个 128K 的序列,真的需要 128K 份独立的 KV 吗?

三个观察,指着图上那三个小画面走,各二十秒
实测极其稀疏 —— 绝大部分权重集中在很少的位置。 「那把那些近零的算出来,算的是什么?」
Attention sink —— 大量注意力被「停放」在开头几个 token 上, 跟内容无关说明有一部分权重根本不是在做检索。
远近有别 —— 近处密集细粒度、远处稀疏粗粒度。 「凭什么用同一套精度处理这两种?」

【新增 · 信息账的严格版本】⏱ 跟着 fig3-info-law 走。
⭐⭐ 这一段可以不讲,但讲了会让整堂课的分量完全不一样 ——  因为它顺手回答了一个学员要到最后才会问的问题: 「为什么第三个旋钮必须混着用?」那不是工程经验,是有理论下界的。

滚到 fig3-info-law。

开场先承认上一格是直觉版「刚才我说『远处的信息可以少看』—— 这句话听着像常识。 但它其实是可以算的,而且算出来的结论跟直觉有出入。」

① 先分清两个互信息。 「第一个是两点互信息:两个 token 之间的相关性,随距离幂律衰减。 这里有个很漂亮的结论:任何马尔可夫过程、隐马尔可夫过程,互信息都是指数衰减的; 而实测的自然语言是幂律这就是语言不能用马尔可夫模型近似的原因 —— 幂律的尾巴,指数怎么都够不着。」

「第二个不一样:双部互信息。把一段序列从中间切开, 问前一半和后一半之间有多少互信息。这个量随长度是幂律增长的。

学员一定会觉得这两句矛盾,主动拆开「一个在衰减,一个在增长,不矛盾 ——  单对的相关性越来越弱,可是成对的数量越来越多。」 指第二格。

② L2M 条件。 「有一条很朴素的界:模型能表达出来的互信息,受限于它历史状态的维度 —— 缓存里装不下的东西,它就是不知道。 于是得到一个必要条件状态维度必须至少以同样的幂律增长, 否则总存在一个长度,它兜不住。」

「Transformer 呢?—— 它的 KV 随长度线性增长, 线性比那条次线性的幂律还快,所以它自动满足。」

⭐⭐ 这句要点透,它是整堂课的一个支点「注意 Transformer 的『自动满足』是拿平方计算换来的 —— 它其实是供给过量。」 指第三格。⛔ 先说口径再讲内容。

⚠️ 「下面这一格是我按定义推的,论文没有逐个旋钮分析。」 「旋钮①,MLA、GQA 压的是每个 token 存多少 —— 阶还是 L,动的是常数,安全。 旋钮②,稀疏 —— 注意,KV 照样全存着,只是这一步不读它,状态仍然是 L,安全。 旋钮③,固定大小的状态 —— 阶掉到 O(1)。」

⭐⭐ 落点,慢: 「前两个旋钮动的是常数,第三个动的是阶。 这是一条质的分界 —— 也是为什么今天没有一个纯线性注意力的前沿模型,它们全都是混合的。」
⭐ 埋钩子:「等会儿第八节讲混合的时候,回来想这一格。」
最后补三条口径,一条都别省「一,L2M 是必要条件不是充分条件 —— 状态够大只是『有可能记住』, 不等于『真的学会了』。二,第三格是我的推导。 三,两点互信息和双部互信息是两个不同的量,别拿一个去推另一个。」

⭐ 右栏收口:「于是压缩、稀疏、分层都变得合理 —— 它们不是三个技巧,是这三个观察各自的直接后果。」

【交汇处】约 1 分钟。⭐ 这一节真正的产出在这儿,别当收尾一带而过。

「A 说必须省,B 说可以省而不太亏这两句缺一不可。
只有 A:你得到的是一堆有损压缩的权宜之计,效果掉了只能认。
只有 B:你没有动力去付 kernel 那么难写的代价。
两条合起来,才解释了为什么这个方向三年里投了这么多人 ——  它同时是一件不得不做、又做了不太亏的事。」

⭐⭐ 最后给出这一讲的判卷标准,后面每一支都要用它「所以判一个变体好不好,就看它在「省了多少」和「亏了多少」之间落在哪。

段尾钩子「下一节本来要讲 FlashAttention ——  但它不在这三个旋钮里。我只用两句话交代,然后直接进骨架。」

⛔ 这一节在课件里已经折叠了,别默认要讲 现场原话:「FlashAttention 在这个专题里不合适,它过于底,太容易把主线给忽略了。 你把它先给它折叠起来,有兴趣的同学可以点开看。」
但它不能整节拿掉:上一节刚砸完 488 GiB, 不先说清「那个大家伙根本不落地」,后面所有「怎么少算」的讨论都建在恐慌上
📌 课件外面只剩两样:那句「矩阵从来没被完整存下来过」, 和「它跟三个旋钮不是一类东西」那张对照表。台上默认也只讲这两样,2 分钟。

【默认版 · 2 分钟】只说两句:
「那个 n 乘 n 的注意力矩阵,从来没有被完整存进显存过 —— 所以这一讲的账本里根本没有它,488 GiB 那笔账不受影响
② 指对照表:「注意它跟今天后面三个旋钮不是一类东西: 三个旋钮改的是算什么,模型变了、通常要重训; FlashAttention 一个字都不改数学,它改的是怎么算跟谁都能叠,而且必须叠。
然后翻页,别恋战。

什么时候才展开那个折叠: ① 台下明确问「为什么融合完还是只跑到三成多」; ② 这一场的听众是写 kernel 的; ③ 时间富余 ≥ 10 分钟。
其余情况一律不开 —— 那一段是硬件细节,展开就把主线冲散了, 而这一讲的主线是「三个旋钮」,不是「怎么把一个算子写快」。

📌 历史包袱说明:这一节 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(原逐字稿,展开时用)

课件第一节。这一节占 12 分钟,是全讲最长的一节。 先立规矩,这一节最容易讲砸的方式是把它讲成科普。
原理快走,天花板慢走。 台下要的是「它的极限在哪」,不是「它怎么工作」——  后者他们多半已经知道。

开口一句话定位三个旋钮改的是算什么, FlashAttention 一个字都不改数学,它改的是怎么算

然后快走原理:朴素写法三步,中间那个 L×L 的 S 每一步都要落一趟 HBM, 三步四趟;128K 单头就是 32 GiB。融成一个 kernel,S 整项消失。
⭐ 顺带把可迁移的那句说出口:FLOPs 一分不省,省的全在 「中间产物不落地」这一行 —— 这是所有算子融合共有的形状。

2026-09-14 更正:这里原来写「滚到 1.2b」—— 错的。 伪代码在 3.2b;1.2b 是讲 softmax 的那一节。 (1.2b 确实存在,所以对账 lint 放行了 ——  指错地方和指向不存在,是两种错,只有后一种查得出来。 滚到 3.2b 那两段伪代码。这里开始慢。

那张经典图画的是第一版的循环顺序:外层 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 倍。

⭐⭐⭐ 这是本格的落点,慢慢说「差额去哪了?—— FA2 把省下的 O 流量,又用 K/V 的重读还回去了。 K/V 在第一版待在外圈、只读一趟;到第二版跑进内圈, 每个 Q 块都得把全部 K/V 重新走一遍。」
⭐ 所以这次对调换来的不主要是带宽,是并行度 ——  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 当成真指针报出来。)

滚到 3.3 这里一定会有人在心里嘀咕「不就存两个数吗」 ——  主动拆开,别等人问
「那两个 running 值确实很小,每行各一个标量。 真正占地方的是 S 那一整块 —— 它是 [bq, bkv], 512 见方就是 1 MB,2048 见方是 16 MB。」

然后讲生命周期S 要连着走完「产出 → 求最大值 → 减完取指数 → 喂给第二个矩阵乘」四步才能扔,而中间两步是向量单元的活、两头是矩阵单元的活 —— 矩阵单元想开工,输出却还被向量单元占着
再加流水线要重叠,就得同时留住好几块 S。

滚到 3.5 那张块大小的表,再滚一格到 fig3-three-walls这是我们自己的数,可以慢慢讲。 ⏱ 约 3 分钟。

先把表读对,这句别省「基线是 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)。

⛔ 这句必须说,否则学员会以为「调调参就能好」: 「三层没有一层是配置能救的 —— 要么改 head_dim,要么改 kernel 的数据流。」 收口那句,它是通往第二节的桥: 「『怎么算』这条路到这里基本走到头了。中间产物已经不落地、 块大小已经贴着三堵墙,而算子仍然只跑到三成多 ——  剩下的空间只能去改『算什么』。」

讲稿 · 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 倍, 带不走任何可迁移的东西。

滚到 fig3-mla-why。三格是一条推理链,别当三个知识点讲。

① 先算一笔账。「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 这张一样宽,可它根根分明 —— 因为它没有『原稿』那一步。训练的时候格子就这么大, 模型自己决定这三笔写什么。

⭐⭐ 这一格真正的落点在这儿,而且它是今天的一条暗线「一样宽,区别不在压得多狠,在什么时候变窄的。 那些工作是近似 —— 训完了再去凑。 MLA 是约束 —— 从第一天就按 512 训。」
⛔ 说完立刻埋钩子:「记住这个对立。等会儿讲稀疏的时候它会原样再来一次, 名字叫『推理期稀疏』对『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 就只能在仓库里先算出来, 那等于又存了一份没压缩的 KMLA 白压了。

⭐⭐⭐ 这里有一层可以多讲三十秒,讲完这节的分量就不一样了 —— 台下总有人会想「不就是中间多个矩阵吗,乘进去不就完了」。 他想得没错,所以得正面回答他。

指黄框,左右各一堆牌 —— 这一格靠的是「一块」和「一摞」两个形状, 不靠念字「有人会说:中间多一块矩阵怕什么,乘进去就是了。」

先指左边那一块对。如果那块是固定的,真就乘进去完事了 —— 三个矩阵乘成一个,跟 ① 没有任何区别。」
再指右边那一摞「可 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 真正解决的是第二个。

滚到 fig3-dsa-why,指第一格。

① 这个是经验事实,而且早于 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 压得狠、不挑一个位置都不漏, 可每个位置只剩一个很糙的摘要 —— 它。」

⭐⭐ 然后合起来,这是全段的落点「两种坏法正好相反。所以把它们交错摆着 —— 让它们互相兜底: CSA 层负责看得细,HCA 层负责别漏掉。」
📌 一定要交代口径「这个解释是我从两者的定义推出来的, 论文只说了采用交错混合配置,没给这个理由。」 ⭐ 说这一句不会减分,反而会让前面那些引用更可信。

「成绩:一百万上下文下,V4-Pro 只要 V3.2 的 27% 的单 token 推理 FLOPs10% 的 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 线性注意力:一块固定大小的记事板

⭐⭐ 2026-09-13 新增。这一节现在从 7.0 那块记事板开讲, 跟着 fig3-notepad 走
⛔ 这个比喻是现场给的,而且现场说它「对理解非常重要」——  别把它当成一个可有可无的类比,它是这一节的主结构。

开场就把比喻摆出来,一句话三代「想象一块固定大小的记事板。你可以疯狂往里写,后写的盖住先写的; 也可以先把要写的那个位置擦干净,再写; 还可以挑着擦 —— 哪些该留、哪些该擦,让模型自己学。 这三种写法,就是这一支的三代。

指第一格,先说清「板子」是什么。

「板子就是那个状态,一块 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 那一支。」

⚠️ 第四张要点明它的身份,别让人以为是原文里的「前三张是 Mamba-2 那张图明确列出的对应关系; 第四张是我们按同一个框架推的,原图里没有这一格。 ⭐⭐ 这一格最有用的东西,说给会去读论文的人听「学会这个之后你会发现一件事: 一篇自称 SSM 的论文,和一篇自称 linear attention 的论文, 很可能在讲同一个东西 —— 只是一个从递推那头写,一个从矩阵那头写。 所以拿到新论文别先看它自称什么,先问它那张 L 长什么样。 ⚠️ 然后立刻刹一句,否则会被理解成「都一样」「但别把这句话听成『所以它们没区别』。 框架一样,不代表模型一样 —— L 换一张,表达力和能不能算得动都跟着变, 这正是上一格那条演化线在折腾的全部内容。」 指第三格右边那块橙色的。⛔ 这句是给下一节埋的伏笔,别当结论讲。

「最后记一个数就行,等一下 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 混合:配比是一条轴

2026-09-13 新增。跟着 fig3-hybrid 走。 §八 有五张表,别念表 —— 先用这张图把结论立住,表只在有人追问时翻。

⭐⭐ 开场一句「混合不是一个技巧,它几乎是唯一的答案。 因为单用任何一个旋钮都有致命短板。」

「只用滑窗 —— 跨不了长距离。只用纯全注意力 —— KV 和 FLOPs 都爆。 只用纯线性 —— 精确检索塌。」

⭐⭐ 第三条现在可以讲得比以前硬得多,这是今晚新加的「『纯线性不行』不只是实测不行。回到第二节那条 L2M 条件 —— 状态维度必须至少跟双部互信息同阶增长, 而纯线性的状态根本不增长总存在一个长度,它必然兜不住。
⭐ 所以「必须混合」是有下界的,不是工程经验。 ⛔ 口径:论文分析的是状态空间模型那一类,套到「配比为 1:0」这一步是我们的推导。
⭐ 指中间那格。那不是一条轴了,是一片点 ——  一个点一个模型,一共 14 个。别念型号,念形状。

① 先让台下看高矮「哪一摞最高?3:1,五个模型。 这就是『大家都在哪』—— 不用数,堆在那儿。」

② 再让台下看最左边那一摞「1:1,两个点, 都是橙的。橙色是滑窗 / 局部。绿色那一族最靠左的是 3:1 ——  做线性混合的,没有一家敢一比一。」 ⭐ 想不起来哪个色是哪族,就指下面那两条区间条的颜色, 不要现背。

❓ 想追一句可以问:「为什么线性不敢,滑窗敢?」 一种读法是:滑窗层毕竟还是注意力,只是不看远处;线性换掉的东西更多, 得多配几层来摊。⛔ 但要如实说这是读法 ——  没有哪篇论文这么归因过,别讲成结论。
⭐⭐ ③ 最后才讲颜色,这是这一格真正的收获「绿的是线性混合,橙的是滑窗 / 局部混合。 看下面那两条区间条 —— 绿的从 3:1 到 7:1,橙的从 1:1 到 6:1, 中间这一大段是重叠的。」
⏸ 停一拍。
「一边是拿一个固定大小的状态去换长度,一边是干脆不看远处。 出发点完全不一样,最后停的地方却一样。这件事本身就是一条证据。」
⚠️ 两个一定会被问到的
①「橙色那族里为什么有 Llama 4 Scout?」—— 它的便宜层是分块局部注意力, 归在滑窗 / 局部这一族,不是线性。族的划分按 §8.4 逐家核过的旋钮来
②「那条绿色阴影和重叠段为什么一样宽?」—— 如实答: 消融给的建议区间是 3:1~6:1,各家自己选出来的重叠段也正好是 3:1~6:1。但别说成因果 —— 一个是扫出来的建议,一个是各家独立选的结果, 重合值得注意,不等于谁导致谁。
⚠️ 紧接着就要防住「把 3:1 背成常识」3:1 是消融出来的,不是推出来的。 同一家不同规模就换配比 —— Ling 的 tiny 是 3:1,flash 就是 5:1。 记『3:1 到 6:1 这个量级』就够了,区间比点值可信。」 ⭐⭐ 然后是这一节最值得讲的一句,它在轴的左端「Kimi 的消融里,0: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 新增 —— 全讲唯一一次让台下动手)

严格 60 秒,别拖成讨论。 ⭐ 这一段的价值不在答案,在于让每个人真的把笔放到纸上一次 ——  前面一整讲都在教「拿到新名字先把它放进某一格」, 而在这之前,所有名字都是我放好的。

开场就一句,不要解释规则太久「屏幕上三个机制,今天都提到过,但我一个都没明说它们归哪儿。 每个回答三个词:哪个旋钮、事后还是 native、省字节还是省 FLOPs。 六十秒,写在纸上 —— 写下来,不要只在脑子里想。

六十秒里你什么都别说。 (真的闭嘴。有人抬头看你,就指一下屏幕。)

对答案时按这个顺序,最后一道留最久
A · CLA —— 「旋钮①、native、省字节。旋钮① 到今天一共三招: MQA 砍头数、MLA 压维度、CLA 减层数 ——  三招都在回答同一个问题:那份要留下来的有多大。
B · KV 量化 —— 都不是。这是个陷阱题, 而且是我在 §四 主动说掉的那个:三个旋钮管『存几个数、读几个数』, 量化管『每个数几个 bit』。它正交。
C · IndexShare —— 也都不是,而且这道最难。 它不改『读哪些』—— 它省的是旋钮② 自己的开销(那个索引器)。 所以它是旋钮上的优化,不是旋钮。而且注意:KV 一个字节都没少。

⭐⭐ 收这一段,这句才是目的「三道里有两道答案是『都不是』—— 我是故意的。 一张分类表真正的用处不是什么都装得下, 是让装不进去的东西显形。」
⭐ 接回 §4.2b 那句:放得进去的,你已经知道它的优点和代价了; 放不进去的,才值得你花时间。

⚠️ 时间紧就整段跳 —— 它是 §八 之后的加餐, 别只讲题不对答案:那比不讲更糟。

讲稿 · 9.1 把 ↓↓↓ 换成毫秒(⭐ 2026-09-14 R26 新增)

跟着 fig3-perstep 走。⏱ 两分钟。 ⛔ 时间紧就只讲下面标了「必讲」的那一条 ——  另外两条是彩蛋,砍掉不影响后面。

开场先自嘲一句,台下会更买账「上面这张表每一格都是箭头。可我们这一讲从头到尾在说 『问省了多少之前,先问省的是哪一样』 ——  箭头恰恰答不了这个。所以把同一批方案,换算成一个能拿计算器核的问题: 吐一个字,要从显存上搬多少字节?

指第一格,两样东西,快走。

「一步要搬两样:激活权重,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 赌出来)—— 可以点一句,他们会有「又来了」的快感。

⭐ 彩蛋(时间够再讲): 「MLA 之后再上稀疏,单用户 decode 只再快 1.24 倍 ——  因为这时候瓶颈已经搬到权重那一段去了这不是稀疏没用,这正是上面那张表里『DSA:prefill 为主』那一格的数值版。 下台阶之前必须补这一句,否则会教出反效果「⚠️ 这是 batch 等于 1 的账。权重那段是所有人分摊的,KV 那段不摊 ——  人一多,画面会翻回 KV 主导。 这正是第二节那张图的另一面:那里是把人加上去,让 KV 当主角; 这里是只留一个人,让权重当主角。同一个模型,问法不同,答案就不同。
⭐ 这句话顺手把下一段的主题递出去了 —— 下一段讲的就是瓶颈的搬家史

讲稿 · 9+10 落点:三种资源之间的搬家史

⭐⭐ 2026-09-13 新增。跟着 fig3-landing 走。 ⛔ 这是整堂课的落点 —— 时间再紧也不能压这一段。

⭐⭐ 一句话开场「今天讲了这么多名字。现在退一步看,这整部变体史其实是一件事 ——  在三种资源之间反复搬家:显存、算力、访存规整度。

早期搬显存: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 新增)

⭐⭐ 跟着 fig3-tpu-gap 和 fig3-tpu-fix 两张图走。 ⭐ 这一段是这门课唯一有资格讲、别人讲不了的部分 ——  如果台下是做 infra 的,这五分钟比前面任何一节都值钱。

⭐⭐ 开场一句就把姿态定住,别让人听成 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 的人,含糊一句就被抓住了。

⭐⭐ 收这一段,用跨层共享把它跟 §6.5b 接回去「还记得 §6.5b 那个 IndexShare 吗 —— 四层共用一个索引器。 那一招在 TPU 上比在 GPU 上更值钱: GPU 上省的是索引器那点算力;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 故事线审计新增)

严格 2 分钟,跟着 fig3-gun 走。这是全场最后一句话,不许赶、不许改成「今天就讲到这」。
⭐ 判据:开场我们许了一个极其具体的承诺(那 512 倍)。 许了没还,学员散场时带走的是一个没闭合的圈。

先把开场那句原样搬回来「今天一开始我说 —— 2020 年的 GPT-3 记 2048 个 token, 今天的模型记 100 万。这一讲讲的就是这 512 倍 是怎么换来的。
现在,把这笔账算完。

⭐⭐ 然后别急着给答案,先用本课自己的方法问一句「第九节那句话还记得吗 —— 问『省了多少』之前,先问『省的是哪一样』。 这笔 512 倍,它不是一笔账,是两笔。 ⭐⭐ 2026-09-14 改版:这一格不再是两张表,是两根一样长的条 —— 先用手横着比划一下两根条的长度,让台下看见它们等长, 再分别走。⛔ 别一上来就念数字,数字是这一格最不稀奇的东西。

手沿着上面那根条从左往右走显存账 ——  一个人要占多少。绿的这一大段,是旋钮① 的 MLA 把每一份压小, 56.9 倍;接着这一段,是混合三比一,再 4 倍
然后手停在最后那一小截红的上面「整条条就是那 512 倍。前面两段是省出来的, 末尾露出来的这一小截,才是六年里真正多买的硬件 —— 只有 2.25 倍。

⛔⛔ 讲者须知:这是对数刻度,两句话不许说 ——  别说「绿段占了大半,所以省下的是大半」,也别把段长当百分比读。 ⭐ 正确的读法只有一句:段长是「乘几倍」,相邻两段是相乘; 三段正好铺满整条,说明没有第四个因子躲在别处

再走下面那根,这一段要慢带宽账 —— 每走一步要读多少。 这一笔旋钮② 一个人还,而且它一个字节都不省显存,KV 全存着。
稀疏注意力每步固定只读 2048 个。一百万除以两千零四十八 ——  正好也是 512。

⭐⭐⭐ 这句要指着图说,是这一格的全部「所以下面这根条 —— 一点都没露。 ⭐⭐⭐ 这句说完停三拍,这是全场的落点「上下文涨了 512 倍 —— 它一个都没多读。

⚠️ 诚实那一句不能省,就在这儿说「⛔ 我得说清楚:这是把今天学到的三样叠在一个模型上的推演, 不是某一个真实模型的实测。56.9 倍是 V3 口径核过的, 4 倍是 Kimi Linear 的配比 —— 两者不在同一个模型上。 而且两个 512 会相等是个巧合:GPT-3 的上下文长度和 DSA 的 k 恰好都是 2048。」

⭐⭐ 最后一句,慢,说完就结束,不要再补任何东西「所以这六年真正变的不是机器 ——  是『一个 token 到底该花多少钱』这件事,被重新定价了。
⚠️ 这一讲最容易跑偏的三个方向(⭐ 2026-09-13 重写 —— 上一版四条全是旧坐标)上一版写的是「别把第一节讲成 FlashAttention 科普」「别把块大小讲成调参技巧」 「别在第二节起逐个念名词」—— FA 已经不是第一节而且只有 2 分钟、 块大小在折叠里根本不上屏、名词表在 §四 不在 §二。 现在真正会翻车的是下面三条。

① §六 超时。 ⏱ 全量 20.5 分钟,是全场最长的一节, 而它前面还压着 §五 的 16 分钟。⭐ 对策:滑窗那个侦探故事和 DSA 那个鸡生蛋 只深讲一个,另一个只念落点带。
② §五 和 §六 的两个侦探故事都讲。 ⛔ 两张都是完整故事,讲一张就够立住「看一个机制先找它在修什么毛病」这个姿势; 两张都讲,第二张的惊讶感会掉一半,而且直接吃掉 §七 的时间。 ⭐ 也别两张都不讲 —— 那样这一讲就退回成名词表。
③ 照念那张 44 行模型表。 ⛔ 投影上没人看得清,念完十分钟没了。 ⭐ 只讲两列:KV 那一列 576 GiB → 697 MiB, 和上下文那一列 —— 过 1M 的十二家无一例外动了②或③。其余一律「课后自己排序看」。

🚧 还没想清楚的(2026-09-07 从教材搬过来)

这三条原先长在教材正文最后 —— 学员读到「要不要把 GQA-8 那一行也画进图里」什么也学不到,只会读到一个信号:这份材料还没做完
⭐ 但也不能删:它们是真的没想清楚,删了就是假装想清楚了。 所以搬到这儿 —— 只有讲课的人会看的那一份。
  • [x] §1.1 要不要把 GQA-8 那一行也画进图里 ——  ✅ 已解决(2026-09-13):§五 那张四行表(MHA / GQA-8 / MLA / MQA) 把四个都列了,而且不靠柱子高度,靠数字并排。 ⭐ 顺带证实了当初那个直觉 —— 比例太悬殊的量,就不该用长度去编码。
  • [ ] §7.4 的 chunk 大小要不要真的给一个数(原写「§5.4」,已重编号)——  给了就得说清是哪个硬件、哪个实现,否则会被当成通用常识背下去。 倾向于只给「被片上内存顶死」这个约束,不给数
  • [ ] §十一 那条时间线的 2026 一行会过时(原写「第九节」,已重编号)——  需要一个约定:每次开课前只更新这一行,前面几行是稳定的

📌 想清楚一条就从这儿划掉一条,并把结论写进对应小节。 ⛔ 别在教材里回答这些问题 —— 教材只呈现结论,不呈现「我们当时在纠结什么」。