从llama2到Qwen3.5-MoE,再到DeepSeek-V4-Flash——架构变迁笔记
“The old order changeth, yielding place to new,
And God fulfils himself in many ways,
Lest one good custom should corrupt the world.”
“旧的秩序变换,把位置让给新的。
神以许多方式成就自己。
免得一种好习俗,把世界败坏掉。”
(Alfred Tennyson《Idylls of the King》)
(The Passing of Arthur)
“8 月 29 日”
蝉叫得比上周敷衍,像是知道不会有结果,还是要叫那么几声。
水塔的影子宽了一指。上周 4 指,这周 5 指,用脚量的。
我偶尔会思考这种事情。
一副牌被洗过 1000 次之后,还是不是原来那一副。
……不对。
我真正在想的,是比那没有意义 100 倍的事。比如,为什么换了名字的东西,跑起来还是老样子呢。
水科:「你在数什么呢」
我:「影子……」
水科:「影子有什么好数的」
我:「宽了一指」
水科:「所以呢」
我:「所以夏天要结束了……」
她从裙子口袋里摸出一副牌。便利店买的,380 円。
牌盒上印着一个名字,被胶带盖掉了一半。
我:「纸牌要做什么」
水科:「讲为什么 256 个人里,只叫 8 个起来干活」
我:「听起来很像便当的分法呢……」
水科:「超×1000 蠢!」
牌角的字母被磨掉了,摸上去只剩一道压痕,看不出是 Q 还是 9。
我:「这牌还能用吗……」
水科:「能用。认牌不看字」
我:「那看什么……」
水科:「看它在第几张……」
蝉声停了一拍。
我:「三代模型……」
水科:「三代」
我:「名字全换了……」
水科:「骨架没换」
我:「骨架是指……」
水科:「你数影子的时候,影子的骨架是什么」
我:「水塔吧……」
水科:「水塔没动。动的只是太阳」
我:「所以名字是太阳」
水科:「名字是胶带」
上周贩卖机吞了我一枚硬币。我按了草莓味,出来的是苏打味。
管理人说明天再说。明天就是今天,他也没有说。
对我来说,被换掉的东西,就只有这种程度。
那么,被换掉的名字还算不算数呢。如果动的只是名字,被数着的又是什么。
……啊哈哈,想太多了。
蝉在叫。
比上周敷衍。
水塔的影子,宽了一指。
那副牌还在她口袋里。
第一章 A Straight Line 「一条直线」
“8 月 29 日”,放学后的屋顶。
冰买回来了。两支草莓味。
因为只剩两支,谁也没有赢。
水科把牌摊在水塔影子的外面。52 张,一张不缺,摊成一个长方形。
我:「你不热吗?」
水科:「热。摊开」
我:「……」
水科:「这是 2023 年的形状。llama2,一条直线……」
1 | input_ids [B,S] |
我:「就这些?」
水科:「词表 32000,hidden 4096,32 层。进去是编号,出来还是编号」
进去是 [B,S],出来是 [B,S,32000]。B 是几个人一起问,S 是问了多长。
我:「32 层是什么?」
水科:「32 个一模一样的东西。形状一样,权重不一样,图纸一样」
风掀起最上面那张牌,翻了过去。牌背的花纹磨花了。
水科:「每一个,都是这个形状……」
1 | x ─┬──────────────────┐ |
我:「两根线……」
水科:「一根是主流,一根是绕过去的那条……」
x ← x + sublayer(x)
绕过去的那条什么都不做。所以它永远在。
我:「先归一化,再算,再加回去?」
水科:「norm 在子层之前,叫 pre-norm」
我:「之前和之后有区别吗」
水科:「放在后面,残差也要先被归一化一遍」
我:「我不懂……」
水科:「不懂就记位置。这两个位置,三年没动过」
蝉。
一声。
又一声。
我:「那现在呢?」
水科:「Qwen3.6 和 DeepSeek-V4 都发了」
我:「所以形状变了?」
水科:「直线还在。变的是管子里的东西」
我:「听起来像水管」
水科:「以前比谁的水管粗,现在比谁的水管巧」
我:「巧是指……」
水科:「总参数和激活参数解耦了。1000 本书,每次只翻 8 本」
我:「那不算读了 1000 本吧……」
水科:「书架上还是 1000 本……」
我:「好狡猾……」
水科:「是省钱」
冰化了一半,糖水顺着木棍流到手指上。
我:「还有别的吗?」
水科:「序列一长,代价平方地涨」
我:「平方?」
水科:「100 个字,一万次注视。一万个字,一亿次」
我:「一亿次!」
水科:「所以都在把它压回线性……」
我:「压回去了吗……」
水科:「一半压成递推,一半压成条目」
我:「听不懂……」
水科:「后面讲」
我:「加速呢?」
水科:「也做进权重里了。以前部署时想办法,现在训练时就想好了」
我:「做进权重?」
水科:「投机解码,量化,全都是一等公民」
我:「一等公民是什么?」
水科:「不用买票的那种」
我:「那你怎么知道这些的……」
水科:「读 config。论文会撒谎,config 只会不完整」
我:「不下权重也能看?」
水科:「safetensors 的头就是一段 JSON。形状和张量名都写在里面」
我:「名字……」
水科:「名字最诚实。写着 gate 就是 gate……」
我:「训练和采样呢?」
水科:「不讲。只谈结构。结构能查,别的能编」
我:「看结构是很有必要的……」
水科:「你终于说了一句人话」
我把木棍插进空杯里,像插一面很小的旗。
我:「那这条直线,后来还直吗?」
水科:「第一次还直……」
我:「第二次呢?」
水科:「第二次就不直了……」
第二章 Three Components 「三个组件」
“8 月 29 日”,傍晚的教室。
日光灯只开了一半。另一半坏了三个月,没有人报修。
水科把牌从屋顶一路拿到教室,一张也没有少。我数过,数了三次。
水科:「三个组件。注意力,FFN,归一化……」
我:「就三个?」
水科:「32 层全是这三个……」
她把 52 张全摊在桌上。
啪。
水科:「你是一个 token。你要碰每一张牌,一张都不能少」
我一张一张翻过去。翻到第 20 张,手指头开始酸。
我:「好累……」
水科:「这就是稠密。每个 token 激活全部参数,所以后面要改」
灯管嗡了一声。
水科:「注意力。Q、K、V 各自一个线性投影,Q 和 K 还要转个身」
我:「为什么只转 Q 和 K」
水科:「RoPE,旋转位置编码。点数的是谁跟谁相关,V 是被拿走的东西」
softmax(QK^T/√d_k)V
Q,K,V ∈ R^{B×H×S×d_h}
我:「根号是什么?」
水科:「除掉头维度的根号……」
我:「为什么要缩放……」
水科:「不缩放,softmax 会一头栽进最大值里。梯度就没了」
我:「哦……」
水科:「7B 是 32 个头,每头 128 维,乘起来正好是 hidden 4096」
我:「正好吗?」
她把牌分成两堆。一堆 8 张,一堆 44 张。
水科:「FFN 是 SwiGLU。三个矩阵,gate、up、down」
我:「gate 和 up 有什么不同……」
水科:「gate 过 SiLU,up 不过。逐元素相乘,再 down 回去」
W_down(SiLU(W_gate x) ⊙ W_up x)
我:「inter 是多少?」
水科:「11008。约等于 8/3 乘 4096……」
我:「为什么不是 4……」
水科:「3 个乘 8/3,等于 2 个乘 4」
我:「……好整齐……」
水科:「整齐是设计出来的」
RMSNorm(x) = x / √(mean(x²) + ε) · γ
我:「γ 是什么?」
水科:「可学习的缩放。一共 d 个,沿最后一维广播,一格乘一格」
我:「ε 呢?」
水科:「防止除以零。它不减均值,所以比 LayerNorm 少一步」
咔。
窗外有人在踢罐子。
水科把两张牌叠起来,一张压一张。
水科:「两个规格。7B:32 层,hidden 4096,中间维 11008,上下文 4096」
水科:「Q 头 32,KV 头 32,head_dim 128。一样多,这叫 MHA」
水科:「70B:80 层,hidden 8192,中间维 28672,上下文还是 4096」
水科:「Q 头 64,KV 头 8。8 个 Q 头共用一个 KV 头,叫 GQA」
我:「8 个……为什么要共用」
水科:「为了 KV cache。这个词你后面会一直听到」
我:「那参数是怎么算出来的……」
水科:「逐层累加」
32 × ( 4 × 4096² + 3 × 4096 × 11008 )
- 2 × 32000 × 4096 ≈ 6.7B
4 是 Q、K、V、O,四个投影。
80 × ( 2 × 8192² + 2 × 8192 × 1024 + 3 × 8192 × 28672 )
- 2 × 32000 × 8192 ≈ 69B
2 个 8192² 是因为 GQA。1024 是 8 个 KV 头乘 128。
我把牌收成一叠,牌角那道压痕对着我。
摸不出是 Q。也摸不出是 9。
水科:「记住三件事……」
我:「三件……」
水科:「第一,稠密 FFN。每个 token 全员到场……」
我:「全员……」
水科:「第二,全注意力。每层都是 O(S²),KV cache 线性地长……」
我:「线性地长……」
水科:「第三,只有一条残差流。x 加 sublayer(x),从头到尾一条」
我:「这三件事后来都变了吗?」
水科:「第一件和第二件,第一次演进就变了」
我:「第三件呢?」
水科:「第三件撑到第二次」
我:「撑……」
水科没有回答。她在数牌。
从教室的窗户看出去,水塔的影子正好落在操场边上。
蝉在叫。
比上周敷衍。
水塔的影子,宽了一指。
那副牌还在她口袋里。
第三章 The Same Skeleton 「同一个骨架」
“8 月 30 日”,便利店前的自动贩卖机。
就是上周吞了我硬币的那台。它看上去一点也不心虚。
我:「猜拳」
水科:「为什么?」
我:「谁输谁按按钮……」
水科:「超×1000 蠢!」
她赢了。她按了草莓味,出来的是苏打味。
我们两个人都没有说话。
水科:「……这就是演进」
我:「什么?」
水科:「你按下去,以为会出来你以为的东西」
她蹲下去,把牌摊在贩卖机的阴影里。
影子很窄。牌摊不下,有一半压在阳光里。
水科:「Qwen3.5-MoE。还是一条直线」
input_ids [B,S]
↓ Embedding (248320 → 2048) → hidden [B,S,2048]
↓ 40 × Block → RMSNorm → lm_head (2048 → 248320)
logits [B,S,248320] └→ MTP 块 (0.84B)
我:「词表变成 248320 了?」
水科:「从 32000 变上来的。要认更多东西,也因为要看图」
我:「看图……」
水科:「embedding 里有 image 和 video 的占位……」
我:「占位……」
水科:「进去是占位,出来被视觉特征替换掉」
水科:「管子变细了,4096 变成 2048。层数 32 变成 40」
我:「上下文呢?」
水科:「256K。llama2 是 4096……」
我:「呜哇!」
水科:「总参 36B,其中 32.2B 是专家权重……」
我:「九成?」
水科:「九成。40 层 × 256 专家 × 3 矩阵 × 2048 × 512」
我:「……我算不过来……」
水科:「不用你算……」
我:「那每个字用多少?」
水科:「约 3B」
我:「36B 里用 3B?」
水科:「剩下的在等着」
我:「等着……」
蝉。
一声。
没有了。
我:「尾巴上那个 MTP 是什么」
水科:「多算一步的人。0.84B。后面讲……」
她抽出 8 张牌,摊在影子最窄的那一条上。
水科:「Block 的内部,你自己看……」
1 | x ─┬────────────────────────┐ |
我:「……骨架一样……」
水科:「norm 还在子层前面。残差还是那一句」
我:「那换了什么?」
水科:「位置里的人……」
我:「人……」
水科:「全注意力换成混合注意力,3 层线性 1 层全」
水科:「稠密 SwiGLU 换成 MoE,256 选 8,外加一个共享」
我:「两个都换了?」
水科:「两个都换了……」
我:「那还算同一个吗?」
水科:「你问我……」
我:「……」
我把手机掏出来。
昨天夜里有一个帖子,我截了图,一直没删。
1∶无名氏∶2026-08-29(土) 21:14:03 ID:aK9rM0
换了名字的 llama2 罢了 www
2∶无名氏∶2026-08-29(土) 21:16:44 ID:Zn4Qp
>>1 骨架是 pre-norm 残差,两个子层的算子全换了,你管这叫罢了
3∶无名氏∶2026-08-29(土) 21:19:02 ID:aK9rM0
>>2 那到底算不算同一个模型(笑)
4∶无名氏∶2026-08-29(土) 21:23:37 ID:9xLK2
贴 config:40 层,hidden 2048,上下文 256K,词表 248320
5∶无名氏∶2026-08-29(土) 21:24:10 ID:9xLK2
总参 36B,每 token 激活约 3B。3B 是怎么算的 www
6∶无名氏∶2026-08-29(土) 21:40:19 ID:c0Nfg
>>5 你漏了共享专家,漏了注意力投影,还漏了 embedding 和 lm_head
我:「第 5 条被第 6 条扣了分」
水科:「扣得对」
我:「为什么?」
水科:「因为他只算了专家……」
我:「那 3B 到底是什么……」
水科:「明天讲……」
我:「明天?」
水科:「你现在连 8 张牌都数不清楚」
贩卖机后面站着一个人。
不知道站了多久。
三日月:「呵呵……」
我:「呜哇……」
三日月:「你们在吵同一个的问题」
我:「同一个……」
三日月:「假设 1……名字只是贴在盒子上的胶带……」
三日月:「撕掉,里面还是那一副牌……」
我:「……是这样吗?」
三日月:「假设 2……骨架也不是它自己的……」
三日月:「pre-norm 也是别人贴上去的名字……」
我:「那撕掉之后呢?」
三日月:「假设 3……剩下的,只是没有人愿意重新数一遍的东西……」
水科:「……」
三日月:「假设 4……如果算子都换掉了,那个『同一个』住在第几层……」
我:「第几层……」
三日月:「40 层里,没有一层叫同一个……」
她把手里的硬币投进贩卖机。
硬币滚回来的声音,和上周一样。
三日月:「这些都只是注释……」
三日月:「你想要多少,就可以增加到多少?」
她走了。
苏打味已经不凉了。
我喝了一口,很甜,甜得有点敷衍。
对我来说,同一个不同一个的问题,就只有这种程度。
第四章 Two Hundred Fifty-Six 「二百五十六张牌」
“8 月 31 日”,图书室。
空调坏了三天。管理员说,明天修。
明天已经说了三天。
水科把牌洗了四遍。
啪。啪。
我:「洗四遍做什么?」
水科:「当作 256 张」
我:「只有 52 张……」
水科:「那就当每张牌是 5 张牌」
我:「……好随便……」
水科:「llama2 每层只有一个大 FFN。4096 到 11008,再回来」
我:「3 个矩阵,约 136M……」
水科:「每一个 token 都要把它整个走一遍」
我:「全员到场……」
她把牌分成两堆。一堆很高,一堆只有一张。
水科:「Qwen 把它拆了。256 个小专家,外加一个共享」
我:「256 个……」
水科:「每个 token 只过 9 个。8 个从 256 里挑,1 个必过」
我:「9 个?」
水科:「必过的那个是共享专家。它出来以后还要过一道 sigmoid 门」
我:「……为什么要门……」
水科:「让它学会闭嘴……」
我:「闭嘴?」
水科:「有时候它不该说话。门就把它压小」
我:「哦……」
水科:「现在你是 router……」
她把牌推到我面前,牌背朝上。
我伸手抽了 8 张。翻开来,是 3、7、Q、9、2、J、5、8。
我:「……这算什么?」
水科:「这就是 top-8」
我:「我是随便抽的……」
水科:「router 不随便。它用 softmax」
p = softmax(W_r x)
I = topk_8(p)
w_i = p_i / Σ_{j∈I} p_j
我:「W_r 是什么?」
水科:「路由矩阵。256 × 2048,出来是 256 个概率」
我:「然后取前 8 个……」
水科:「编号和权重,一起拿走」
我:「权重要重新算吗?」
水科:「8 个数各自除以它们自己的和……」
我:「组内归一化……」
水科:「加起来还是一」
我:「那个 x 呢?」
水科:「展平之后的 token。T × 2048,T 是 B × S……」
水科:「专家自己也是 SwiGLU。中间维只有 512」
我:「512!」
水科:「llama2 是 11008」
我:「变小了好多……」
水科:「所以要多几个……」
y = Σ_{i∈I} w_i · W_down(SiLU(W_gate x) ⊙ W_up x) + σ(g_s(x)) · shared(x)
我:「这一行好长……」
水科:「长的是下标」
我:「……」
水科:「gate 和 up 是 512 × 2048,down 是 2048 × 512……」
我:「g_s 呢?」
水科:「共享专家的门。T × 1,只有一个数」
我:「shared 呢?」
水科:「T × 2048。跟主流一样粗」
我:「这些权重在文件里怎么放的……」
水科:「两块大张量……」
我:「256 块拼起来?」
水科:「拼好了。W_gu 是 256 × 1024 × 2048」
我:「1024 是什么?」
水科:「gate 和 up 接在一起。512 × 2」
我:「哦……」
水科:「W_down 是 256 × 2048 × 512……」
我:「第一维是专家号」
水科:「按号索引」
我:「像抽屉……」
水科:「第几号,抽第几格……」
我把 8 张牌摆成一排,又摸了一张,放在最外面。
那张牌的字磨掉了。
我:「这张是共享专家……」
水科:「它一直在手上……」
我:「……」
水科:「一层大概 840M」
我:「专家占多少?」
水科:「256 × 3 × 2048 × 512……」
我:「805M!」
水科:「96%」
我:「那每个 token 呢?」
水科:「(8+1) × 3 × 2048 × 512……」
我:「28M……」
水科:「对」
我:「那总的我来算……」
她看着我。我掏出手机,按了很久。
我:「36B,8 除 256……1B 出头……」
水科:「多少分?」
我:「……啊?」
水科:「75 分……」
我:「为什么扣分……」
水科:「你漏了共享专家。是 9 个,不是 8 个」
我:「啊……」
水科:「40 层 × 9 个专家 × 3.15M,约 1.1B……」
我:「那 1.2B 是什么?」
水科:「注意力投影」
我:「还有 1B 呢?」
水科:「embedding 和 lm_head。2 × 248320 × 2048」
我:「加起来是 3B……」
水科:「约 3B」
我:「啊哈哈……我是稠密的。全员到场,一个也没用上……」
水科:「知道自己稠密就好」
窗外有自行车铃响。
叮。
水科:「还有一件事。256 个专家,会有人饿死」
我:「饿死?」
水科:「路由器只挑自己喜欢的。挑久了,别的再也学不到东西」
我:「坍缩……」
水科:「所以要加一个辅助损失……」
L_aux = α · N · Σ f_i · P_i
我:「α 是多少?」
水科:「0.001。N 是 256」
我:「f 和 P 是什么?」
水科:「f 是专家实际分到的 token 比例……」
我:「P 呢?」
水科:「路由器给它的平均 softmax 概率」
我:「为什么要两个……」
水科:「top-k 挑出来的东西不可导」
我:「哦……」
水科:「梯度只能从 P 那一边进去。f 只是数一数」
我:「……」
我把那 8 张牌推回牌堆里。
推回去的时候,有一张翻了面。字磨掉的那一张。
我:「所以被挑中的只有 8 个……」
水科:「8 个」
我:「剩下的 248 个呢?」
水科:「在文件里躺着」
我:「躺着也要占地方吧……」
水科:「占九成」
我:「……」
蝉叫了两声,就停了。
像是忘了词。
第五章 Three to One 「三层线性,一层全」
“8 月 31 日”,夜。
我们又回到屋顶。铁皮凉了,凉得比想象中快。
水科把牌摊在水塔下面。影子已经看不见了。
我:「影子呢?」
水科:「太阳走了……」
我:「那你怎么摆牌」
水科:「摸……」
她把一张牌翻过来,用铅笔写字。
沙。
写完,用手掌擦掉,再写。
我:「那是我的牌吧……」
水科:「现在是记忆……」
我:「记忆……」
水科:「llama2 每层都是全注意力。Qwen 把 40 层排成一个循环」
我:「什么循环?」
水科:「3 层线性,1 层全」
层0 GDN 层1 GDN 层2 GDN 层3 Full
层4 GDN 层5 GDN 层6 GDN 层7 Full
我:「全注意力在哪几层……」
水科:「层 3,层 7,一直到层 39。一共 10 个……」
我:「那剩下 30 层呢?」
水科:「Gated DeltaNet……」
我:「什么网……」
水科:「GDN。没有注意力矩阵……」
我:「没有矩阵怎么算……」
水科:「不算。递推」
我:「递推……」
水科:「你手上那张牌就是全部。写满就擦,擦完再写」
我:「那前面写过的字呢?」
水科:「没了」
我:「……好可怜……」
水科:「可怜,但是固定大小……」
S_t = e^{g_t} · S_{t-1} + β_t · k_t (v_t − S_{t-1}^T k_t)^T
我:「S 有多大?」
水科:「32 × 128 × 128……」
我:「那是多少……」
水科:「约 50 万个单元。是状态,不是权重……」
我:「50 万!」
水科:「32 个 V 头,每头一张 128 × 128 的表……」
我:「状态和权重有什么不同……」
水科:「权重不变。状态每个字都在变」
水科:「k 和 v 是 32 × 128」
我:「K 头有几个?」
水科:「16 个。复制一倍,对齐 V 头」
我:「为什么要复制」
水科:「头数要对得上……」
我:「g 和 β 呢?」
水科:「每头一个数。g 是衰减,β 是写入强度」
g_t = −exp(A) · softplus(W_a x_t + Δ)
β_t = σ(W_b x_t)
我:「A 和 Δ 是什么?」
水科:「每头一个,可学习。W_a 和 W_b 都是 32 × 2048……」
我:「很小……」
水科:「每头只要一个标量,不需要多大」
我:「负号做什么?」
水科:「让它只会变小……」
我:「只会变小……」
水科:「遗忘是单向的」
我:「……」
我:「那个减号里面是什么?」
水科:「v 减 S 转置乘 k……」
我:「意思是……」
水科:「先看记忆里已经有什么,再把差的那部分写进去」
我:「纠错……」
水科:「带遗忘的纠错式记忆……」
我:「啊哈哈……我居然听懂了……」
[q_t, k_t, v_t] = SiLU(Conv1d_4(W_qkv x_t))
z_t = W_z x_t
我:「Q、K、V 是一次投出来的?」
水科:「W_qkv 是 8192 × 2048」
我:「8192!」
水科:「2048 给 Q,2048 给 K,4096 给 V。V 的头多一倍」
我:「哦……」
水科:「投完过一个卷积。kernel 是 4,因果的……」
我:「因果是什么意思」
水科:「只能看前面 3 个字」
我:「z 呢?」
水科:「输出门。W_z 是 4096 × 2048……」
我:「又是门……」
水科:「这一代很喜欢门……」
o_t = S_t^T q_t
out_t = W_out(RMSNorm(o_t) ⊙ SiLU(z_t))
我:「o 是怎么出来的……」
水科:「拿 q 去查那张表。q 和 o 都是 32 × 128……」
我:「查完呢?」
水科:「归一化,再逐头乘门。W_out 是 2048 × 4096,拼回 hidden」
我:「4096 是怎么来的……」
水科:「32 个头,每个 128……」
我:「哦……」
她把铅笔放下。铅笔很短,短到只能捏住一头。
水科:「所以这 30 层,没有 KV cache」
我:「一点也没有?」
水科:「一点也没有……」
我:「序列多长都一样?」
水科:「状态不变。decode 的成本恒定」
我:「恒定……」
水科:「这就是对 llama2 的回答……」
我:「什么回答?」
水科:「KV cache 线性地长。它说,那我就不长……」
我:「好任性……」
水科:「任性有用」
我:「那 10 层呢?」
水科:「10 层还长着。10 层会长,30 层不会」
我:「3 比 1……」
水科:「3 比 1……」
夜里的水塔,比白天高。
也可能只是我仰头的角度不对。
蝉在叫。
比上周敷衍。
水塔的影子,宽了一指。
那副牌摊在黑暗里。
第六章 The Surviving Ten 「留下来的十层」
“9 月 1 日”,坡道上的电车站。
电车还有 7 分钟。
水科把那 10 张牌挑出来,摆在长椅上。
我:「这就是留下来的 10 层……」
水科:「它们也变了。变得比你想的多」
我:「……」
水科:「llama2 是 MHA,70B 是 GQA。这里 16 个 Q 头共用 2 个 KV 头」
我:「8 比 1?」
水科:「8 比 1……」
我:「比 70B 还狠……」
水科:「70B 是 64 比 8……」
我:「那也是 8 比 1 啊……」
水科:「比例一样」
我:「那哪里激进……」
水科:「绝对数。它只有 2 个 KV 头,70B 有 8 个……」
我:「2 个!」
Q, g = split(W_q x)
我:「q_proj 为什么输出双倍?」
水科:「8192 × 2048。一半是 Q,一半是门」
我:「门做什么?」
水科:「注意力出来,先乘 sigmoid(g),再进 o_proj」
我:「又是门……」
水科:「每一个子层都要装一道」
水科把一张牌的角折起来。只折了一个角。
我:「那是做什么?」
水科:「head_dim 是多少」
我:「128 吧……」
水科:「256。16 个头,每个 256,正好 4096」
我:「哦……」
水科:「RoPE 只转前 64 维」
我:「只转前面?」
水科:「剩下 192 维不转」
我:「不转会怎样」
水科:「不转就是不认位置」
我:「位置无关……」
水科:「llama2 是全维旋转。128 维全都转……」
我:「为什么这里只转四分之一」
水科:「config 里写着 partial_rotary_factor……」
我:「理由呢?」
水科:「理由没写……」
我:「……好诚实……」
Attn(x) = W_o( softmax(Q̃K̃^T/√256) Ṽ ⊙ σ(g) )
我:「根号下面是什么?」
水科:「256。head_dim」
我:「Q̃ 呢?」
水科:「转过前 64 维的 Q……」
我:「Ṽ 呢?」
水科:「2 个 KV 头,复制 8 份,对齐 16 个 Q 头……」
我:「W_k 多大……」
水科:「512 × 2048。2 个头乘 256……」
我:「σ(g) 呢?」
水科:「B × S × 4096」
我:「W_o 呢?」
水科:「2048 × 4096」
电车来了。我们没有上。
门开了,又关了。
水科:「这 10 层,每层投影约 27M」
我:「怎么算的……」
水科:「q_proj 2048 × 8192,含输出门……」
我:「k 和 v 呢?」
水科:「2 个 2048 × 512。o_proj 是 4096 × 2048……」
我:「加起来 27M……」
水科:「27M」
我:「比 MoE 的一层少多了……」
水科:「少两个数量级」
水科:「尾巴上那块 MTP 是 0.84B」
我:「0.84B 是什么概念……」
水科:「一层全注意力约 27M,加一层 MoE 约 809M」
我:「加起来就是 0.84B……」
水科:「就是 0.84B」
h_t^mtp = Block( W_fc [h_t ; e_{t+1}] )
x̂_{t+2} = W_lm · h_t^mtp
我:「h 和 e 是什么?」
水科:「主干最后一层的输出,和下一个 token 的 embedding」
我:「……为什么要拼在一起」
水科:「因为它要猜更后面那一个」
我:「猜?」
水科:「投机解码。先猜几个,再一起验……」
我:「猜错了怎么办?」
水科:「丢掉……」
我:「好随便……」
水科:「随便,但是快」
我:「W_fc 多大?」
水科:「2048 × 4096。把拼接降回 hidden」
我:「W_lm 呢?」
水科:「248320 × 2048。embedding 跟主干共用……」
我:「哦哦……」
水科:「还有一只眼睛。ViT,约 0.45B……」
我:「怎么算的……」
水科:「27 层。每层 4 个 1152²,加 2 个 1152 × 4608」
我:「前一个是注意力……」
水科:「后一个是 FFN」
我:「等于多少?」
水科:「约 0.43B」
我:「那还差 0.02?」
水科:「patch 嵌入,还有 merger……」
我:「merger 是什么?」
水科:「把小块拼成大块的东西……」
我:「哦……」
水科:「它出来的特征,去替换 embedding 里 image 和 video 的占位……」
我:「所以它看得见图……」
风把长椅上那 10 张牌吹散了两张。
我追出去三步,捡回来。牌角被我捏皱了。
水科:「皱了……」
我:「……对不起」
水科:「皱的也是那 10 层……」
我:「什么意思……」
水科:「没什么意思」
站牌上贴着上一班的时间表,被雨水泡过,字糊了一半。
我:「那第二次演进呢?」
水科:「第二次演进,连直线都不是了」
我:「不是直线是什么?」
水科:「是 4 条……」
第七章 Four Streams 「四条并行流」
“9 月 1 日”,深夜的屋顶。
水塔下面坐着一个人。
不是我们约好的那种人。
我:「……有人……」
水科:「看见了……」
我:「要绕开吗?」
水科:「绕不开。他坐在影子的位置上」
影子在夜里是没有位置的。可是他就是坐在那里。
水科:「DeepSeek-V4-Flash」
我:「你在这种地方讲这个?」
水科:「这种地方比较像直线断掉的地方」
1 | input_ids [B,S] |
我:「词表变小了?」
水科:「248320 变成 129280……」
我:「为什么……」
水科:「因为它不需要那么多」
我:「hidden 呢?」
水科:「2048 变回 4096。层数 43」
我:「上下文呢?」
水科:「1M。Qwen 是 256K」
我:「1M!」
水科:「总参 304B,专家权重 277B」
我:「又是九成?」
水科:「91%。43 层 × 256 专家 × 3 矩阵 × 4096 × 2048」
我:「……」
水科:「发布的时候是 FP8,专家是 FP4……」
我:「FP4 是什么?」
水科:「4 个 bit」
我:「4 个 bit 够吗?」
水科:「够。后面讲」
她把 4 张牌叠在一起,竖着拿。
水科:「形状变了。以前是一条残差流,现在是 4 条」
我:「4 条……」
水科:「mHC。多头超连接」
我:「叠在一起不就是一条吗?」
水科:「进子层之前先折叠。算完,再写回 4 条」
streams[4 流] → attn_hc 折叠 (4 → 1) → RMSNorm
→ 滑窗 / CSA / HCA 压缩注意力 → mHC 写回
→ ffn_hc 折叠 (4 → 1) → RMSNorm
→ MoE (256 选 6 + 1 共享) → mHC 写回
我:「pre-norm 还在……」
水科:「残差也还在。只是从一句变成四句……」
我:「……」
x = Σ_i pre_i · S_i
pre_i = σ(·) + ε
post_i = 2σ(·) ∈ [0, 2]
我:「S 是什么?」
水科:「4 条流。每条 B × S × 4096」
我:「pre 和 post 呢?」
水科:「逐 token 的标量。读多少,写多少……」
我:「谁决定的……」
水科:「一个线性层。24 × 16384……」
我:「16384!」
水科:「4 条流拼平。4096 × 4……」
水科:「post 的范围是 0 到 2……」
我:「为什么到 2?」
水科:「2σ。σ 最大是一……」
我:「……好简单……」
水科:「简单才对。这是骨架」
C = Sinkhorn( softmax(·) )
o = Sublayer( RMSNorm(x) )
S_k^new = post_k · o + Σ_j C_{j,k} · S_j
我:「C 是什么?」
水科:「4 × 4。流和流之间怎么混」
我:「16 个数?」
水科:「同一个线性层出的 16 个数。先 softmax,再 Sinkhorn」
我:「Sinkhorn 是什么……」
水科:「洗」
我:「洗?」
水科:「行归一,列归一,再来一遍。20 次」
我:「20 次……」
水科:「洗到每一行的和是一,每一列的和也是一」
我:「双随机……」
水科:「双随机」
我:「那像什么?」
水科:「像发牌」
水塔下面那个人站起来了。
神代:「像发牌!」
我:「呜哇!」
神代:「Sinkhorn!」
神代:「20 次!行归一,列归一,再行归一,再列归一!」
神代:「归一归一归一归一归一归一归一归一归一归一」
神代:「它不是被算出来的!它是被投出来的!」
神代:「双随机!每条流给出的是一份,收到的也是一份!」
神代:「于是 86 个子层复合下来,残差路径非膨胀!」
神代:「这是骨架级的保险!是深堆叠的王座!」
神代:「34M!用 34M 买下 4 条流的秩序!」
神代:「mHC!我不是在归一化,我是在加冕!」
风把牌吹到水塔底下。
一张。
又一张。
我:「……那个,你的牌撒了……」
神代没有捡。
他走了。走的时候脚步很轻,轻得像没有权重。
水科:「……他每次都这样」
我:「他每次都在?」
水科:「每次讲到双随机,他就在」
我把牌一张一张捡回来。捡到最后少了一张。
字磨掉的那一张。
我:「少了一张……」
水科:「不影响。双随机不需要 52 张」
我:「……」
水科:「86 个子层,是 43 层乘 2……」
我:「2 是什么?」
水科:「注意力一个位,MoE 一个位。每个位都要洗 20 次……」
我:「那不是很贵……」
水科:「参数上很便宜」
我:「多少?」
水科:「每个位 24 × 16384,约 0.4M……」
我:「全模型呢?」
水科:「2 个位,43 层,约 34M」
我:「34M 对 304B……」
水科:「万分之零点一……」
我:「呜哇?」
水科:「但是残差激活的内存要乘 4」
我:「乘 4!」
水科:「4 条流,每条都要存」
我:「……所以是用内存换稳定……」
水科:「换一条不会炸的路」
谱范数 |C|_2 ≤ √( |C|1 · |C|∞ ) = 1
我:「这一行是什么意思……」
水科:「双随机矩阵的两个范数都是一。所以谱范数不超过一」
我:「不超过一会怎样……」
水科:「乘 86 次也不会变大……」
我:「……」
水科:「训练深堆叠的时候,这就是保险」
我:「保险……」
水科:「骨架级的」
夜里的水塔很高。
高到我觉得它不是塔,是一根钉住影子的钉子。
而影子已经不在了。
我:「那注意力呢?」
水科:「注意力变了更多……」
我:「怎么变的……」
水科:「递归没有了……」
我:「没有了?」
水科:「一层都没有」
第八章 Compress and Retrieve 「压成条目,再去检索」
“9 月 2 日”,图书室的窗边。
空调修好了。修好以后反而有点冷。
水科把外套披在膝盖上,牌摊在桌面上。
我:「昨天你说递归没有了……」
水科:「一层都没有」
我:「那 30 层的记忆矩阵呢……」
水科:「消失了。43 层全是注意力」
我:「全是全注意力?」
水科:「全是滑动窗口,加压缩过的 KV」
我:「压缩……」
水科:「你先看排布」
1 | 层0 层1 层2 层3 层4 层5 层6 层7 |
我:「头两层不一样……」
水科:「头 2 层只看局部 128 个 token……」
我:「那后面呢?」
水科:「CSA 21 层,HCA 20 层」
我:「CSA 是什么……」
水科:「每 4 个 token,门控加权压成 1 条 KV」
我:「压成一条……」
水科:「凸组合。权重加起来是一」
我:「哦……」
水科:「HCA 是每 128 个 token 压成 1 条……」
我:「压得比 CSA 狠多了……」
水科:「所以它全量可见」
我:「全量?」
水科:「1M 的上下文,只有约 8192 条」
我:「8192……」
水科:「全都看得见」
我:「那 CSA 呢?」
水科:「CSA 1M 会压出 26 万条……」
我:「26 万条!」
水科:「太多了。所以它要挑」
我:「怎么挑……」
水科:「Lightning Indexer。一条支路」
我:「什么什么……」
水科:「给每个 query 打分,挑 top-512……」
s_w = Σ_h w_h · ReLU(q_h^T K_w)
我:「这一行是什么?」
水科:「第 w 条压缩 key 的分数」
我:「q_h 呢?」
水科:「index 头的 query。128 维,一共 64 个头……」
我:「64 个 index 头……」
水科:「从 Q 的低秩中间量 u 投出来……」
我:「u 是什么?」
水科:「明天讲」
我:「又是明天……」
水科:「w_h 是从 x 投出来的 64 个数」
我:「做什么用……」
水科:「头的重要性。哪个头说的话算数」
水科:「ReLU 把负的切掉,乘上重要性,加起来就是这一条的分」
我把 4 张牌叠在一起,压平。
压不平。
我:「压不薄啊……」
水科:「压完是 512 维」
我:「512 维……」
水科:「一个 token 本来是 4096 维……」
c_w = RMSNorm( Σ_{t∈win_w} α_t ⊙ kv_t )
α_t = softmax_t( gate_t + p_{t mod R} )
我:「kv 和 gate 是多大?」
水科:「各 512 维。各由一个 512 × 4096 的投影投出来」
我:「两个投影……」
水科:「两个」
我:「α 呢?」
水科:「窗内的权重。softmax 出来的,和为一」
我:「p 呢?」
水科:「窗内位置偏置。也是 512 维」
我:「为什么要位置偏置……」
水科:「窗里的第一个和最后一个,不该一样重」
我:「哦……」
水科:「R 是窗的大小。CSA 是 4,HCA 是 128」
我:「c_w 呢?」
水科:「压出来的那一条。512 维,还要过 RMSNorm」
我:「归一化完就完了?」
水科:「还要在窗的位置 wR 上做 RoPE……」
我:「哦哦?」
水科:「再跟滑窗的 KV 拼在一起,参与注意力」
我:「拼在一起……」
水科:「CSA 还要把可见集限制住……」
I^(q) = topk_512( s^(q) )
我:「限制到 512 条?」
我:「等等……」
水科:「什么?」
我:「4 个 token 压成一条,边界怎么办」
水科:「哪个边界?」
我:「正好落在窗口边上的字……」
水科:「……」
水科:「CSA 用交叠窗……」
我:「交叠……」
水科:「上一窗的一半,加本窗的一半,一共 8 个槽」
我:「8 个槽……」
水科:「这样就不会硬切……」
我:「哦……」
水科:「你问对了一次」
我:「只有一次?」
水科:「只有一次……」
我:「啊哈哈……」
我拿手机按了很久。
我:「indexer 每层多少参数」
水科:「约 11M」
我:「我算出来 10.7M……」
水科:「2 个 4096 × 256,1 个 1024 × 8192,1 个 4096 × 64」
我:「加起来 10.74M……」
水科:「约 11M」
我:「你这个约也太狠了……」
水科:「约是一个工程单位」
我:「什么?」
水科:「不讲小数点」
我:「……」
她把那叠压不平的 4 张牌,用橡皮筋捆起来。
橡皮筋已经松了。捆了两圈才勉强绷住。
我:「所以 Qwen 和它,是两条路……」
水科:「两条」
我:「Qwen 把历史递推成一个固定的状态……」
水科:「对……」
我:「这个把历史压成一条条能查的条目……」
水科:「也对」
我:「哪个更好……」
水科:「一个查不回来。一个查得回来」
我:「……」
水科:「一个不占地方。一个要占索引」
我:「那到底哪个好」
水科:「我在等你自己说」
我:「……」
窗外有人在扫地。
扫帚的声音很长,一直扫到路的尽头。
我:「我说不出来……」
水科:「说不出来就对了」
我:「为什么?」
水科:「因为还没有人说得出来……」
第九章 K Is V 「K 就是 V」
“9 月 3 日”,屋顶。
铁皮又开始烫了。都九月了,还是烫。
水科坐在影子外面。今天影子很宽。
我:「影子又宽了……」
水科:「宽了两指」
我:「你不是不数影子吗?」
水科:「我不数。我只是知道……」
我:「……」
她把那张字磨掉的牌放在最上面。
水科:「Qwen 的全注意力层,还是经典形状。Q、K、V 分开,16 个头」
我:「这个呢?」
水科:「这个激进得多。K 就是 V」
我:「什么?」
水科:「同一个张量。既当 K,又当 V」
我:「那不就是一张牌吗……」
水科:「一张牌。正反两用」
我:「只有一个 KV 头?」
水科:「一个……」
我:「一个!」
水科:「KV cache 压到极致」
我:「代价呢?」
水科:「输出要转回来」
我:「转回来?」
水科:「V 上有 RoPE。要用一次共轭旋转抵消掉……」
我:「共轭……」
水科:「写成 RoPE 减号……」
我:「减号是共轭的意思?」
水科:「在 query 的位置,用负的 sin」
我:「哦哦……」
u = RMSNorm(W_qa x)
Q = W_qb u ∈ R^{64×512}
K = V = RMSNorm(W_kv x) ∈ R^{512}
我:「u 就是昨天那个 u」
水科:「1024 维」
我:「从 4096 降下来的?」
水科:「W_qa 是 1024 × 4096」
我:「然后再升上去……」
水科:「W_qb 是 32768 × 1024……」
我:「32768……」
水科:「64 个头,乘 512」
我:「所以 Q 是 64 × 512……」
水科:「每个 token。这就叫两段低秩」
我:「为什么不直接投」
水科:「直接投是 32768 × 4096」
我:「1.34 亿!」
我:「两段呢?」
水科:「1024 × 4096,加 32768 × 1024」
我:「……小了很多……」
水科:「而且中间那一层,indexer 还要用」
我:「u!」
水科:「u」
我:「K 和 V 是一个投影?」
水科:「W_kv,512 × 4096」
我:「只有一个头,512 维……」
水科:「K 和 V 还要各过一次 RMSNorm」
我:「同一张牌洗两次……」
水科:「同一张牌,过两次 norm……」
p_j = exp(z_j) / ( Σ_{j’} exp(z_{j’}) + exp(s) )
我:「分母里多出来的那个是什么?」
水科:「sink」
我:「sink……」
水科:「可学习的标量。每个头一个」
我:「做什么用……」
水科:「垃圾桶」
我:「垃圾桶?」
水科:「没什么可看的时候,概率往这里倒」
我:「倒完呢?」
水科:「倒完就丢。这一列不进输出,只进分母」
我:「……」
我:「所以它是这张牌?」
水科:「哪张?」
我:「字磨掉的这张。每次都要摸一下,摸完又放回去……」
水科:「随你怎么想」
我:「为什么需要它……」
水科:「上下文一长,注意力会硬找地方放」
我:「放了会怎样……」
水科:「不稳……」
我:「哦……」
o = RoPE_−( Σ_j p_j · v_j )
我:「o 就是加权和……」
水科:「加权和,再共轭旋转回来」
我:「v_j 就是 K_j……」
水科:「就是 K_j」
out = W_ob [ G_1 o_1 ; G_2 o_2 ; … ; G_8 o_8 ]
我:「64 个头怎么回去……」
水科:「拆成 8 组。每组 8 个头乘 512,等于 4096」
我:「然后每组各降一次……」
水科:「G_i 是 1024 × 4096……」
我:「8 组拼起来……」
水科:「拼成 8192。W_ob 是 4096 × 8192,混合回 4096……」
我:「为什么要这么绕……」
水科:「直接投太贵……」
我:「直接投多少?」
水科:「32768 × 4096,约 134M」
我:「绕一圈呢?」
水科:「8 个 4096 × 1024,加 8192 × 4096」
我:「约 67M……」
水科:「省一半……」
我:「省一半!」
水科:「省一半」
我:「那这一层一共有几个矩阵……」
水科:「W_qa,W_qb,W_kv……」
我:「加输出呢?」
水科:「8 个 G,一个 W_ob……」
我:「……那不止三个……」
水科:「你数的是矩阵,不是投影」
我:「有区别吗?」
水科:「数错了就要重数」
我:「啊哈哈……」
我收牌的时候,那张磨掉字的滑了出去。
它落在影子里。捡起来的时候,牌是凉的。
只有影子里的牌是凉的。
我:「所以注意力这边,能省的都省了……」
水科:「能省的都省了」
我:「那 FFN 呢?」
水科:「FFN 也换了」
我:「又是 256 选几?」
水科:「选 6……」
我:「6?」
水科:「而且没有辅助损失」
第十章 Six, Not Eight 「选六个」
“9 月 3 日”,傍晚的屋顶。
太阳斜得很厉害。
影子从水塔一路铺到围栏边上,铺过了半个屋顶。
我:「影子好长……」
水科:「你站在门口,不要挡光」
我往旁边挪了两步。挪完发现,影子里更暗了。
σ = √softplus(W_r x)
I = topk_6(σ + b)
w ∝ σ_I
我:「为什么开根号……」
水科:「softplus 出来再开根号,打分用的」
我:「跟 softmax 有什么不同……」
水科:「softmax 会把 256 个专家挤成每一个都很小」
我:「所以换成 sqrtsoftplus……」
水科:「换成 sqrtsoftplus。σ 是 T × 256……」
我:「b 是什么?」
水科:「专家纠偏偏置。256 个数,按统计更新,不是学的」
我:「纠偏……」
水科:「谁最近没被挑中,就把它抬一点」
我:「那加权呢?」
水科:「加权用原始分 σ_I,不加 b。它只管挑,不管算分」
我:「所以 b 只影响挑谁……」
水科:「只影响挑谁」
我:「那不就是……在牌底下垫纸条」
水科:「垫纸条」
我:「挑的时候看纸条,算分的时候把纸条抽走……」
水科:「你偶尔很聪明……」
水科:「Qwen 是用辅助损失均衡。这个不用……」
我:「不用损失怎么均衡……」
水科:「noaux_tc。没有辅助损失的纠偏……」
我:「名字好随便……」
水科:「config 里就这么写的」
我:「还有前 3 层……」
水科:「前 3 层不用路由」
我:「不用路由?」
水科:「查表……」
I = tid2eid[input_id]
w_j ∝ σ_{I_j}
我:「tid2eid 是什么?」
水科:「一张冻结的查找表。129280 × 6」
水科:「每个 token id,直接查出 6 个专家号。不看 x」
我:「那权重呢?」
水科:「权重还是学的。还是 W_r x 打的分」
我:「……为什么要写死」
水科:「浅层看的是词面……」
我:「词面?」
水科:「浅层的特征,跟这个词长什么样关系最大」
我:「所以按 token 静态分工」
水科:「静态分工」
我:「有什么好处……」
水科:「访存可以预测。哪个 token 去哪 6 个专家,事先就知道……」
我:「还有呢?」
水科:「负载天然均衡」
我:「天然?」
水科:「表是死的。死的不会偏心」
我:「哦……」
我:「那张表算参数吗?」
水科:「不算。冻结的」
我:「路由矩阵呢?」
水科:「两种路由,都只有 256 × 4096……」
我:「一层约 1M!」
水科:「约 1M」
我:「好便宜……」
水科:「便宜的东西管着 277B」
太阳又矮了一截。影子爬上了我的鞋。
水科:「还有 DSpark」
我:「又是什么……」
水科:「MTP 之外的另一半投机解码」
我:「怎么做的……」
水科:「主干最后 3 层的特征,加一个低秩的 Markov 结构,按块草拟」
水科:「先猜一串。草稿和目标在同一个 checkpoint 里」
我:「哦哦……」
水科:「然后目标模型来验。一次 forward,给全部候选打分」
我:「一次就够了?」
水科:「生成必须串行。验证可以并行……」
我:「……为什么?」
水科:「验证的时候,答案已经写在那里了」
以 min(1, p_target(d_i) / p_draft(d_i)) 的概率接受草稿 d_i
我:「这一行是什么?」
水科:「拒绝采样」
我:「拒绝采样……」
水科:「目标给的概率比草稿高,就一定收」
我:「低呢?」
水科:「按比例收」
我:「收不下呢?」
水科:「拒掉。第一个被拒的位置往后,全部丢」
我:「全部丢!」
水科:「全部丢」
我:「那不是很浪费……」
水科:「浪费的是草稿。草稿很便宜」
我:「……」
水科:「发布精度也换了」
我:「换成什么?」
水科:「FP8。llama2 是 bf16,Qwen 也是 bf16……」
我:「FP8 是什么形状?」
水科:「e4m3。128 × 128 一块」
水科:「一块一块地缩放」
我:「哦哦……」
水科:「专家更狠。FP4……」
我:「不会炸吗?」
水科:「所以 SwiGLU 里有个 clamp……」
我:「clamp 是什么?」
水科:「正负 10。超过就顶回去……」
我:「顶回去……」
水科:「低精度的数值护栏……」
风把那张磨掉字的牌吹到影子外面去了。
它翻了两下,停住。字朝下。
水科把 3 个牌盒并排摆在屋顶上。
第一个盒子已经软了,角被水泡过。
第二个盒子还新,胶带上印着一半的名字。
第三个盒子最薄,可是最重。
我:「这是什么?」
水科:「复盘。三代。我说项目,你说答案」
我:「……好……」
水科:「总参和激活……」
我:「70B 稠密。36B 与约 3B。304B 与远小于总参……」
水科:「上下文……」
我:「4096,256K,1M……」
水科:「token mixer」
我:「全注意力,每一层都是……」
我:「30 层 GDN 递归,加 10 层门控全注意力……」
我:「滑窗,加 CSA 和 HCA 压缩,加 indexer」
水科:「KV cache……」
我:「全层线性增长。只有 10 层有,低秩加逐层压缩」
水科:「FFN」
我:「稠密 SwiGLU。256 选 8 加辅助损失」
我:「256 选 6 加 noaux_tc,前 3 层 hash……」
水科:「残差」
我:「单流,单流,4 条流 mHC……」
水科:「投机解码」
我:「没有,MTP,MTP 加 DSpark……」
水科:「发布精度」
我:「bf16,bf16,FP8 加 FP4……」
水科:「……」
我:「多少分?」
水科:「90 分……」
我:「扣的 10 分是什么?」
水科:「你漏了趋势……」
我:「趋势……」
水科:「三条」
我:「第一条……」
水科:「从全激活,到按需激活……」
我:「MoE……」
水科:「MoE 把容量和成本拆开了」
我:「第二条……」
水科:「从全注意力,到两条稀疏的路」
我:「递推和检索……」
水科:「一条压成状态,一条压成条目」
我:「它们在回答同一个问题?」
水科:「长序列里,大部分 token 不值得 O(S²) 的注视」
我:「……」
水科:「第三条……」
我:「推理优化架构化」
水科:「你自己说出来的」
我:「啊哈哈……」
水科:「MTP,DSpark,量化」
我:「以前是部署的技巧」
水科:「现在是训练时的一等公民」
我:「一等公民……」
水科:「不用买票的那种」
我:「……你上周也这么说过……」
水科:「上周是对的」
天暗下来了。3 个牌盒只剩下轮廓。
我伸手去摸,摸到的是最薄的那一个。
它比我以为的重。
蝉在叫。
比上周敷衍。
水塔的影子,宽了一指。
那副牌换了盒子。
终章 Wonderful Everyday 「美好的每一天」
“9 月 3 日”,夜。
屋顶的门没有锁。
从来没有锁过。
我一个人上来,把 3 个牌盒摆在原来的位置。
摸不太准。
摆了三次。
风很凉。
凉得不像九月。
远处有人在收摊,铁皮桶在地上拖了一段。
三日月:「呵呵」
我:「呜哇……」
三日月:「你在摆盒子……」
我:「在摆……」
三日月:「摆成一条直线」
我:「一条直线?」
三日月:「假设 5……直线只是一副牌暂时安静的样子……」
我:「假设 5……」
三日月:「注释是可以往下加的……」
我:「……」
三日月:「你想加到第几条……」
我:「我不知道……」
三日月:「呵呵……」
她站在水塔底下,没有上来。
也没有要走的意思。
夜里的水塔是黑的。
黑到我一度以为它不在那里。
摸了一下,在。
铁的,凉的,有一点锈。
对我来说,一个东西在不在,就只有这种程度。
我偶尔还会思考这种事情。
一副牌被洗过 1000 次之后,还是不是原来那一副。
……
现在我知道答案了。
答案是,明天要交的作业还没有写。
答案还有,那副牌少了一张,我一直没有说。
少的那一张,字是磨掉的。
也就是说,就算它在,我也认不出来。
那么它不在,和它在,有什么区别呢。
……
区别大概在于,我会不会去数。
远处有电车过去。
铁轨响了两声,就不响了。
风正凉。
蝉正稀。
影子的事情,明天再量。
幸福的每一天……
每一天都很幸福……
我便是生活在这样一个世界上……
我偶尔会思考这种事情。
……
Wonderful Everyday