基础知识:离散选择、Top-k 与稀疏路由

基础知识:离散选择、Top-k 与稀疏路由

Charles Lv8

argmax、top-k、beam search、MCTS、router、gating、expert load、entropy 和 load balancing 都在处理有限预算下的离散选择。模型先给候选打分,再选择少数候选、归一化权重并重新分配计算预算:下一个 token、top-k expert、检索文档、候选轨迹和 draft tree 节点都可以这样读。

打分:先把候选变成可比较的数字

给定候选集合 {1,,n}\{1,\ldots,n\},模型通常先给每个候选一个 score:

si=fθ(x,i)s_i=f_\theta(x,i)

这里 xx 是上下文,ii 是候选编号。score 可以来自 logits、router MLP、retriever 相似度、value head 或 reward model。

score 的作用是提供排序依据,不直接说明“真理”。后面所有选择错误,都可能来自 score 本身不准,也可能来自选择规则不适合任务。

Argmax 和 Top-k:从连续分数到离散选择

最硬的选择是 argmax:

i=argmaxisii^*=\arg\max_i s_i

它只保留分数最高的一个候选。top-k 则保留前 kk 个:

Sk=TopK(s1,,sn)S_k=\operatorname{TopK}(s_1,\ldots,s_n)

语言解码里的 top-k、MoE router 里的 top-k experts、候选动作排序里的 top-k plans,都是这类操作。它们的共同代价是:被排除的候选不再参与后续计算,因此早期 score 错误会变成不可恢复的剪枝。

Beam search:保留多条前缀,而不是只走一条

贪心解码每一步只取当前最高分 token:

yt=argmaxylogp(yy<t,x)y_t=\arg\max_y \log p(y\mid y_{<t},x)

beam search 会保留 BB 条候选前缀,并按累计 log probability 排序:

score(y1:t)=i=1tlogp(yiy<i,x)\operatorname{score}(y_{1:t}) = \sum_{i=1}^{t}\log p(y_i\mid y_{<i},x)

beam search 是一种有限宽度搜索,不是随机采样。BB 越大,搜索空间覆盖越广,但计算越贵,也更可能偏向高似然但乏味或过短的序列。读 EAGLE 的 draft tree、传统 seq2seq 解码或候选轨迹搜索时,beam 都可以先理解成“预算有限的多分支前缀保留”。

MCTS:边搜索边更新树上的价值

Monte Carlo Tree Search 不只是 top-k 排序。它通常循环四步:

  1. Selection:从根节点沿着当前最有希望的分支往下走。
  2. Expansion:展开新的候选动作或 token。
  3. Evaluation / Simulation:用 value model、rollout 或 reward 估计叶子好坏。
  4. Backup:把叶子价值回传,更新路径上的访问次数和价值估计。

一个 PUCT 风格的常见选择规则会在 exploitation 和 exploration 之间折中:

a=argmaxa[Q(s,a)+cP(s,a)N(s)1+N(s,a)]a^* = \arg\max_a \left[ Q(s,a) + c\,P(s,a) \frac{\sqrt{N(s)}}{1+N(s,a)} \right]

这里 Q(s,a)Q(s,a) 是当前价值估计,P(s,a)P(s,a) 是先验概率,NN 是访问次数,cc 控制探索强度。MuZero 用树搜索把 learned dynamics、policy prior 和 value 接起来;EAGLE-2 的 draft tree 虽然不是完整 MCTS,但也在做“哪些分支值得扩展”的预算分配。

Softmax gating:把分数变成权重

如果不想只做硬选择,可以先把 score 转成概率权重:

pi=exp(si)jexp(sj)p_i = \frac{\exp(s_i)} {\sum_j\exp(s_j)}

这里 sis_i 表示第 ii 个候选的原始 score,分母对全部候选求和,所以所有 pip_i 的总和等于 1。

MoE router 常在 top-k 之后只对被选中的 expert 重新归一化:

p~i=exp(si)jSkexp(sj),iSk\tilde p_i = \frac{\exp(s_i)} {\sum_{j\in S_k}\exp(s_j)}, \quad i\in S_k

其中 SkS_k 表示 score 最高的 kk 个 expert 集合;新的分母只在 SkS_k 内求和,因此未入选 expert 的权重为 0,入选权重重新加总为 1。

然后把 expert 输出加权合并:

y=iSkp~iEi(x)y = \sum_{i\in S_k}\tilde p_i E_i(x)

这里 EiE_i 是第 ii 个 expert。读这行式子时,重点是稀疏性:总共有很多 expert,但每个 token 只激活少数几个。

负载均衡:不能让所有 token 都挤向少数专家

如果 router 总是选择同几个 expert,MoE 会出现 hot expert:少数专家过载,其他专家闲置。一个简单负载向量可以写成:

fi=tokens routed to expert itotal routed tokensf_i = \frac{\text{tokens routed to expert }i} {\text{total routed tokens}}

理想状态下,fif_i 不必完全相等,但不能严重塌缩。负载均衡 loss 的不同论文写法很多,核心都是约束 router 分布和实际 token 分配不要太偏。

DeepSeek expert load

图源:DeepSeek-V3 技术报告相关图,已本地化于论文专题。原图展示不同设置下 expert load 的热力图。这里的重点是:稀疏路由不仅要选 top-k,还要监控专家负载是否均衡。

Entropy:选择分布有多尖

router 或采样分布的熵可以写成:

H(p)=ipilogpiH(p) = -\sum_i p_i\log p_i

低熵表示分布很尖,模型强烈偏向少数候选;高熵表示分布更平,候选更分散。

这在两个地方很重要。第一,生成解码里,低熵上下文更容易被 draft model 猜中,高熵上下文需要更大候选预算。第二,MoE 里,router 熵过低可能导致专家塌缩;熵过高则可能说明路由没有学出清晰分工。

Capacity 和丢弃:选择还受系统预算约束

理论上 top-k 选中了 expert,系统就该处理它。但训练和推理中,每个 expert 的容量可能有限。若某个 expert 被太多 token 选中,系统要么排队,要么溢出,要么使用 dropless routing 和更复杂通信。

所以稀疏选择有两层约束:

层次 问题 典型指标
模型层 该选哪些候选 accuracy、reward、acceptance、expert specialization
系统层 选中的候选能否高效执行 expert load、all-to-all、GEMM size、latency

这解释了为什么 MoE 报告不能只看 total parameters 和 activated parameters。router 数学上选得漂亮,如果系统执行时 hot expert、all-to-all 或碎 GEMM 成为瓶颈,实际吞吐仍会受影响。

常见误读

误读 更稳的理解
top-k 就是简单排序 top-k 是不可逆剪枝,score 误差会直接影响后续计算
beam search 就等于更聪明的采样 beam 是确定性搜索,常偏向高似然路径,不等于多样性
MCTS 只是暴力枚举 它用访问次数、先验和价值估计决定搜索预算
router 概率就是专家质量 router 概率只是当前上下文下的分配权重,不等于专家全局能力
MoE 激活参数少就一定快 稀疏计算还要付 token dispatch、通信和负载均衡成本
熵越低越好 低熵可提高确定性,也可能导致探索不足或专家塌缩

读完以后怎么判断

看到 top-k、beam、MCTS、router、gating、expert load 或 entropy,先问:score 来自哪里,选择是硬的还是软的,被剪掉的候选是否还能恢复,树搜索怎样分配探索预算,负载是否均衡,稀疏选择省下的计算有没有被系统成本吃掉。这个问题链会支撑 DeepSeek-V3、Kimi-K2、Nemotron、Gemini、EAGLE-2、MuZero、稀疏注意力和候选轨迹排序论文。

  • Title: 基础知识:离散选择、Top-k 与稀疏路由
  • Author: Charles
  • Created at : 2026-06-02 09:00:00
  • Updated at : 2026-06-02 09:00:00
  • Link: https://charles2530.github.io/2026/06/02/ai-files-prerequisite-math-discrete-selection-topk-and-routing/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments