一、八位名医,一条长龙

八方馆是京城最有名的医馆。

有名的原因说来也怪——别的医馆靠的是一两位妙手回春的老大夫坐镇,八方馆靠的是八个。一个治骨,一个理皮,一个调内腑,一个通经络,一个看眼耳鼻喉,一个攻疑难杂症,一个专妇人小儿,一个做针灸推拿。八个大夫各精一科,随便单拉一个出去都能独当一面。

但八方馆有一个所有人都头疼的问题。

馆门口那条街,每天早上寅时不到就排起了长龙——人不是均匀地分给八个大夫的,是挤在一个门前面。

排在第一的是刘老大夫,专治骨伤。方圆百里但凡谁崴了脚、摔了腰、折了胳膊,第一反应就是"找刘老"。七十岁的刘老大夫从早看到晚,水都顾不上喝一口,案上的方子堆得像座小山,手腕上常年贴着三张膏药。

隔壁那七位大夫呢?喝茶的喝茶,翻医书的翻医书,趴在桌上打盹的打盹。

不是他们的医术不行。病人们认准了一个死理:找最有名的大夫准没错。

馆主姓秦,叫秦问疾。说是馆主,其实就是个分诊的——病人进门,他看两眼,指个方向:"往左走,第三个门。"干了三年分诊,他发现自己捅的篓子比谁都大。他指得没错的病人,十有八九自己拐了弯——还是排到了刘老大夫门口。

"秦馆主。"这天打烊,针灸科的孙大夫端着杯凉透了的茶,冲他苦笑,"我今天看了三个病人。三个。我的针快生锈了。"

内科的周大夫从隔壁探出头来:"你三个?我两个。其中一个还是走错门的——他想找刘老看他的咳嗽。"

刘老大夫坐在角落里揉手腕。揉了三年,骨头没断过,肌腱快断了。

秦问疾那天晚上躺在床上翻来覆去。病人排成一条歪歪扭扭的长龙,七个大夫闲着喝茶。馆门口挂的招牌写的是"八方馆——八科合诊",底下过路的百姓念成"八方馆——找刘老"。

"问题不出在医术上。"他盯着天花板自言自语,"出在门上——每个病人都要自己选门,但病人根本不知道该推哪一扇。"

他忽然坐了起来。

"如果门不是让病人选的——是让一个知道八位大夫全部底细的人来选呢?"

二、九双眼睛看一个病人

秦问疾花了一个月,把八方馆的规矩彻底翻了个儿。

他在馆门口撤了八扇门的标识,只留一张长案。病人进来,不许自己挑大夫——先坐到长案前,让秦问疾"过一眼"。

过不是瞎过。案上摊着一本蓝布面的厚册子,记着八位大夫过去三年看过的每一个病例:什么症状、用什么方子、治到第几天好转、最后好了没有。

"头疼、怕风、流清涕。"一个中年汉子坐在长案前,"昨天下雨没打伞,淋了半个时辰。"

秦问疾翻开册子,手指在纸页上飞快地划动。他不是在查"头疼"——是在查八位大夫里谁最擅长看"风寒入络引发的偏头痛"。

刘老大夫?骨科,不挨着。孙大夫?针灸能治头疼,但这人怕针,不是最佳人选。周大夫?内科,但周大夫擅长的是脾胃,上头面不精。郑大夫?皮肤科——差得更远。

他的手指停在了第五位大夫的名字下面:吴大夫,攻疑难杂症的。册子上记着——吴大夫去年接过十七例"风寒入络引发的偏头痛",十六例痊愈。剩下那一例,头疼没好,但吴大夫顺带查出了病人对蛤蜊过敏,转给皮肤科的郑大夫,两张方子一起开,也好了。

"往左走,第五个门。吴大夫。"

汉子站起来,没拐弯。因为他压根不知道吴大夫是谁——但秦问疾说得太笃定了。

这件事秦问疾一天做了四十七遍。每一个病人,他都要把八位大夫的底子在脑子里过一遍——不是比谁名气大,是比谁最对眼前这个人的症。而且他只挑两个。

"为什么只挑两个?"打烊后,吴大夫翻着秦问疾的册子问。

"人身上同时开八张方子,谁也受不了。两个大夫合诊——一个主治,一个佐证——刚刚好。"秦问疾拿过册子,翻到第三十七页,"你看这个病人。腰疼加腿麻——刘老正了腰椎,孙大夫用针灸通了经络。两个人加起来看了不到半个时辰,第三天病人走着来的。"

"那你怎么知道他需要的是刘老和孙大夫——不是周大夫和郑大夫?"

秦问疾在册子空白处画了一张图。一个病人的症状被他拆成了九个标签:"腰疼""腿麻""久坐""脉涩""舌暗""无汗""夜重""四十岁""木匠"。每个标签后面叼着八条细线,分别连着八位大夫的名字。线有粗有细——粗的代表这位大夫对这个标签极擅长,细的代表稍微沾边。

"九个标签,八位大夫——七十二根线。"秦问疾的笔尖在图上飞快地点,"我把每一根线的粗细加在一起算,然后挑总分最高的两个。"

"八位大夫你都算了一遍?对每一个病人?"

"对每一个病人。七十二根线,算完只要一口气的功夫。"秦问疾合上册子,"反正我坐在这儿也没别的事。"

刘老大夫在旁边听了半天,忽然把烟斗从嘴里拿下来。"你算的这个——它准吗?"

秦问疾翻开册子最后一页。上面是他一个月的统计:总共分诊一千一百零九例,病人复诊反馈"对症"的有一千零三十三例。九成三的准确率。刘老大夫看了看那个数字,又看了看自己手腕上贴的膏药,没再说话。

那天晚上打烊,八位大夫坐在一起吃了顿饭。周大夫面前摊着今天开的方子,厚厚一叠:"我今天看了二十六个。个个对症。"吴大夫没吭声,只把自己的诊疗记录推到桌子中间。三十三例。

孙大夫在数自己针包里的针。少了十九根——他今天扎了十九个病人。三个月前,这个数字是"三"。

三、每一扇门都要有人推

新规矩推了半年,八方馆的名声从京城传到了直隶。门口那条街不排长龙了——秦问疾的分诊太快,病人屁股还没坐热,方向就指好了。

但册子上有一栏数字让秦问疾越来越不安。

八位大夫的接诊量差距太大了。吴大夫一个月看了四百多例,占了全馆将近三分之一。而孙大夫——虽然比以前好太多了——一个月才看了六十几例。

不是秦问疾故意不给孙大夫派活。是算出来的——大部分病人的症状,七十二根线拉完之后,排在前两名的确实没有孙大夫。

孙大夫又开始喝茶了。这次不是闲的——是闷的。

"秦馆主,我知道你的册子算得准。"孙大夫放下茶杯,杯子在桌上磕出一声闷响,"但我的针没有比吴大夫的药差。我就是——我就是过不了你那七十二根线的关。每次算到最后一轮,我都是第三名、第四名。离被选上就差那么一根线的粗细。"

秦问疾拿起册子翻了一整夜。

翻到天快亮的时候,他看明白了。他的分诊办法有一个藏在算法里的偏向:它只看"谁最配这个病人",完全不管"每个大夫被问了没有"。七十二根线无情地把大部分病人推向了三四位"通才型"的大夫——吴大夫、周大夫——而那些"专才型"的,像孙大夫专攻针灸、冯大夫只看眼耳,永远在第三名到第五名之间挂着。

如果一直这样,孙大夫的针法会越来越没人验证。冯大夫的眼科会生疏。到最后——他们那两扇门就真的没人推了。

"我需要加一条规矩。"

第二条规矩加进了分诊册:每位大夫的接诊次数,每天打烊后要拉一张表。如果某位大夫连续多日接诊量落在后三名,册子在第二天分诊时会稍微"抬"他一下。

"抬"不是乱抬。秦问疾加得极精细——只发生在那些"第三名离第二名差距不到半成"的病例上。比如一个腰疼病人,刘老大夫总分九十四,周大夫总分九十一,孙大夫八十七排第三。差七分——不抬。但如果孙大夫排第三、离第二名只差四分?册子会把孙大夫顶上去,替代原来的第二名。

"这不公平。"吴大夫第一个不干了——他从册子上看到自己的几个病人被"抬"给了孙大夫,"你明明算出来我对这个病人更合适。"

"差多少?"

吴大夫低头看了看册子上的数字。他的匹配分是九十二。孙大夫是八十八。

"四个。差了四个。"

"就这四个,"秦问疾说,"让孙大夫的门再关三个月——你愿意吗?"

吴大夫没答话。第二天他主动拿着三个病人的脉案去找孙大夫,把针灸的部分过给他看。孙大夫在册子上的那一栏数字,从那天开始慢慢往上涨。

又过了一个月。八位大夫的接诊量收敛到了一个合理的区间——最忙的还是吴大夫,但最闲的也比以前多了一倍的病人。全馆的治愈率没有降。

秦问疾在册子最后一页写了一行小字:门不是越多越好。是哪扇门对这个人最好——同时每一扇门都要有人推。

四、一个人需要几双手

真正考验八方馆的,是一个从真定府连夜赶来的病人。

此人症状之杂,前所未见。头疼如劈、干咳不止、脸上起了连片的红疹、左膝肿得弯不了、眼睛畏光流泪、脉象一浮一沉没个定数、舌苔黄白相间、浑身酸软没一丝力气。八个症状散落在身体的不同系统里,像八条各自延伸的线索,每一条指向不同方向。

秦问疾翻开册子,一个一个症状往上对。

头疼 → 吴大夫最高。咳嗽 → 周大夫最高。红疹 → 郑大夫最高。膝肿 → 刘老大夫最高。目畏光 → 冯大夫最高。脉象不定 → 王大夫最高。舌苔厚腻 → 赵大夫有独到见解。全身酸软 → 钱大夫最高。

八个症状,八位大夫各中一枪。

秦问疾的笔停在半空。

按老规矩——挑总分最高的两个大夫,意味着只派吴大夫加王大夫。但那样的话,脸上的红疹谁管?膝盖的肿谁看?眼睛畏光——冯大夫不上,谁也看不准。

"这个病人,"秦问疾放下笔,把八位大夫全部叫到了大堂里,"需要四个人。"

"四个?"刘老大夫放下烟斗,"有先例吗?"

"没有。但规矩是死的,人是活的。这个人身上有八条线——每一条线都不算致命,但八条拧在一起,就成了一张谁都解不开的网。两个人四只手,解不了八条线。"

吴大夫、郑大夫、刘老大夫、冯大夫——四个人围着病人坐下。秦问疾把册子摊在中间的地上,八条症状的对应分数写在八个角上。

四位大夫花了整整一个下午。吴大夫从头疼和脉象切入,定大方向。郑大夫从皮肤红疹的形态判断病邪的性质。刘老大夫检查膝盖积水的深浅。冯大夫翻开病人的眼皮,用手电照了三次——"这个畏光不是眼睛本身的问题,是肝火上攻。"

四条线索在大堂中央汇到了一处:肝郁化火,上攻头目,外发皮肤,下注关节。 不是八个病——是一个病的八个面孔。

四个人各开了一部分方子。吴大夫统合四张方子,删掉重复的药,补上遗漏的引子——合成一张。

三天以后,病人退了烧。七天以后,红疹消退,膝盖能弯了。半个月以后,他走着回了真定府。

"你知道最后一刻我在想什么吗?"秦问疾后来跟刘老大夫说,"我在想——如果八方馆有一百二十八位大夫,不是八个——这个病人会不会好得更快?"

"不会。"刘老大夫放下烟斗,在桌腿上磕了磕烟灰。"因为你不可能让一百二十八个人围着一个病人转。四个已经是极限——再多就乱套了。重要的不是你有多少大夫——是你能不能从一百二十八个里头,挑出最对的四个。"

秦问疾翻开册子,在那天的记录下面写了一行字——

不是每个病人都需要每一个大夫。但每一个病人都需要那个对的大夫。

技术解读

混合专家模型(Mixture of Experts,MoE)是当代大语言模型扩展参数规模的核心架构。与传统的密集模型——每个 token 激活全部参数——不同,MoE 将模型拆分为多个独立的"专家"子网络,并通过一个门控网络(Gating Network)为每个 token 动态路由到最相关的 top-k 个专家。这意味着模型的总参数量可以极大幅度增长(从数十亿到数千亿),但每个 token 实际激活的计算量保持不变——因为每次只用到少数几个专家。

MoE 的思想最早可追溯到 Jacobs 等人在 1991 年提出的"专家混合"框架。但在深度学习时代,Shazeer 等人在 2017 年的论文《Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer》中将其引入 Transformer,实现了首个大规模稀疏激活的语言模型。此后,Google 的 GLaM、Mistral AI 的 Mixtral 8×7B、以及 GPT-4 传闻中使用的 MoE 架构,将这一技术推向了工业级应用的前沿。

核心概念回顾

概念 通俗解释
专家(Expert) 一个独立的子网络(通常是一个 FFN 层),擅长处理某一类输入模式
门控网络(Gating Network) 一个轻量路由器,对每个 token 计算"应该分给哪几个专家"
Top-K 路由 每个 token 只激活 K 个最相关的专家(通常 K=2),其余专家闲置
稀疏激活 只使用模型参数的一小部分来处理当前 token,大幅降低计算量
专家容量(Expert Capacity) 每个专家每批次最多能处理多少个 token,防止单个专家过载
负载均衡损失 额外的训练目标,惩罚"某些专家被过度使用、另一些完全不用"的现象
Softmax 门控 对门控分数做归一化,使得所有专家的权重之和为 1
专家数量 MoE 层中专家的总数,从 8 到 128 不等,越多模型容量越大
条件计算 不同的输入激活不同的计算路径——不是所有参数都对每个样本有用
密集层 vs 稀疏层 密集层每个 token 激活全部参数;稀疏 MoE 层每个 token 只激活少数专家
专家专业化 训练中专家自然分化——有的擅长语法、有的擅长事实、有的擅长推理

故事中的隐喻对照

故事元素 映射的技术概念 解释
八方馆 / 八位各精一科的大夫 MoE 层中的 8 个专家网络 每个专家是一个独立的 FFN 子网络,训练中自然分化出不同的"专长"
病人自己选大夫,全挤在刘老门口 没有路由机制的密集模型 没有门控网络时,每个 token 激活所有专家(或只激活最热门的一个),效率极低
秦问疾坐在门口长案前分诊 门控网络(Gating Network) 一个轻量级路由器,为每个 token 计算所有专家的匹配分数
七十二根线:九个症状标签 × 八位大夫 门控分数矩阵 对每个 token,门控网络输出一个在所有专家上的概率分布
"只挑两个大夫合诊" Top-K 路由(K=2) 只激活打分最高的 2 个专家,其余不参与计算——稀疏激活的核心
"七十二根线算完只要一口气" 门控网络计算开销极小 门控网络只是一个线性层 + Softmax,相比专家 FFN 的计算量可以忽略不计
吴大夫一月四百例,孙大夫六十例 专家负载不均 门控可能将大多数 token 路由到某几个"通才"专家,其余专家几乎闲置
第二条规矩:接诊太少的会被"抬" 负载均衡损失 / 辅助损失 在训练目标中加入均衡项,惩罚路由分布过于集中的行为
"差四分就把孙大夫顶上去" 负载均衡中的阈值调整 只有当替代带来的质量损失足够小时才触发负载均衡,兼顾效率与公平
真定府病人:八症并发,需要四位大夫 增加 Top-K 应对复杂输入 对于极其困难的 token,可以通过增加 K 来激活更多专家协同处理
"四个已经是极限" 专家容量约束 过多专家参与单 token 推理会导致通信开销剧增且边际收益递减
八方馆设想中的一百二十八位大夫 扩展专家数量至数百个 工业级 MoE 模型(如 GLaM、Mixtral)的专家数可达数十到上百

为什么这个故事对应 MoE?

  1. 稀疏激活的本质:每个病人只被分配给 2 个大夫(Top-2),其余 6 个大夫的门根本不用开——这正是 MoE 的核心优势。拥有 8 个专家的总参数量,但每个 token 实际激活的计算量只相当于 2 个专家。参数规模和计算成本解耦。

  2. 门控网络的路由逻辑:秦问疾的"七十二根线"对应门控网络的 softmax(W_g · x) 计算——将输入 token 的特征向量与每个专家的"擅长领域"进行匹配,选出得分最高的 K 个。这一计算轻量且可微分。

  3. 专家自然分化的隐喻:八位大夫"各精一科"并非秦问疾事先规定的——是多年行医中自然形成的专长。MoE 训练中专家专业化同样是自组织的:门控网络和专家网络联合训练,不同专家自然地收敛到擅长不同类型的输入模式。

  4. 负载均衡的必要性:孙大夫的针"快生锈了"对应 MoE 训练中的经典问题——门控网络可能坍缩到总是选择少数几个专家,导致其余专家梯度更新不足,最终浪费模型容量。负载均衡损失是保持系统健康的必要机制。

  5. Top-K 的可变性:对普通病人用 K=2、对复杂病人临时增加到 K=4——这对应 MoE 推理中 K 的灵活性。增加 K 提高精度但增加计算量,在不同场景下可以动态取舍。

  6. 规模化路线:"一百二十八位大夫"对应现代 MoE 的规模化路径——不是把单个专家变大(dense model 的做法),而是增加专家数量。Mixtral 8×7B 用 8 个 7B 的专家达到了接近 7B × 8 = 56B 的效果,但推理成本仅为 2 × 7B。

  7. "每一扇门都要有人推":负载均衡不仅是工程需求——它确保每个专家都接收足够的训练信号,维持自身的专业化能力。一个从不被激活的专家等于浪费的参数。

后记:把知识分散给多位专家——每人精通一小块——然后用一个识人的门卫替每个问题找到最对口的两个人。这就是 MoE 的智慧:不是造一个无所不能的大夫,而是造一群各有所长的大夫和一个知道该敲哪扇门的分诊人。规模的增长不靠把每个大夫变强——靠的是增加大夫的数量,同时让每一趟求医只惊动最该惊动的那几位。不是每个病人都需要每一个大夫。但每一个病人都需要那个对的大夫。