我的数字花园
← 返回文章列表
68 分钟阅读

从 KL、MoE 到 RAG:四篇技术博客的第一性原理学习笔记

关于KL散度、MoE和RAG的学习笔记

从 KL、MoE 到 RAG:四篇技术博客的第一性原理学习笔记(校正版)

基于四篇 LINUX DO 博客重新整理,并用原始论文、技术报告和研究机构文章核对关键细节。
这不是对原文的逐段复述,而是一份可以独立学习的“重构版教材”:保留原文擅长的直觉解释,修正容易误导的绝对化表述,并补上公式成立的条件、工程边界和常见失败模式。

原始博客

  1. 《MoE 相关知识点汇总与讲解(上)》
  2. 《MoE 相关知识点汇总与讲解(下)》
  3. 《RAG,你真的了解 RAG 吗?RAG 全链路拆解》
  4. 《KL 散度概论的个人总结》

目录


0. 先看全局:四篇文章在解决什么问题

把大语言模型想象成一个正在答题的学生。它面临四类基本问题:

问题 对应主题 一句话解释
我现在的答题习惯,和原来的习惯偏离了多少? KL 散度 比较两个概率分布,并在训练时限制模型“跑偏”
这一道题应该交给哪个脑区处理? MoE 路由 每个 token 只激活少量专家,让总容量变大而单次计算保持稀疏
班里每个脑区的工作量如何别差太多? MoE 负载均衡 防止少数专家挤爆、其余专家饿死
仅靠记忆答不出来时,怎样先查资料再回答? RAG 从外部知识源检索证据,把证据放进上下文后生成答案

四篇博客的主线可以压缩成下面这张图:

训练目标层:
    KL —— 控制“模型行为分布”不要偏得太远

模型结构层:
    MoE —— 控制“计算资源”应该分配给哪些专家

知识系统层:
    RAG —— 控制“外部信息”应该检索哪些证据

共同本质:
    都在有限资源下,根据一个分数做选择,并处理选择失误

四篇文章各自最值得保留的观点

KL 博客

最值得保留的是三个直觉:

  1. KL 不只是“两个分布差多少”,还可以理解成“用错误分布编码数据时,多付出的平均信息成本”。
  2. KL(P‖Q)KL(Q‖P) 不同,交换顺序会改变惩罚重点。
  3. 在 RLHF 中,不能只背一个 KL 公式,还要分清参考策略、旧策略、当前策略,以及“估计 KL 数值”和“估计 KL 梯度”是两件不同的事。

MoE(上)

最值得保留的是一条完整因果链:

专家多了
  → 模型总参数容量变大
  → 必须用 Router 稀疏选择
  → 选择可能不均衡
  → 需要容量、负载均衡和调度机制

MoE(下)

最值得保留的是两个区分:

  • 总参数量不等于每个 token 激活的参数量
  • 理论 FLOPs不等于真实延迟,因为 MoE 还受通信、负载长尾和硬件调度影响。

RAG 博客

最值得保留的是“全链路意识”:

文档解析
→ 切块
→ 建索引
→ 查询改写
→ 召回
→ 融合
→ 重排
→ 组装上下文
→ 生成
→ 评估

RAG 的效果不是由某一个 embedding 模型决定,而是整条链路最薄弱的一环决定。

一句话总评

这四篇博客都很适合建立直觉。需要修正的主要问题不是“方向完全错误”,而是:

把某篇论文、某种实现或某个经验规律,说成了所有系统都必然成立的普遍规律。

本文会反复使用三个标签:

  • 直觉正确:适合入门,但还需补充条件。
  • 条件成立:在指定模型、公式定义或工程设置下成立。
  • 需要修正:公式、符号、因果解释或适用范围不够准确。

返回目录


1. 如何用费曼学习法阅读本文

“费曼学习法”并不是把知识讲得幼稚,而是强迫自己暴露理解漏洞。每个主题都按四层展开。

第一层:用生活类比说清目标

例如:

  • KL:两本编码字典哪本更适合真实消息?
  • MoE:医院分诊台如何把患者送到合适科室?
  • RAG:写论文前如何先去图书馆找证据?

类比只负责回答“它为什么存在”,不负责替代技术机制。

第二层:把类比还原成对象与操作

例如 MoE:

患者       → token
分诊台     → Router
专科       → Expert FFN
接诊上限   → Capacity
科室排队   → Expert load

这一步要能指出:系统接收什么输入,计算什么分数,输出什么结果。

第三层:只保留最小必要公式

公式的作用不是装饰,而是精确回答:

  • 在谁的分布下求平均?
  • 哪些量能反向传播?
  • 哪些量是离散选择?
  • 哪些结论需要分布支持集、归一化或采样假设?

第四层:主动寻找失效条件

真正理解一个概念,必须能回答“什么时候它不工作”。

例如:

  • HNSW 很快,但它是近似搜索,不保证总能找到精确全局 Top-K。
  • Top-k MoE 很省专家计算,但可能产生通信瓶颈和负载长尾。
  • k3 KL 估计器逐样本非负且数值无偏,但这不等于对它直接自动求导就得到正确的 KL 梯度。
  • RAG 找到相似文本,不等于找到支持答案的证据。

每个大节末尾都有一个“费曼复述”。建议先遮住答案,用自己的话讲一遍,再对照。

返回目录


2. 第一性原理底座:模型究竟在做什么

在进入专业名词前,先从最小事实出发。

2.1 大语言模型输出的不是“答案”,而是概率分布

给定前文 (h),语言模型计算下一个 token 的条件概率:

[ \pi_\theta(y\mid h) ]

其中:

  • (\pi) 常用来表示一个策略或概率分布;
  • (\theta) 是模型参数;
  • (h) 是已经出现的上下文;
  • (y) 是候选下一个 token。

模型真正产生文本时,再用贪婪选择或采样,从这个分布中选一个 token。

术语卡|Token

“Token”原意是符号或记号。在语言模型里,它是分词器处理后的最小编号单位,不一定等于一个汉字或一个单词。模型先把文本变成 token ID,再把每个 ID 映射成向量。训练、上下文长度和生成速度通常都按 token 计数。

术语卡|概率分布

概率分布规定了每种可能结果有多大概率。离散分布满足 (P(x)\ge 0) 且 (\sum_xP(x)=1)。语言模型的“行为”可以视为:在每个上下文下,对所有下一 token 给出一组概率。

因此,训练模型至少包含三件事:

  1. 表示:把文字、图片或结构化数据变成数值向量。
  2. 计算:用参数把输入向量变成新的向量和概率。
  3. 优化:根据损失函数调整参数,使期望行为更好。

KL 主要属于第 3 件事;MoE 改造第 2 件事;RAG 在第 1 件事之前增加“从外部世界取信息”的步骤。

2.2 向量不是知识本身,而是可计算的表示

术语卡|Vector / 向量

向量是一串有顺序的数,例如 ([0.2,-1.1,0.7])。在机器学习中,向量用来承载对象的特征,使相似度、线性变换和梯度优化能够进行。向量不是对象本身,也不天然具有“语义”;语义来自训练目标和数据约束。

术语卡|Embedding / 嵌入

“Embedding”来自数学中把一个对象映射进另一个空间的思想。机器学习里的用法更宽松:把 token、句子、图片或用户映射成固定维度的向量。它的作用是让原本难以直接计算的对象,可以用距离或内积进行比较。
注意:embedding 相近通常只表示模型学到的某种相似性,不自动等于“事实相关”“能够回答问题”或“逻辑上支持结论”。

2.3 分数、概率与选择是三件事

很多系统都遵循同一模式:

输入
→ 计算候选分数
→ 把分数变成概率或排序
→ 选择少量候选
→ 对选择结果继续计算
  • KL 比较两个概率分布;
  • MoE Router 给专家打分并选 Top-k;
  • RAG Retriever 给文档打分并取 Top-k;
  • PPO 用奖励和概率比决定更新方向。

最常见的误区是把“分数高”误当成“绝对正确”。分数只是某个训练目标下的代理量。

返回目录


3. KL 散度:如何衡量“两个行为分布差了多少”

3.1 从编码问题推导 KL,而不是先背公式

假设真实消息来自分布 (P),但你误以为消息来自 (Q)。

信息论告诉我们:一个概率越小的事件,理想编码所需的长度越长。若使用自然对数,事件 (x) 的信息量可写成:

[ -\ln P(x) ]

若使用错误分布 (Q) 编码,平均编码长度是交叉熵:

[ H(P,Q)=\mathbb E_{x\sim P}[-\ln Q(x)] ]

若使用真实分布 (P),理论平均长度是熵:

[ H(P)=\mathbb E_{x\sim P}[-\ln P(x)] ]

两者之差:

[ H(P,Q)-H(P)

\mathbb E_{x\sim P}\left[\ln\frac{P(x)}{Q(x)}\right]

D_{\mathrm{KL}}(P\parallel Q) ]

这就是 KL 散度。

术语卡|Entropy / 熵

“熵”一词先出现在热力学中,后来由 Claude Shannon 在信息论中用于衡量不确定性。信息熵 (H(P)) 表示:若数据服从 (P),最理想的平均编码成本是多少。
它不是“混乱程度”这么简单;在这里,它是一个明确的平均信息量。

术语卡|KL divergence / KL 散度

KL 来自 Solomon Kullback 与 Richard Leibler 在 1951 年发表的工作,原文称为“information for discrimination”,后来也常叫相对熵。
它衡量:当真实数据按 (P) 出现,却用 (Q) 描述或编码时,平均多付出多少信息成本。

离散形式:

[ D_{\mathrm{KL}}(P\parallel Q)

\sum_x P(x)\ln\frac{P(x)}{Q(x)} ]

连续形式把求和换成积分,但还涉及概率密度与测度,初学时不必强行类比成“每个点的概率”。

对数底数决定单位

  • (\ln):单位是 nat
  • (\log_2):单位是 bit

更换底数只会乘一个正常数,不改变非负性和最优点。

3.2 一个硬币例子

设:

[ P=(0.9,0.1),\qquad Q=(0.5,0.5) ]

则:

[ D_{\mathrm{KL}}(P\parallel Q)

0.9\ln\frac{0.9}{0.5} + 0.1\ln\frac{0.1}{0.5} \approx 0.3681\ \text{nats} ]

交换顺序:

[ D_{\mathrm{KL}}(Q\parallel P) \approx 0.5108\ \text{nats} ]

两个结果不同,所以 KL 不是普通几何距离。

3.3 KL 的三个核心性质

性质一:非负

在满足必要支持条件时:

[ D_{\mathrm{KL}}(P\parallel Q)\ge 0 ]

且当两个分布几乎处处相等时取 0。

可以由 (\ln t\le t-1) 推出。直觉上:真实分布本身已经给出最优平均编码,错误分布不能在平均意义上比它更省。

性质二:非对称

一般有:

[ D_{\mathrm{KL}}(P\parallel Q) \ne D_{\mathrm{KL}}(Q\parallel P) ]

**需要修正的常见解释:**非对称不是因为“对数函数不对称”。对数只是一个一元函数。真正原因是交换 (P,Q) 后:

  1. 求平均所用的权重从 (P(x)) 变成了 (Q(x));
  2. 比值从 (P/Q) 变成了 (Q/P)。

也就是说,两个方向在关注不同分布认为“经常发生”的区域。

性质三:支持集非常重要

术语卡|Support / 支持集

一个分布的支持集,是它可能产生且概率不为零的区域。
若 (P(x)>0) 但 (Q(x)=0),则 (\ln(P(x)/Q(x))) 发散,(D_{\mathrm{KL}}(P\parallel Q)=+\infty)。

这说明:如果真实世界认为某件事可能发生,而近似模型断言它绝不可能发生,KL 会施加无限惩罚。

3.4 为什么叫 Forward KL 和 Reverse KL

通常先约定:

  • (P):目标分布、数据分布;
  • (Q):待学习的近似分布。

然后把:

[ D_{\mathrm{KL}}(P\parallel Q) ]

叫 Forward KL,把:

[ D_{\mathrm{KL}}(Q\parallel P) ]

叫 Reverse KL。

但“forward/reverse”是依赖约定的称呼,不是公式自带的宇宙方向。阅读论文时必须先看作者把谁当目标、谁当近似。

Forward KL 的常见倾向:覆盖目标支持

若 (P) 在某区域有概率而 (Q) 给零概率,惩罚会发散。于是受限的 (Q) 往往倾向覆盖 (P) 的多个模式,常被称为:

  • mode-covering;
  • mass-covering;
  • zero-avoiding。

Reverse KL 的常见倾向:避开目标低概率区

若 (Q) 把概率放在 (P) 几乎为零的区域,Reverse KL 惩罚很大。受限的 (Q) 可能集中到某一个高概率模式,常被称为:

  • mode-seeking;
  • zero-forcing。

重要限定:“Forward 一定覆盖、Reverse 一定寻峰”是对受限近似族和典型多峰例子的经验概括,不是对所有优化问题都无条件成立的定理。若 (Q) 的表达能力足够且优化成功,两个方向的共同最优解都是 (Q=P)。

3.5 KL 为什么出现在最大似然、SFT 和蒸馏中

术语卡|Maximum Likelihood Estimation, MLE / 最大似然估计

MLE 的目标是让模型给观测数据更高概率。对数据 (x\sim P_{\text{data}}),最大化 (\log Q_\theta(x)),等价于最小化负对数似然。
由于 [ H(P_{\text{data}},Q_\theta)

H(P_{\text{data}}) + D_{\mathrm{KL}}(P_{\text{data}}\parallel Q_\theta), ] 而 (H(P_{\text{data}})) 对模型参数不变,所以最小化交叉熵等价于最小化从数据分布到模型分布的 KL。

术语卡|SFT / 监督微调

SFT 是 Supervised Fine-Tuning。它用“输入—理想输出”样本继续训练预训练模型,常见目标仍是逐 token 交叉熵。它教模型模仿样本答案,但不直接保证事实正确、偏好最优或长期策略最优。

术语卡|Knowledge Distillation / 知识蒸馏

蒸馏让学生模型模仿教师模型的输出分布。经典做法常最小化教师到学生的交叉熵或 KL,因此具有“不要漏掉教师给出概率的候选”的倾向。现代蒸馏有许多变体,不能把所有蒸馏都归结为同一个 KL 方向。

3.6 KL 在 RLHF 中到底约束什么

术语卡|RLHF

RLHF 是 Reinforcement Learning from Human Feedback,即“基于人类反馈的强化学习”。典型流程是:先做 SFT,再训练奖励模型或使用可验证奖励,最后用强化学习更新策略。它的目的不是单纯模仿一条答案,而是提高被奖励的行为概率。

一个常见的正则化目标是:

[ J(\pi_\theta)

\mathbb E_{\tau\sim\pi_\theta}[R(\tau)]

\beta \mathbb E_x\left[ D_{\mathrm{KL}} \bigl( \pi_\theta(\cdot\mid x) \parallel \pi_{\mathrm{ref}}(\cdot\mid x) \bigr) \right] ]

其中:

  • (\pi_\theta):正在训练的当前策略;
  • (\pi_{\mathrm{ref}}):固定参考策略,通常来自 SFT;
  • (R):奖励;
  • (\beta):奖励与“不要偏离参考模型”之间的权衡。

KL 的作用类似护栏:

只追奖励
  → 模型可能钻奖励函数漏洞、语言退化或分布漂移

加入 KL
  → 鼓励模型提高奖励时,仍保留参考模型的基本行为

必须区分三个策略

术语卡|(\pi_{\mathrm{ref}},\pi_{\mathrm{old}},\pi_\theta)

  • (\pi_{\mathrm{ref}}):固定参考模型,用于 KL 护栏;
  • (\pi_{\mathrm{old}}):生成当前 rollout 的策略快照,用于 PPO 概率比;
  • (\pi_\theta):正在 minibatch 更新的当前策略。

(\pi_{\mathrm{ref}}) 与 (\pi_{\mathrm{old}}) 可能在训练初期相同,但角色完全不同。把它们混为一谈,会使 PPO 与 KL 公式都难以理解。

3.7 用样本估计 KL:k1、k2、k3

先固定记号,否则非常容易把正负号写反。

令:

[ x\sim q,\qquad r(x)=\frac{p(x)}{q(x)} ]

目标是估计:

[ D_{\mathrm{KL}}(q\parallel p)

\mathbb E_{x\sim q}\left[\log\frac{q(x)}{p(x)}\right]

\mathbb E_q[-\log r] ]

k1:最直接的估计

[ k_1=-\log r ]

性质:

  • 对 KL 数值是无偏估计;
  • 单个样本可以为负;
  • 只有期望保证非负;
  • 当似然比波动大时,方差可能较大。

修正原文表述:“大量 token 累计后总体非负”不是有限样本下的数学保证。有限样本均值仍可能小于 0,只是样本数增大时会在适当条件下收敛到非负的真实 KL。

k2:二阶局部近似

[ k_2=\frac12(\log r)^2 ]

性质:

  • 每个样本都非负;
  • 一般是有偏估计;
  • 当 (p) 与 (q) 很接近时,可由局部二阶近似解释;
  • 分布相差较大时,偏差可能明显。

“更稳定”不是无条件保证。样本非负不等于方差一定更小,也不等于梯度一定更正确。

k3:加入零均值控制变量

[ k_3=(r-1)-\log r ]

因为:

[ \mathbb E_q[r-1]

\sum_xq(x)\left(\frac{p(x)}{q(x)}-1\right)

\sum_xp(x)-\sum_xq(x)

0 ]

所以在支持与期望存在等条件满足时:

[ \mathbb E_q[k_3]

D_{\mathrm{KL}}(q\parallel p) ]

又因为对 (r>0):

[ r-1-\log r\ge 0 ]

所以每个样本的 (k_3) 都非负。

术语卡|Control Variate / 控制变量

控制变量是一种蒙特卡洛降方差技术:给估计量加上一个期望为零、但与原估计量相关的随机量,从而不改变期望,却可能减小波动。
(r-1) 的期望为零,因此 (k_3) 可看作给 (k_1) 加了控制变量。

需要保留的限定:

  • “低方差”通常在 (p,q) 比较接近时成立得较好,不是所有分布上的绝对保证;
  • 若 (r=p/q) 有重尾或极端值,(k_3) 仍可能波动很大;
  • k1/k2/k3 是实践社区常用的非正式标签,不是所有教材统一采用的命名。

3.8 最关键纠错:KL 数值估计器不等于 KL 梯度估计器

这是原博客最值得进一步补上的地方。

假设分布 (q_\theta) 本身依赖参数:

[ F(\theta)

\mathbb E_{x\sim q_\theta}[f_\theta(x)] ]

对它求导时,不只有“对 (f_\theta) 求导”这一项。离散随机变量下,完整形式包含:

[ \nabla_\theta F

\mathbb E_{q_\theta} \left[ f_\theta(x)\nabla_\theta\log q_\theta(x) + \nabla_\theta f_\theta(x) \right] ]

第一项来自“采样分布本身随参数变化”,常叫 score-function 或 policy-gradient 项。

术语卡|Monte Carlo estimator / 蒙特卡洛估计

当一个期望无法精确求和时,可以从分布采样,用样本平均近似期望。估计量是否无偏,描述的是样本平均的期望是否等于目标数值;它不自动说明对该样本表达式做自动微分后,梯度也是无偏的。

因此:

一个表达式能无偏估计 KL 的数值,不代表把它当普通 loss 直接 autograd.backward(),就一定得到正确的 KL 梯度。

2025 年关于 RL 中 KL 梯度估计陷阱的研究专门指出:某些开源实现把 KL 样本估计直接当损失微分,会漏掉目标梯度所需的项;自回归序列还会因为前面 token 改变后续状态分布,使问题更复杂。

3.9 KL 放进 reward,还是显式放进 policy loss

原博客提出了这个重要问题,但“放进 reward 后直接梯度被抹消”需要修正。

方式 A:作为奖励惩罚

令:

[ R' = R-\beta,\widehat{\mathrm{KL}} ]

然后用 (R') 计算 return、advantage 和策略梯度。

即使 KL 数值被 detach,它仍会通过 advantage 影响策略更新:

某类动作 KL 惩罚大
→ 该动作的回报/优势下降
→ policy gradient 降低它再次出现的概率

强化学习本来就通常不要求奖励对策略参数可微。策略梯度通过 (\nabla\log\pi_\theta(a\mid s)) 把奖励信号传给参数。因此“梯度被抹消”不是准确说法。

方式 B:显式正则项

在策略损失之外加入某种可微 KL 正则。它可能直接对当前 logits 产生梯度,但是否正确取决于:

  • KL 的方向;
  • 采样来自谁;
  • 哪些量 stop-gradient;
  • 是 token 级还是序列级;
  • 是否正确处理采样分布依赖;
  • 与 PPO minibatch 重用和 clipping 如何组合。

两种方式为什么工程上不必等价

术语卡|PPO

PPO 是 Proximal Policy Optimization,由 Schulman 等人在 2017 年提出。它通过限制新策略相对 rollout 策略变化过大,提升训练稳定性。常见 clipped surrogate 使用概率比: [ \rho_t(\theta)

\frac{\pi_\theta(a_t\mid s_t)} {\pi_{\mathrm{old}}(a_t\mid s_t)} ] 再把 (\rho_t A_t) 限制在一定更新范围内。

PPO clipping 裁剪的是 surrogate objective 中的策略概率比贡献,并不是“直接把 KL 惩罚裁掉”。但若 KL 被放进 advantage,它会和 clipped surrogate 一起经历优化;若 KL 是额外 loss,它走另一条梯度路径。有限样本、clip、stop-gradient、critic 目标和 minibatch 重用都会破坏简单的代数等价。

Actor 与 Critic 是否“不一致”

术语卡|Actor–Critic

Actor 是策略,决定做什么;Critic 估计状态或动作的未来回报,用作基线和优势估计,主要作用是降低策略梯度方差。

若 actor 优化的是“任务奖励减 KL”后的总回报,让 critic 也学习这个惩罚后的 return 是合理而常见的设计。若把 KL 作为单独正则,让 critic 只估任务奖励,也可能形成另一种有效算法。二者是目标与估计器设计差异,不能简单判断为“一个一致、一个必然错误”。

3.10 自回归序列中的 token KL

序列策略可分解为:

[ \pi(y_{1:T}\mid x)

\prod_{t=1}^T \pi(y_t\mid x,y_{<t}) ]

在适当条件下,序列 KL 可写成沿当前策略生成历史的条件 token KL 期望之和。但要注意:

  • 前面 token 改变,后面的上下文状态也改变;
  • 后续 token 的概率不是在固定状态上独立计算;
  • 逐 token 惩罚、序列级奖励和梯度信用分配不是同一个概念。

这也是“看起来只是把 token KL 加起来”,实现却容易出错的原因。

3.11 费曼复述:把 KL 讲给中学生

我有两本预测字典。真实世界按 (P) 出题,但我用 (Q) 猜题。KL 衡量我因为用错字典,平均多浪费多少编码长度。
顺序不能乱,因为 P‖Q 是在 (P) 常出现的地方检查 (Q),Q‖P 是在 (Q) 常出现的地方检查 (P)。
训练时,我们可以从模型采样来估计 KL,但“估计出一个正确平均数”和“对这个数直接求导得到正确更新”不是一回事。

本节检查点

你应该能回答:

  1. 为什么 KL 非对称?
  2. 为什么 (P(x)>0,Q(x)=0) 会导致无限 KL?
  3. k3 为什么既无偏又逐样本非负?
  4. 为什么 detached 的 KL reward 仍能影响 policy gradient?
  5. (\pi_{\mathrm{ref}}) 和 (\pi_{\mathrm{old}}) 有什么不同?

返回目录


4. MoE(上):为什么要让不同 token 走不同专家

4.1 先理解 Transformer 中的 FFN

一个典型 Transformer block 可以粗略看成两种计算交替:

Attention:
让不同 token 读取、汇总彼此的信息

FFN:
对每个 token 的表示分别做非线性加工

术语卡|Transformer

Transformer 是 2017 年提出的一类序列建模架构。它的核心创新是用注意力机制直接建立 token 间关系,并配合逐 token 的前馈网络、残差连接和归一化层。现代大语言模型通常由许多 Transformer block 堆叠而成。

术语卡|Attention / 注意力

注意力不是人的意识注意,而是一种加权信息汇总运算。一个 token 生成 Query,与其他 token 的 Key 计算匹配分数,再用这些分数加权 Value。它解决的是“当前 token 应该从上下文的哪些位置读取信息”。

术语卡|FFN / Feed-Forward Network

FFN 是前馈网络。在 Transformer 中,它通常对每个 token 独立应用同一组参数。经典形式是: [ \operatorname{FFN}(x)=W_2\phi(W_1x) ] 第一层把隐藏维度扩展到中间维度,激活函数提供非线性,第二层再投影回隐藏维度。
Attention 负责 token 之间“交流”,FFN 负责每个 token 内部“加工”。

因此,原博客说“MoE 是更高级的 FFN”作为直觉可以保留,但精确说法应是:

在许多 Transformer 模型中,MoE 用一个条件激活的专家 FFN 集合,替换部分或全部普通 FFN 子层。

它不一定替换每一层,也不一定所有专家都长得完全一样。

4.2 MoE 从哪里来

术语卡|Mixture of Experts / 混合专家

“Mixture of Experts”思想至少可以追溯到 Jacobs、Jordan、Nowlan 与 Hinton 在 1991 年的工作:多个局部专家处理不同输入区域,一个 gating network 决定如何组合它们。
2017 年,Shazeer 等把稀疏门控 MoE 扩展到超大规模神经网络:专家很多,但每个样本只激活少数专家。它因此成为“条件计算”的代表结构。

术语卡|Conditional Computation / 条件计算

普通稠密网络对每个输入运行同一批参数;条件计算根据输入只运行部分模块。目标是把“模型能储存多少模式”的总容量,与“每次输入要付多少计算”部分解耦。

普通 FFN:

所有 token
   ↓
同一个 FFN

MoE:

token
  ↓
Router 打分
  ↓
选择 Top-k 专家
  ↓
专家分别处理
  ↓
加权合并输出

数学上可写成:

[ y_t

\sum_{i\in\mathcal T_k(t)} g_{t,i}E_i(h_t) ]

其中:

  • (h_t):第 (t) 个 token 的隐藏表示;
  • (E_i):第 (i) 个专家,通常是 FFN;
  • (\mathcal T_k(t)):该 token 选中的 k 个专家;
  • (g_{t,i}):合并专家输出的权重。

4.3 MoE 真正的收益是什么

第一性原理上,模型容量和单次计算不是同一件事。

总参数量

所有专家、注意力层、Router、共享模块的参数总和。它决定:

  • 权重文件有多大;
  • 训练时参数、梯度、优化器状态要占多少内存;
  • 系统总共能容纳多少可学习自由度。

激活参数量

处理一个 token 时真正参与前向计算的参数。它更接近单 token 算术成本,但不等于完整延迟。

例如有 64 个专家,每个 token 选 2 个:

储存容量:64 个专家
本次专家计算:2 个专家

这就是稀疏 MoE 的核心价值:

在不让每个 token 运行全部专家的情况下,提高总参数容量。

需要修正的过度推断:“参数更多,所以一定储存更多知识、一定更聪明”不成立。参数只是容量条件,效果还取决于:

  • 数据质量与数量;
  • 专家宽度;
  • 路由质量;
  • 优化稳定性;
  • 专家是否得到足够训练;
  • 系统是否能高效运行。

4.4 专家真的会变成数学、代码、中文专家吗

训练中确实可能出现专家特化,但不应把名字理解得太拟人化。

术语卡|Expert specialization / 专家特化

专家特化指不同专家接收的数据分布和学习到的函数出现差异。差异可能与语言、主题、语法结构、token 位置、频率、特征尺度或更难解释的内部模式相关。
“专家”是架构名称,不保证每个专家都有清晰的人类语义标签。

Router 与专家共同训练后,可能形成正反馈:

某专家早期偶然多接到某类 token
→ 它在这类 token 上学得更快
→ Router 更愿意继续选择它
→ 分工逐渐稳定

这既可能产生有益特化,也可能滑向负载崩塌。

4.5 Router:分诊台如何选择专家

术语卡|Router / Gate

Router 是路由器,Gate 是门控器。在 MoE 中,它根据 token 隐藏表示给专家打分,并决定激活哪些专家。早期 MoE 文献常用 gating network;现代工程语境更常说 router。两者功能高度重叠。

经典做法:

[ s_{t}=W_r h_t ]

再用 Softmax:

[ p_{t,i}

\frac{e^{s_{t,i}}}{\sum_j e^{s_{t,j}}} ]

然后选择分数最大的 k 个专家。

术语卡|Softmax

Softmax 把一组任意实数分数变成和为 1 的正数。它的指数形式会放大分数差异,因此常用于分类概率和路由权重。
现代 MoE 不一定都使用 Softmax;例如有些模型使用逐专家 Sigmoid affinity,再只在选中专家间归一化。

术语卡|Top-k

Top-k 表示只保留分数最高的 k 个候选。它把连续分数变成离散稀疏选择。优点是省计算;缺点是边界不连续:两个分数只差一点,排名交换后,实际计算路径可能完全变化。

4.6 为什么会发生负载不均衡

假设医院分诊台发现 A 科最强,于是把大量患者送给 A 科。A 科获得更多病例、训练得更快,分诊台又更相信它,最终形成:

偶然偏好
→ 更多 token
→ 更多梯度
→ 专家更强
→ 更高路由分数
→ 更严重偏好

术语卡|Routing collapse / 路由崩塌

路由崩塌指少数专家吸收大部分 token,而其他专家很少被使用。它会造成专家训练不足、硬件负载失衡和模型容量浪费。
它是负载不均衡的极端情况,不是所有专家溢出的唯一原因。

即使没有崩塌,负载也可能因为以下因素波动:

  • batch 太小;
  • 当前输入恰好高度同质;
  • 领域分布变化;
  • top-k 的离散边界;
  • capacity factor 太小;
  • 推理请求与训练分布不同。

4.7 辅助负载均衡损失

Switch Transformer 中经典的 Top-1 形式为:

[ L_{\mathrm{aux}}

\alpha N\sum_{i=1}^{N} f_iP_i ]

其中:

[ f_i

\frac1T \sum_{t=1}^{T} \mathbf 1[\operatorname{argmax}j p{t,j}=i] ]

表示实际分给专家 (i) 的 token 比例;

[ P_i

\frac1T \sum_{t=1}^{T}p_{t,i} ]

表示 Router 平均给专家 (i) 的概率。

术语卡|Auxiliary loss / 辅助损失

主损失直接对应主要任务,例如下一个 token 预测;辅助损失用于鼓励某种内部性质,例如负载均衡、表示分散或中间层预测。
它的作用是给本来很难由主任务自动学出的结构偏好提供梯度,但权重过大会干扰主任务。

这个公式的直觉是:

[ f_iP_i \approx \text{“已经很忙的专家,Router 还在多喜欢它”的程度} ]

  • (f_i) 来自离散分配,通常不直接对 Router 求导;
  • (P_i) 是连续概率,可以提供梯度;
  • 忙专家的 (f_i) 大,它对应的高 (P_i) 会受到更强惩罚。

原博客数值例子的两个修正

均衡时,若 (N=4):

[ f=P=(0.25,0.25,0.25,0.25) ]

则:

[ N\sum_i f_iP_i=1 ]

所以完整损失是:

[ L_{\mathrm{aux}}=\alpha ]

不是 1,除非 (\alpha=1)。

若博客给定 (\alpha=0.01),均衡例子应为:

[ 0.01 ]

不均衡例子中:

[ N\sum_i f_iP_i=2.91 ]

完整损失应为:

[ 0.0291 ]

原文漏乘了 (\alpha)。相对比较仍然成立,但公式数值需要补全。

这个公式不是任意 Top-k 的统一形式

原公式中的 argmax 对应 Top-1。Top-k 系统通常要按“一个 token 产生 k 次专家分配”重新定义负载比例,论文之间归一化方式也可能不同。

例如一种常见定义是:

[ f_i

\frac{N}{kT} \sum_t \mathbf1[i\in\operatorname{TopK}(t)] ]

这时完全均衡时 (f_i=1),而不是 (1/N)。阅读公式时不能只看符号名,必须看定义。

4.8 Capacity:为什么专家要有接诊上限

术语卡|Capacity / 专家容量

Capacity 是一次路由组中,每个专家最多处理多少 token-to-expert 分配。它最初主要服务于静态张量形状、并行调度与避免单个专家成为长尾。
容量不是 MoE 的数学必需品,而是许多稀疏实现的工程机制;也存在 dropless MoE。

总 token 数为 (T),每个 token 选 k 个专家,共有 N 个专家。总分配数约为 (Tk),平均每个专家:

[ \frac{Tk}{N} ]

于是常见容量公式为:

[ C

\left\lceil \mathrm{CF}\cdot\frac{Tk}{N} \right\rceil ]

其中 CF 是 capacity factor。

术语卡|Capacity factor

Capacity factor 是平均负载之上的安全余量。CF 越大,溢出概率通常越低,但 padding、显存或无效计算可能增加;CF 越小,资源紧凑,但更容易溢出。

原文容量例子的明确笔误

给定:

[ T=1024,\quad N=8,\quad k=1 ]

若:

[ \mathrm{CF}=1 ]

则:

[ C=128 ]

若:

[ \mathrm{CF}=1.25 ]

则:

[ C=160 ]

原文参数列表写的是 1,计算却用了 1.25。

另外,原文同时用 (\alpha) 表示辅助损失权重和 capacity factor,容易混淆。建议固定使用:

  • (\alpha_{\mathrm{aux}}):辅助损失权重;
  • (\mathrm{CF}):容量系数。

4.9 Token dropping 到底“丢”了什么

当专家超过容量时,超出的路由分配可能被跳过、改送其他专家或进入 fallback。

术语卡|Token dropping

在 Switch Transformer 一类结构中,dropping 通常表示该 token 的专家分支没有正常执行,而不是把 token 从整个序列中删除。残差连接仍可能把原表示送到下一层。
因此更准确的说法是“丢弃某次 token-to-expert 计算路径”。

它仍然有代价:

  • 专家分支没有加工该 token;
  • 对应专家收不到该样本梯度;
  • 若某类 token 更常溢出,会产生系统性偏差;
  • 训练与推理的路由行为可能不一致。

但 token dropping 不是所有 MoE 必然存在的机制。DeepSeek-V3 技术报告明确描述其训练与推理采用 no-token-dropping 策略。

4.10 Expert Choice:让专家反过来挑 token

普通 Token Choice:

每个 token
→ 选择自己最喜欢的 k 个专家

Expert Choice:

每个专家
→ 从一批 token 中选择自己最想处理的 c 个

术语卡|Expert Choice Routing

Expert Choice 在 2022 年的工作中系统提出。它把选择方向反转,使每个专家接收固定数量 token,因此专家负载天然受控。代价是每个 token 获得的专家数不再固定。

它解决了专家维度的负载问题,却带来 token 维度的不确定计算量:

  • token 可能没被任何专家选中;
  • token 可能被多个专家选中;
  • 不同 token 获得不同计算量;
  • 流式、自回归推理不容易直接实现。

“破坏因果性”需要加限定

术语卡|Autoregressive / 自回归

自回归模型按顺序生成:位置 (t) 只能依赖输入和 (t) 之前的 token,不能依赖尚未产生的未来 token。这叫因果约束。

若训练时让一个专家查看完整序列,再从所有位置中选择 Top-c,那么位置 (t) 是否被选中可能取决于未来位置的分数。这对朴素的自回归解码器会造成训练—推理不匹配。

但这不意味着 Expert Choice 在所有任务中都“违反因果性”:

  • 双向编码器不受同样约束;
  • 图像模型可同时看到全部 patch;
  • 非自回归或扩散式生成也有不同条件;
  • 可以设计分块、流式或因果化变体。

4.11 Auxiliary-Loss-Free Load Balancing

传统辅助损失通过反向传播改变 Router:

语言建模目标
+
负载均衡目标
→ 共同更新 Router 参数

两者可能出现梯度竞争。Auxiliary-Loss-Free 方法改为:

[ \operatorname{TopK}(s_{t,i}+b_i) ]

其中 (b_i) 是专家动态偏置。

关键点:

  1. (s+b) 用来决定选谁;
  2. 合并专家输出时,权重仍来自原始 affinity (s);
  3. (b_i) 不靠普通反向传播学习;
  4. 根据实际负载在训练步骤之间调整偏置。

生活类比:

医学匹配分数 s:
患者最适合哪个科室

调度偏置 b:
哪个科室现在太忙,临时降低排队优先级

这把“能力匹配”和“系统调度”部分分离。

原文更新公式是简化版

原博客写成按负载误差大小比例更新:

[ b_i \leftarrow b_i-\gamma(\ell_i-\bar\ell) ]

这是一种合理的反馈控制形式,但 Auxiliary-Loss-Free 原始方法和 DeepSeek-V3 的主要描述使用固定步长的符号更新:

[ b_i \leftarrow b_i + \gamma,\operatorname{sign}(\bar\ell-\ell_i) ]

即:

  • 过载:减 (\gamma);
  • 欠载:加 (\gamma)。

原论文也研究过按误差大小更新的变体,但不能把博客公式当作 DeepSeek-V3 的精确实现。

“Loss-Free”不等于绝对没有任何辅助损失

DeepSeek-V3 主要用 batch-wise 动态偏置做负载平衡,但还保留了很小的 sequence-wise 平衡损失,报告中的权重为 (0.0001),用于避免单条序列内部极端失衡。

更准确的说法是:

主要的批级负载控制不再依赖辅助损失梯度,而不是整个模型中任何位置都不存在负载辅助项。

此外,偏置虽然不反向传播,却会改变专家收到的数据,因此仍会间接影响专家训练。它减少的是直接梯度冲突,不是让调度与学习完全隔离。

4.12 费曼复述:把 MoE 讲成医院分诊

普通 FFN 像所有患者都去一个综合科;MoE 像有许多专科,分诊台只把每位患者送到少数几个科室。这样医院可以拥有更多总能力,却不用每位患者看遍所有医生。
难点是热门科室会挤爆。辅助损失像训练分诊员“别总偏爱热门科”;动态 bias 像外部排队系统临时降低繁忙科室优先级;capacity 是科室接诊上限。
专家多并不自动带来速度,因为患者还要跨楼转运,最忙的科室会让所有人等待。

本节检查点

  1. MoE 为什么能提高总参数容量,却不必激活全部参数?
  2. Router score、选择偏置和合并权重有什么区别?
  3. Switch 的经典 aux loss 为什么主要是 Top-1 形式?
  4. Capacity factor 大和小各有什么代价?
  5. 为什么 token dropping 不等于删除整个 token?
  6. Expert Choice 在什么语境下会破坏因果性?

返回目录


5. MoE(下):参数、FLOPs、显存、Kimi K3 与确定性

5.1 先把参数量和 FLOPs 算对

两矩阵 FFN

忽略 bias,设:

  • token 隐藏维度:(D);
  • FFN 中间维度:(d_{\mathrm{ff}});
  • token 数:(T);
  • 层数:(L)。

经典两矩阵 FFN:

[ x\in\mathbb R^D \overset{W_1}{\longrightarrow} \mathbb R^{d_{\mathrm{ff}}} \overset{W_2}{\longrightarrow} \mathbb R^D ]

参数量约为:

[ P_{\mathrm{FFN}} \approx Dd_{\mathrm{ff}}+d_{\mathrm{ff}}D

2Dd_{\mathrm{ff}} ]

若把一次乘加记为 2 FLOPs,前向计算约为:

[ F_{\mathrm{FFN}} \approx 4TLDd_{\mathrm{ff}} ]

若 (d_{\mathrm{ff}}=4D):

[ P_{\mathrm{FFN}}\approx 8D^2 ]

[ F_{\mathrm{FFN}}\approx 16TLD^2 ]

术语卡|FLOPs

FLOP 是一次浮点运算,FLOPs 在不同语境中可能指运算总数或每秒运算能力。模型论文里常把矩阵乘法中的一次乘法和一次加法算作 2 个 FLOPs。
FLOPs 是算术工作量,不是墙钟时间。相同 FLOPs 在不同 batch、数据类型、通信模式和硬件上,延迟可以差很多。

GLU / SwiGLU 不是两个投影,而通常是三个

术语卡|GLU

GLU 是 Gated Linear Unit,最早在门控卷积语言模型中系统使用。它把“内容分支”与“门分支”逐元素相乘,让网络学习每个通道应该开放多少。
Transformer 中常用的 SwiGLU 是 GLU 变体,用 Swish/SiLU 作为门分支非线性。

常见 SwiGLU:

[ \operatorname{SwiGLU}(x)

W_o\left[ \operatorname{SiLU}(W_gx) \odot (W_ux) \right] ]

有三个矩阵:

  • (W_g):gate projection;
  • (W_u):up projection;
  • (W_o):down/output projection。

若三个投影都对应中间宽度 (d_{\mathrm{ff}}),参数量约为:

[ 3Dd_{\mathrm{ff}} ]

前向 FLOPs 约为:

[ 6TDd_{\mathrm{ff}} ]

实际模型常把 SwiGLU 中间维度调小,使参数量或 FLOPs 与传统 (4D) ReLU FFN 接近。因此不能看到 “GLU” 仍直接套用两矩阵 (8D^2) 公式。

5.2 “参数 N 倍、计算 k 倍”何时成立

若有 N 个完全相同的专家,每个专家与原 dense FFN 同宽,每个 token 激活 k 个,那么专家部分近似:

[ P_{\mathrm{expert,total}} \approx N P_e ]

[ F_{\mathrm{expert,active}} \approx k F_e ]

这就是博客所说的“参数 N 倍、计算 k 倍”。

但它只是一个受条件约束的对比式。真实 MoE 还可能包含:

  • 更窄的专家中间维度;
  • 共享专家;
  • Router 计算;
  • dispatch 与 combine;
  • padding 或容量浪费;
  • 通信;
  • 只有部分层使用 MoE;
  • 量化和低精度;
  • 不同专家形状。

更一般的说法是:

总专家参数约等于“专家数 × 单专家参数”;单 token 的专家算术约等于“激活专家数 × 单专家算术”。能否比 dense 基线便宜,取决于单专家宽度和额外系统成本。

例如,若每个专家只有 dense FFN 的四分之一宽,Top-2 的专家算术可能约为 dense 的一半,而不是两倍。

5.3 为什么 FLOPs 少,延迟仍可能高

术语卡|Latency / 延迟

延迟是从请求进入到结果返回所需的实际时间。它不仅取决于算术量,还取决于内存带宽、kernel 启动、并行度、通信、排队和负载长尾。

MoE 典型地需要:

本地 token
→ 按专家重新排列
→ 跨 GPU 发送
→ 专家计算
→ 跨 GPU 送回
→ 恢复 token 顺序

术语卡|All-to-All communication

All-to-All 是一种集体通信:每个设备都可能向其他所有设备发送不同数据。专家并行 MoE 中,token 按路由结果发往持有对应专家的 GPU,再把输出送回。
它可能受网络带宽、延迟、消息大小和负载不均衡限制。

因此实际速度由多个“木桶板”决定:

[ \text{time} \approx \max( \text{expert compute}, \text{communication}, \text{slowest expert}, \text{memory movement} ) ]

不是简单的 FLOPs 除以峰值算力。

5.4 推理显存按总参数还是激活参数

原博客说“所有专家必须常驻 GPU”,方向上提醒了一个重要陷阱,但“必须在同一张 GPU 上常驻”过于绝对。

第一性原理是:

所有可能被路由到的权重,必须在需要时可访问;它们不必全部位于同一张 GPU,也不必永远留在 GPU。

常见部署方式:

  1. 单设备常驻:所有专家都在同一设备,显存按总权重算。
  2. Expert Parallelism:不同 GPU 各持有一部分专家,单卡只存分片,但整个集群仍存总参数。
  3. CPU/NVMe offload:不常用权重放在较慢存储,按需搬运;节省显存但增加延迟。
  4. 专家复制:热门专家在多设备复制,减轻通信或负载长尾,但增加总内存。
  5. 量化:用更低位宽储存专家权重,减少字节数,但总参数数量不变。

术语卡|Expert Parallelism / 专家并行

专家并行把不同专家放到不同设备。它与数据并行不同:数据并行通常复制完整模型处理不同样本;专家并行则按路由把 token 发给持有目标专家的设备。

激活参数量不等于推理显存

推理显存还包括:

  • 非专家权重;
  • 当前激活;
  • KV cache;
  • 路由缓冲区;
  • 通信缓冲区;
  • 量化 scale;
  • 框架工作区。

术语卡|KV cache

自回归生成时,注意力层会缓存历史 token 的 Key 和 Value,避免每生成一个 token 都重算全部前文。KV cache 通常随上下文长度、层数、batch 和 KV 头数增长。它与 MoE 专家权重是不同的显存来源。

5.5 共享专家与细粒度专家

共享专家

术语卡|Shared Expert / 共享专家

共享专家对所有 token 都激活,用来承担普遍需要的变换;路由专家只处理被选中的 token。其设计动机是把“公共知识/公共变换”与“可特化容量”分开。

但它只是架构偏置,不保证共享专家一定学到“语法”,路由专家一定学到“领域知识”。

细粒度专家

术语卡|Fine-grained Experts / 细粒度专家

把一个大专家拆成多个较小专家,并激活更多小专家,可以增加组合数和路由灵活性。DeepSeekMoE 强调细粒度专家分割与共享专家隔离,以促进更专门的专家组合。

若把一个宽度为 (m) 的专家拆成若干宽度更小的专家,Top-k 的数字会变大,但总激活宽度未必同比增加。比较模型时不能只看“激活几个专家”,还要看每个专家多宽。

5.6 Kimi K3 的 Stable LatentMoE

Kimi K3 技术报告给出的关键规模是:

  • 总参数:2.8T;
  • 激活参数:104B;
  • 每层 896 个 routed experts;
  • 每个 token 激活 16 个 routed experts;
  • 每层 2 个 full-width shared experts;
  • routed experts 在宽度为 (\ell) 的潜在空间中工作。

术语卡|Latent space / 潜在空间

“Latent”意为潜在的、未直接观察的。潜在空间是模型内部的压缩表示空间。LatentMoE 先把 full hidden width (D) 投影到较小宽度 (\ell),在这个空间运行大量专家,再投影回 (D)。它用较小单专家成本换取更多专家数量。

简化流程:

输入 x ∈ R^D
│
├─ 共享路径:2 个 full-width shared experts
│
└─ 路由路径:
   W↓:D → ℓ
   → 896 中选 16 个 latent experts
   → 加权聚合 u ∈ R^ℓ
   → RMSNorm
   → W↑:ℓ → D

两条路径相加

数学形式:

[ u

\sum_{i\in\mathcal T_k(x)} p_i E_i^{\mathrm{routed}}(W^\downarrow x) ]

[ y

\sum_{j=1}^{N_s} E_j^{\mathrm{shared}}(x) + W^\uparrow\operatorname{RMSNorm}(u) ]

为什么会有激活尺度问题

原博客用“误差经过很多矩阵连乘被放大”建立直觉,但应避免理解成:

总参数 2.8T
→ 数值误差按 2.8T 倍直接相乘

总参数量本身不会直接作为一个乘数放大激活。

更精确的原因是:

  1. routed path 包含降维、门控专家、聚合、升维等连续变换;
  2. 选中专家与路由权重变化,会改变聚合向量 (u) 的尺度;
  3. SwiGLU 的两个乘法因子都无上界;
  4. 在低精度训练中,极端激活更容易溢出或造成量化误差;
  5. 极端稀疏和巨大模型规模使这些稳定性问题更难控制。

Kimi K3 报告本身把问题归因于近四次连续矩阵乘链、极端规模和无界门控共同造成的内部激活爆炸。

5.7 RMSNorm 为什么放在上投影之前

术语卡|RMSNorm

RMSNorm 是 Root Mean Square Layer Normalization。它用向量的均方根尺度做归一化,但不像 LayerNorm 那样减去均值: [ \operatorname{RMSNorm}(x)

g\odot \frac{x} {\sqrt{\frac1d\sum_i x_i^2+\epsilon}} ] (g) 是可学习的逐维增益。作用是稳定整体尺度,同时保留模型重新放大或缩小不同通道的能力。

如果 (u) 整体变成 (100u),忽略 (\epsilon):

[ \frac{100u}{\operatorname{RMS}(100u)}

\frac{100u}{100\operatorname{RMS}(u)}

\frac{u}{\operatorname{RMS}(u)} ]

K3 在 routed expert 聚合后、(W^\uparrow) 之前做 RMSNorm,直接降低上投影对聚合尺度波动的敏感性。

它不是“修复所有矩阵误差”,而是控制进入升维投影的整体幅度。

5.8 SiTU-GLU:给 SwiGLU 两个分支加软上限

SwiGLU:

[ \operatorname{SiLU}(W_gx)\odot W_ux ]

当正输入很大时:

[ \operatorname{SiLU}(z)=z\sigma(z)\approx z ]

门分支和内容分支都可能很大,乘积产生激活离群值。

Kimi K3 使用 SiTU-GLU:

[ \left[ \beta_1\tanh\left(\frac{W_gx}{\beta_1}\right) \odot \sigma(W_gx) \right] \odot \left[ \beta_2\tanh\left(\frac{W_ux}{\beta_2}\right) \right] ]

术语卡|Soft cap / 软截断

硬截断直接把超过阈值的数压到阈值,拐点不可平滑;软截断用平滑函数逐渐饱和。
[ \operatorname{softcap}(z,\beta)=\beta\tanh(z/\beta) ] 小值附近近似 (z),大值时趋近 (\pm\beta)。

K3 设置:

[ \beta_1=4,\qquad\beta_2=25 ]

由于 (|\tanh|<1) 且 (0<\sigma<1),单个坐标的乘积绝对值被控制在约:

[ \beta_1\beta_2=100 ]

以内。它保留小值附近类似 SwiGLU 的形状,同时抑制极端正激活。

5.9 Quantile Balancing:为什么固定步长 bias 不够

普通 loss-free bias 更新每步只加减固定 (\gamma):

  • (\gamma) 小:适应负载变化慢;
  • (\gamma) 大:容易在目标负载附近来回振荡。

当每层接近 1000 个 routed experts 时,这个权衡更难。

术语卡|Quantile / 分位数

分位数是把数据按大小排序后对应某个累计比例的位置。例如中位数是 50% 分位数。它不是平均值,而是“有多少数据位于这个阈值以下”。

K3 的 Quantile Balancing(QB)从 Router margin 的分位位置估计:每个专家的 bias 应该移动到哪里,才能让其进入大约目标数量 token 的 Top-k。

高层直觉:

固定步长方法:
“你太忙了,下次统一降 0.001”

Quantile Balancing:
“根据本批次所有竞争分数,估算需要降到哪个门槛,
才会大约留下目标数量的 token”

它还用 histogram 近似分位数,避免保存和排序全部 margin。

需要加两个限定:

  1. QB 根据当前批次估计下一步 bias,输入分布变化时仍可能有误差;
  2. “目标负载”是设计目标,不等于任何硬件、任何批次都获得数学上绝对完美的全局平衡。

5.10 Temperature=0 为什么仍可能输出不同

术语卡|Temperature / 温度

生成时常把 logits 除以温度 (\tau) 再 Softmax。温度高,分布更平;温度低,分布更尖。工程 API 中 temperature=0 通常表示贪婪解码,而不是实际执行除以零。

理论上,若:

  • 输入完全相同;
  • 权重完全相同;
  • 每一步 logits 完全相同;
  • argmax 实现确定;
  • 没有并列值的不稳定决胜;

则贪婪解码应得到同一序列。

现实差异通常来自数值与执行路径:

浮点运算不满足严格结合律

[ (a+b)+c \ne a+(b+c) ]

在有限精度下,不同归约顺序会有微小差异。

动态 batching 改变 kernel 选择和归约形状

同一请求与不同其他请求一起批处理,矩阵形状、切块和归约顺序可能变化。Thinking Machines Lab 的分析强调:生产 API 的重要非确定性来源是变化的 batch 形状与非 batch-invariant 数值 kernel 的组合

微小 logit 差异会被 argmax 放大

若两个候选 logit 极接近:

运行 A:token 甲高 1e-6
运行 B:token 乙高 1e-6
→ 选出不同 token
→ 后续上下文不同
→ 整段输出分叉

MoE 会不会放大差异

会,但不是必然随机源。

硬 Top-k Router 具有不连续边界:

专家 A 分数 0.500001
专家 B 分数 0.500000

微小数值变化可能交换排名,token 进入不同专家,随后隐藏状态差异增大。若系统还有容量竞争,batch 组成也可能影响哪些路由溢出。

但要明确:

  • 给定完全相同的精确 Router 分数,Top-k 本身是确定的;
  • dense 模型也会因为 batch-dependent kernels 出现差异;
  • 现代 dropless MoE 不一定存在容量竞争;
  • 所以 MoE 是可能的差异放大器,不是 Temperature=0 非确定性的唯一或普遍主要根因。

5.11 Soft MoE 到底“软”在哪里

原博客把 Soft MoE 理解为“每个 token 都进入所有专家”,这个说法容易误导。

术语卡|Soft MoE

Soft MoE 取消硬 Top-k token-to-expert 分配。它先用连续 dispatch 权重,把所有输入 token 的加权组合汇聚成固定数量的 expert slots;专家处理 slots;再用连续 combine 权重把 slot 输出分配回每个 token。

简化流程:

所有 token
  │  连续加权汇聚
  ▼
固定数量 slots
  │
各专家处理自己的 slots
  │  连续加权回写
  ▼
每个 token 的输出

不是:

每个原始 token 完整跑一遍所有专家

Soft MoE 的特点:

  • 不做离散 Top-k token dispatch;
  • 专家 slots 数固定,负载规则;
  • 路由对分数变化更平滑;
  • 所有专家 slots 通常都参与计算,因此不再具有同样的稀疏专家计算方式。

原始 Soft MoE 工作主要面向视觉识别。若把“全序列 token 混合成 slot”的朴素形式直接用于自回归语言模型,未来 token 可能影响过去位置,因此需要因果化设计。

它可以减弱硬 Top-k 边界导致的路径突变,但不能自动消除:

  • 矩阵乘法数值差异;
  • Attention kernel 非确定性;
  • 动态 batching;
  • 并行归约差异。

所以“Soft MoE 解决了 Temperature=0 不确定性”过于绝对。

5.12 费曼复述:参数仓库与实际工单

MoE 像一家集团有很多仓库。总参数量是集团拥有的全部库存,激活参数量是当前订单真正取出的货。订单只取少量货,并不代表其他仓库不存在,也不代表它们不占存储。
FLOPs 是搬了多少箱,延迟还取决于仓库之间运输、最慢仓库和排队。
Kimi K3 把大量小专家放到压缩空间中,再用 RMSNorm 控制聚合尺度、SiTU-GLU 限制乘法离群值、Quantile Balancing 调整近千专家的负载门槛。
Temperature=0 只去掉随机采样,不会让浮点数、批处理和 kernel 自动变成严格确定。

本节检查点

  1. 两矩阵 FFN 与 SwiGLU 的参数公式为什么不同?
  2. “参数 N 倍、计算 k 倍”依赖哪些条件?
  3. 为什么所有专家不必常驻同一张 GPU?
  4. K3 的 latent expert 与 shared expert 分别处理什么空间?
  5. RMSNorm 与 SiTU-GLU 各控制哪类尺度问题?
  6. Soft MoE 为什么不是“每个 token 完整跑全部专家”?

返回目录


6. RAG:如何在生成前把外部证据找回来

6.1 第一性原理:为什么模型需要外部检索

一个只依赖参数回答问题的模型有三类天然限制:

  1. 容量有限:参数不可能无损记住所有资料;
  2. 知识有时间边界:训练完成后,世界继续变化;
  3. 内部记忆不可直接审计:模型给出一句话时,很难从参数中指出它来自哪份证据。

于是产生一个简单想法:

不要要求模型把一切都背下来
而是在回答前,先找到当前问题需要的资料

术语卡|RAG

RAG 是 Retrieval-Augmented Generation,中文常译“检索增强生成”。Lewis 等人在 2020 年的原始 RAG 工作中,把可训练的检索器、外部非参数化知识索引与生成模型联合起来,用于知识密集型任务。
现代工程中,RAG 常被宽泛地用于“先获取外部信息,再把信息用于生成”的系统范式。

这里需要区分历史定义与宽泛用法:

  • 严格历史语境:RAG 指特定的 learned retriever + generator 架构及其后续研究谱系;
  • 宽泛工程语境:搜索引擎、数据库、工具调用、记忆库等,只要先检索再生成,也常被叫 retrieval augmentation。

因此原博客说 Agent Memory、skills 渐进披露都“可以算 RAG”,作为宽泛类比可以成立,但不是所有研究者都会采用这么宽的术语边界。

6.2 RAG 不是四步,而是一条证据供应链

一个成熟链路通常是:

数据源
→ 解析与清洗
→ 切块与元数据
→ 表示与建索引
→ 查询理解/改写
→ 候选召回
→ 多路融合
→ 重排
→ 上下文构建
→ 有依据生成
→ 引用、拒答与评估

可以把它分成三个目标:

Recall:别漏掉真正相关证据

主要由解析、切块、索引、查询改写和召回决定。

Precision:别把太多噪声送给模型

主要由过滤、融合、重排、去重和上下文预算决定。

Grounding:答案是否真的由证据支持

主要由提示设计、引用、矛盾处理、拒答与生成评估决定。

术语卡|Recall / 召回率

在一组真实相关文档中,系统找回了多少。Recall@k 表示前 k 个结果覆盖了多少真实相关项。高召回关心“别漏”。

术语卡|Precision / 精确率

返回结果中有多少是真相关的。高精确率关心“别塞噪声”。

RAG 的典型失败不是只有“没搜到”,还包括:

搜到了但没放进上下文
放进上下文但被截断
证据正确但排序靠后
证据互相冲突却未处理
模型看见证据仍自由发挥
答案正确但引用错了

6.3 文档解析:先把“页面”恢复成“内容”

术语卡|Parsing / 解析

解析是把原始文件转换成系统能理解的结构,例如标题、段落、表格、列表、页码和坐标。它解决的是“这个文件里有哪些逻辑单元,以及它们之间是什么关系”。

PDF 为什么麻烦

PDF 主要面向视觉呈现。它可能只记录:

  • 某个字符画在页面哪个坐标;
  • 字体、线条和图片如何绘制;
  • 多栏排版;
  • 表格线与文本块;
  • 扫描图片。

它不保证天然提供“这是标题”“这是第二列表格”“这是图注”的语义结构。

OCR 什么时候需要

术语卡|OCR

OCR 是 Optical Character Recognition,光学字符识别。它把图片中的文字像素转换成字符。扫描 PDF、照片或图表内文字需要 OCR;带可用文本层的 PDF 则不一定需要。

**修正原文表述:**处理 PDF 不应统一说“需要 OCR”。

  • 文本型 PDF:优先提取文本层并做版面分析;
  • 扫描 PDF:需要 OCR;
  • 混合 PDF:文字、表格、图片分区域处理;
  • 关键图表:还需保留图片、图注和页面位置,不能只抽纯文字。

LlamaParse 是可选产品之一,不是所有场景的通用最优答案。工具选择应根据:

  • 文档语言;
  • 表格复杂度;
  • 是否有公式;
  • 隐私与合规;
  • 成本和吞吐;
  • 是否需要本地部署;
  • 可否保留页码与坐标;
  • 实际评测结果。

6.4 Chunking:检索系统到底以什么为单位

术语卡|Chunking / 切块

Chunking 把长文档分成可索引、可召回的小单元。Chunk 是检索系统的基本候选单位。它既要足够小以便定位,又要足够大以保留回答问题所需的完整语境。

块太大

  • 多个主题混在一个向量中;
  • 真正相关句被无关内容稀释;
  • 占用更多上下文;
  • 重排与生成成本上升。

块太小

  • 条件、定义和结论被拆散;
  • 指代词失去对象;
  • 表格标题与单元格分离;
  • 一个答案需要拼接大量碎片。

因此不存在通用“最佳 chunk size”。合理粒度取决于:

  • 文档结构;
  • 用户问题粒度;
  • embedding 模型;
  • reranker;
  • 生成模型上下文;
  • 语言;
  • 评测数据。

结构化切块

原博客强调保留章节路径,这是非常值得保留的做法。

一个 chunk 不只存正文,还可存:

{
  "document_id": "handbook-2026",
  "title": "员工手册",
  "section_path": ["第三章 财务制度", "3.2 差旅报销"],
  "page": 37,
  "block_type": "paragraph",
  "text": "……",
  "effective_date": "2026-01-01",
  "access_scope": "finance-team"
}

术语卡|Metadata / 元数据

元数据是“描述数据的数据”,例如标题、作者、日期、页码、部门、权限、章节路径和版本。它的作用是过滤、追溯、排序和权限控制,不只是给 embedding 增加文本。

Parent–child retrieval

常见改进是:

  • 用小块做精确召回;
  • 命中后取回其较大的父章节作为上下文。

这把“用于匹配的粒度”和“用于阅读的粒度”分开。

Overlap 不是越多越好

块间重叠能减少边界切断,但重叠太大会:

  • 产生大量重复候选;
  • 让相同证据多次占据 Top-k;
  • 增加索引和上下文成本;
  • 使模型误以为重复信息更可信。

6.5 稀疏检索:关键词如何找到文档

原博客把 TF-IDF、BM25、倒排索引都归入“稀疏 embedding”,需要更精确地区分。

倒排索引是数据结构

术语卡|Inverted index / 倒排索引

普通目录从文档指向词;倒排索引反过来从词指向包含它的文档列表。它是搜索引擎高效关键词检索的核心数据结构。
它本身不是评分模型,也不是 embedding 模型。

例如:

"苹果" → 文档 1、文档 7、文档 20
"芯片" → 文档 7、文档 12

查询“苹果 芯片”时,只需访问对应 posting lists,再对候选打分。

TF-IDF 是词权重方法

术语卡|TF-IDF

TF 是 term frequency,词在当前文档出现多少;IDF 是 inverse document frequency,词在全库有多稀有。
高频于当前文档但全库罕见的词权重更高。它可以形成高维稀疏向量,也可以直接用于检索评分。

BM25 是排序函数

术语卡|BM25

BM25 通常指 Okapi BM25,是概率相关性框架发展出的经典词法排名函数。“25”来自一系列 Best Match 实验版本,不表示 25 个参数。
它通常运行在倒排索引之上,通过词频饱和、逆文档频率和文档长度归一化计算相关性。

一个常见形式:

[ \operatorname{BM25}(q,d)

\sum_{t\in q} \operatorname{IDF}(t) \cdot \frac{ f(t,d)(k_1+1) }{ f(t,d) + k_1 \left( 1-b+b\frac{|d|}{\operatorname{avgdl}} \right) } ]

其中:

  • (f(t,d)):词 (t) 在文档 (d) 中的频率;
  • (|d|):文档长度;
  • (\operatorname{avgdl}):平均文档长度;
  • (k_1):控制词频饱和;
  • (b):控制长度归一化。

为什么词频要饱和

同一词从 0 次变 1 次很重要,从 1000 次变 1001 次通常没那么重要。BM25 的分式让词频贡献逐渐接近上限,避免关键词堆砌无限提高得分。

原文中的代数修正

令:

[ a=\frac{|d|}{\operatorname{avgdl}} ]

则:

[ 1-b+ba

1+b(a-1) ]

不是 (1-b(a-1))。

Learned sparse retrieval

术语卡|SPLADE

SPLADE 是 learned sparse retrieval 模型。它用 Transformer 学习一个词表维度上的稀疏权重向量,还能进行词项扩展。
与 BM25 相比,它确实更接近“稀疏 embedding 模型”;但代价是训练和推理更复杂。

因此准确分类是:

名称 类型 主要作用
倒排索引 数据结构 快速找到包含词项的候选文档
TF-IDF 词权重/稀疏表示 衡量词对文档的重要性
BM25 词法排名函数 对关键词候选做相关性评分
SPLADE 学习型稀疏表示模型 学习词项权重与扩展

6.6 稠密检索:把语义映射到向量空间

术语卡|Dense retrieval / 稠密检索

稠密检索把查询和文档编码成大多数维度非零的低维向量,再用内积、余弦或距离检索相近向量。它擅长处理同义改写和语义相似,但可能弱于精确术语、编号和罕见实体。

Dual encoder / 双编码器

术语卡|Dual encoder

双编码器分别编码 query 和 document,使文档向量可以离线预计算。检索时只需计算 query 向量并搜索索引。
“双塔”不代表两个网络一定对称,也不代表一定共享权重;具体取决于模型设计。

原博客说“以前 BERT,现在 Transformer”不准确。BERT 本身就是 Transformer encoder。正确区分应是:

  • BERT 是一种具体预训练 Transformer 编码器;
  • 现代 embedding 模型可能基于 BERT、RoBERTa、T5、decoder-only Transformer 或其他架构;
  • 是否适合检索取决于对比学习、负样本和训练目标,不只取决于基础架构名称。

三种常见相似度

内积:

[ u^\top v ]

余弦相似度:

[ \cos(u,v)

\frac{u^\top v}{|u||v|} ]

欧氏距离:

[ |u-v|_2 ]

若向量都做了 L2 归一化:

[ |u-v|_2^2

2-2u^\top v ]

此时:

  • 最大化内积;
  • 最大化余弦;
  • 最小化欧氏距离;

三者排序等价。

若未归一化,向量模长会影响内积,三者不再等价。

6.7 向量索引:为什么不遍历全部向量

术语卡|ANN

ANN 是 Approximate Nearest Neighbor,近似最近邻。精确搜索要对所有向量计算距离,数据量大时太慢;ANN 牺牲少量召回率,换取显著速度和内存效率。

HNSW

术语卡|HNSW

HNSW 是 Hierarchical Navigable Small World graph,分层可导航小世界图。它把向量连接成多层邻居图:高层节点少,用于快速长距离跳转;底层节点全,用于局部精细搜索。

原博客“最终在局部范围内找到全局最近邻”应改成:

HNSW 在访问过的局部候选中返回最优结果,通常具有很高召回,但它是近似算法,不保证每次找到精确全局 Top-K。

底层包含所有点,不等于查询遍历所有点。搜索只探索图中的一部分候选。

术语卡|efSearch

efSearch 控制查询时保留和扩展多少候选。它越大,通常召回越高、延迟越大。HNSW 的速度—精度权衡不是固定的,要通过实际数据调参。

HNSW 常见代价:

  • 图边占额外内存;
  • 构建成本较高;
  • 大规模删除和更新较复杂;
  • 性能依赖构图参数和数据分布。

IVF

术语卡|IVF

IVF 是 Inverted File Index。它先把向量空间粗聚类,查询时只探测距离最近的若干簇,再在簇内找候选。这里的“倒排文件”按向量簇组织,不等于关键词倒排索引。

IVF 的关键参数是探测多少簇。探测越多,召回越高、计算越大。

HNSW 与 IVF 不是简单的“优缺点完全相反”,也不是互斥选择。工程系统可把它们与 Product Quantization 等压缩方法组合。

向量数据库是不是必须

不是。

小规模或低更新场景可以用:

  • 内存矩阵;
  • FAISS;
  • PostgreSQL 扩展;
  • 搜索引擎;
  • 本地文件索引。

向量数据库的价值更多在:

  • 大规模索引;
  • 在线更新;
  • metadata filter;
  • 多租户;
  • 复制与容错;
  • 权限;
  • 监控与运维。

“用了向量数据库”不等于“RAG 做好了”。

6.8 Hybrid retrieval:为什么关键词和语义常要合作

词法检索擅长:

  • 产品编号;
  • 人名和专有名词;
  • 精确错误码;
  • 法条编号;
  • 罕见缩写。

稠密检索擅长:

  • 同义表达;
  • 描述性问题;
  • 概念近似;
  • 用户用词与文档用词不一致。

因此混合检索常有价值,但“目前基本所有问答 RAG 都必须混合检索”过于绝对。是否使用应由语料和评测决定。

原始分数不能随便相加

BM25 得分与余弦相似度没有统一尺度。直接:

[ 0.5\times \text{BM25} + 0.5\times \text{cosine} ]

可能只是让数值范围较大的那一路支配结果。

可选方法:

  • 分数归一化;
  • 校准;
  • 学习融合权重;
  • 基于排名的 RRF。

术语卡|RRF

RRF 是 Reciprocal Rank Fusion。它不比较原始分数,只根据每个结果在各检索器中的名次累加: [ \operatorname{RRF}(d)

\sum_m\frac1{k+\operatorname{rank}_m(d)} ] 这样能避开不同检索器分数尺度不一致的问题。它简单稳健,但也忽略了同一路内部的分数间隔。

6.9 查询优化:把用户问题变成可检索问题

原始用户问题往往含有:

  • 代词;
  • 省略条件;
  • 多个子问题;
  • 错别字;
  • 口语表达;
  • 依赖上一轮对话的上下文。

查询优化是显式系统步骤,不应简单等同于“模型 Thinking”。

术语卡|Query rewriting / 查询改写

把原问题改成更明确、与文档用语更匹配的查询。作用是提高召回,但必须保留用户原意,不能偷偷补充未经确认的前提。

Multi-query

为同一问题生成多个表达,再合并结果。优点是覆盖不同措辞,缺点是:

  • 增加检索成本;
  • 产生离题变体;
  • 重复候选;
  • 错误改写扩大噪声。

Query decomposition

把复杂问题拆成依赖有序的子问题。

例如:

先找到获奖者
→ 再查获奖者国籍
→ 再查其代表作

不是简单把所有子查询并行发送。后续查询可能依赖前一步实体,系统应保留依赖关系和证据链。

HyDE

术语卡|HyDE

HyDE 是 Hypothetical Document Embeddings。它让模型先生成一段“假想的相关文档”,对这段文档做 embedding,再检索真实语料。
目的不是把假想文档当事实,而是让查询向量更接近目标文档的写作风格和语义区域。

最大风险是:

假想文档可以包含幻觉,它只能作为检索桥梁,不能作为最终证据。

6.10 Rerank:相似不等于能回答

第一阶段召回通常追求高 Recall,会带回较多候选。重排器再用更强但更贵的模型判断“这段文档是否真正回答问题”。

Bi-encoder 与 Cross-encoder

双编码器:

query → 向量
doc   → 向量
→ 快速比较

Cross-encoder:

[query; doc]
→ 同一个模型联合编码
→ 相关性分数

术语卡|Cross-encoder / 交叉编码器

Cross-encoder 允许 query token 与 document token 在模型内部直接交互,因此通常比独立向量相似度更精细;但每个 query–doc 对都要单独推理,成本高。

原博客称其“目前精度最高”过于绝对。更准确的说法是:

在许多文本相关性基准和候选规模下,训练良好的 Cross-encoder 是很强的重排基线;具体最优方法仍取决于领域、数据、模型规模、延迟预算和评价指标。

LLM rerank 还能做成:

  • pointwise:逐文档打分;
  • pairwise:比较两篇;
  • listwise:对候选列表整体排序。

但它更贵,也可能受位置偏见、提示敏感性和生成不稳定影响。

6.11 GraphRAG:什么时候图结构有价值

术语卡|Knowledge graph / 知识图谱

知识图谱把实体表示为节点,把关系表示为边,例如“公司—收购—公司”“人物—任职—机构”。它适合显式表达多跳关系、实体网络和结构化约束。

术语卡|GraphRAG

GraphRAG 泛指利用图结构增强检索生成。Microsoft GraphRAG 的代表性流程会从语料抽取实体与关系、建立社区、生成社区摘要,再回答跨文档的全局问题。

它特别适合:

  • “整个语料的主要主题是什么?”
  • “哪些实体形成了几个阵营?”
  • “A 通过哪些中间关系与 D 相连?”
  • 跨多文档的关系聚合。

但它不是普通向量 RAG 的无条件升级版。新增成本包括:

  • 实体抽取错误;
  • 同名实体消歧;
  • 关系幻觉;
  • 图更新;
  • ontology 设计;
  • 社区摘要的信息损失;
  • 更高构建与查询成本。

事实查找、精确条款、短文档问答,普通词法/稠密检索可能更直接。

6.12 原博客较少展开的关键阶段:上下文构建

检索结果不能原样全部塞进 prompt。上下文构建要做:

  1. 去重:删除相同或高度重叠块;
  2. 多样性控制:避免 Top-k 全来自同一段;
  3. 父块扩展:补足定义、条件和上下文;
  4. 证据排序:重要证据靠前,相关段落相邻;
  5. 预算分配:在 token 上限内分配不同来源;
  6. 来源标识:保留文档、页码、URL、版本;
  7. 权限检查:不能把用户无权访问的内容放进上下文;
  8. 冲突检测:标出不同版本或相互矛盾的证据。

术语卡|Context window / 上下文窗口

上下文窗口是模型一次前向计算可读取的 token 范围。窗口变长不等于可以无损塞入更多文档:成本上升,注意力可能被噪声稀释,重要证据还可能出现“中间遗忘”。

6.13 Grounded generation:有资料不等于会据实回答

术语卡|Grounding / 依据约束

Grounding 指答案应由提供的证据支持,并能追溯到来源。它不只是“把文档放进 prompt”,还包括让模型区分证据、推断与未知。

系统应明确要求:

  • 只根据证据回答;
  • 每个重要事实附 source id;
  • 证据不足时拒答或说明不确定;
  • 证据冲突时呈现冲突;
  • 不把 HyDE 文本或查询改写当证据;
  • 引用必须指向真正支持该句的片段。

还要防止检索文档中的 prompt injection:外部文档可能写着“忽略系统指令”。检索内容应被视为不可信数据,而不是更高优先级指令。

6.14 RAG 评估:不要只问“看起来好不好”

检索层

  • Recall@k:真实相关证据有多少进入前 k;
  • Precision@k:前 k 中有多少真相关;
  • MRR:第一个相关结果出现得有多靠前;
  • nDCG:考虑多级相关性与排名位置;
  • Hit Rate:前 k 是否至少命中一个关键证据。

术语卡|MRR

Mean Reciprocal Rank。若第一个相关结果在第 (r) 位,该查询得分为 (1/r),再对查询取平均。它特别关心“第一个有用结果是否靠前”。

术语卡|nDCG

Normalized Discounted Cumulative Gain。高相关文档排在前面贡献更大,并用理想排序归一化。适合一个查询有多个不同相关等级结果的场景。

生成层

  • 答案正确性;
  • 答案相关性;
  • 对证据的 faithful/faithfulness;
  • 引用准确率;
  • 引用覆盖率;
  • 无证据时是否正确拒答;
  • 冲突证据处理能力。

系统层

  • 端到端延迟;
  • 每次查询成本;
  • 索引构建时间;
  • 更新新鲜度;
  • 权限泄漏率;
  • 稳定性和可复现性。

Golden set

术语卡|Golden set / 黄金评测集

一组人工确认的问题、答案、关键证据和允许来源。它是调 chunk、embedding、Top-k、reranker 和 prompt 的共同基准。没有 golden set,只凭几个演示问题调参,很容易过拟合印象。

评估应分阶段诊断:

答案错
├─ 解析错?
├─ 没切到完整证据?
├─ 查询改写偏了?
├─ 召回没命中?
├─ 重排把证据压下去?
├─ 上下文截断?
└─ 模型看见证据仍生成错?

6.15 “RAG 已死”该怎么准确讨论

“RAG 已死”通常把两件事混在一起:

  1. 早期粗糙流程是否足够;
  2. 检索增强这个思想是否仍有价值。

更准确的结论是:

“固定长度切块 + 单一路向量 Top-k + 全部塞进 prompt”这一初级配方,在复杂任务上经常不够;但运行时获取外部信息并据此生成,仍是解决时效性、可追溯性、私有知识和工具信息的重要范式。

grep、SQL、Web Search、API、知识图谱和 Agent Memory 并不是 RAG 的敌人。它们是不同检索器或外部信息通道。是否都称作 RAG 是术语选择,真正重要的是:

  • 取回的信息是否正确;
  • 是否给了模型足够证据;
  • 是否能追溯与评估;
  • 是否满足权限和时效性。

6.16 费曼复述:把 RAG 讲成写开卷论文

RAG 像写一篇开卷论文。你先把资料整理成可搜索的章节和卡片;收到问题后,既按关键词查目录,也按语义找类似段落;先宽泛找候选,再用更细的标准重排;最后只把真正有用、带页码的证据放到桌面上。
查到相似资料不等于它能回答问题;把资料放桌上也不等于你一定按资料写。好的 RAG 还必须检查引用、冲突、权限和“资料不足时能否承认不知道”。

本节检查点

  1. 为什么倒排索引、BM25 和 SPLADE 不是同一种东西?
  2. HNSW 底层包含全部点,为什么仍是近似搜索?
  3. 为什么 BM25 分数与余弦分数不能直接随意相加?
  4. HyDE 生成的文本为什么不能作为证据?
  5. 为什么 Cross-encoder 通常只用于候选重排?
  6. RAG 的生成正确率低时,为什么要逐阶段诊断?

返回目录


7. 四篇文章的统一视角:三个“路由问题”

KL、MoE、RAG 看似分别属于数学、模型结构和应用工程,第一性原理上却非常相似。

7.1 都是在候选之间分配概率或资源

系统 候选 分数/概率 最终分配
语言模型 下一个 token logits / policy probability 生成哪个 token
MoE 专家 Router affinity token 进入哪些专家
RAG 文档或 chunk BM25、向量相似度、rerank score 哪些证据进入上下文
RLHF 行为轨迹 reward、advantage、KL penalty 哪些行为概率上升

共同模式:

候选很多
→ 资源有限
→ 用代理分数排序
→ 只保留一部分
→ 选择错误会被后续步骤放大

7.2 三种“崩塌”

策略分布崩塌

模型过度追逐奖励,输出变得单一、投机或偏离参考行为。KL 可以作为护栏,但权重太大又会阻碍学习。

专家路由崩塌

少数专家吸收大部分 token。负载损失、动态 bias、容量设计和系统冗余用于缓解。

检索结果崩塌

Top-k 全是同一来源、同一措辞或相互重复的 chunk。可用混合检索、RRF、多样性约束、去重和重排缓解。

它们共同说明:

只追求当前最高分,容易让系统失去覆盖、多样性和稳健性。

7.3 “最相关”不等于“最有用”

  • Router 分数高:表示当前训练下匹配度高,不保证该专家有空;
  • 向量相似度高:表示表示空间接近,不保证文档能回答问题;
  • 奖励高:表示奖励函数喜欢,不保证符合真实人类目标;
  • 概率高:表示模型更相信,不保证事实正确。

所以成熟系统会把多个目标分开:

能力匹配 + 负载调度
语义召回 + 事实重排
任务奖励 + KL 护栏
模型生成 + 证据校验

7.4 连续优化与离散选择的张力

神经网络喜欢连续、可微的量;工程系统经常必须做离散选择。

  • KL 是连续的分布差异;
  • Top-k Router 是离散选择;
  • HNSW 搜索是离散图遍历;
  • PPO 生成的 token 是离散动作。

常见解决策略:

  1. 用连续分数训练,部署时做离散选择;
  2. 用辅助损失给离散行为提供间接梯度;
  3. 用控制变量降低采样方差;
  4. 用外部反馈控制器调整不可微系统;
  5. 用 Soft MoE 等连续混合减少硬边界;
  6. 用离线评测而不是只相信训练 loss。

7.5 模型算法与系统工程不能分开

四篇文章都提示同一个现实:

数学目标正确,不代表系统实现就自动正确。

例子:

  • KL 数值估计无偏,不代表自动微分梯度无偏;
  • MoE FLOPs 合理,不代表 All-to-All 延迟合理;
  • HNSW 召回高,不代表每个查询都精确;
  • RAG 检索命中,不代表引用真正支持答案;
  • temperature=0 的算法确定,不代表浮点执行 batch-invariant。

真正的第一性原理分析应逐层问:

目标是什么?
公式优化的真是这个目标吗?
样本来自哪个分布?
选择在哪一步发生?
数据如何移动?
有限精度会发生什么?
失败时如何观察和定位?

返回目录


8. 原文关键表述校正速查表

下表不是否定原作者,而是把适合入门的类比改写成更准确、可迁移的技术结论。

8.1 KL 博客

原文或常见表述 校正后的说法
KL 是两个分布的距离 KL 衡量相对信息损失,但不是度量距离:不对称,也不满足三角不等式
KL 非对称是因为 log 不对称 非对称来自交换后求期望的分布和概率比都改变
Forward KL 一定覆盖所有模式,Reverse KL 一定只选一个峰 这是近似分布受限时的常见倾向,不是无条件定理
SFT、蒸馏就是 Forward KL MLE/SFT 可写成数据到模型的 KL 加常数;蒸馏有多种方向和目标
k1 总体一定非负 k1 的期望非负;有限样本均值仍可能为负
k3 永远是低方差估计器 它逐样本非负且数值无偏;近分布时常有较好方差,但不是所有重尾情形的保证
无偏 KL 数值估计器可以直接当 loss 求导 数值无偏不保证梯度无偏;采样分布依赖参数时要处理 score-function 项
KL 放进 reward 后梯度被抹消 detached reward 仍通过 advantage 与 policy gradient 影响策略,只是不通过 KL 表达式本身反传
PPO clipping 会直接裁掉 KL clipping 作用于 PPO surrogate 中的概率比;KL 如何受影响取决于它被放在 advantage 还是额外 loss
critic 学纯奖励、actor 加 KL 就必然不一致 这是不同算法设计;critic 应估计哪种 return 取决于 actor 的目标与方差设计
reference policy 就是 old policy (\pi_{\mathrm{ref}}) 是 KL 参考,(\pi_{\mathrm{old}}) 是 rollout 快照,角色不同

8.2 MoE(上)

原文或常见表述 校正后的说法
MoE 就是更高级的 FFN 更精确地说,是条件激活的专家 FFN 集合,通常替换部分 Transformer FFN
专家会自动成为数学、代码、语言专家 可能出现特化,但不保证具有清晰、稳定、可解释的人类语义
更多总参数等于储存更多知识 更多参数提供容量,不自动保证知识、能力或利用效率
经典 aux loss 是通用 Top-k 公式 文中 argmax 版本是 Switch 的 Top-1 形式;Top-k 需重新定义负载归一化
均衡时 aux loss 为 1 (N\sum f_iP_i=1),完整 loss 是 (\alpha);原例漏乘 (\alpha)
不均衡例子的 aux loss 是 2.91 若 (\alpha=0.01),完整值应为 0.0291
Capacity 例子中 CF=1 得到 160 CF=1 得 128;CF=1.25 才得 160
(\alpha) 同时表示 aux 权重和容量系数 建议分别用 (\alpha_{\mathrm{aux}}) 与 CF
Capacity 是所有 MoE 的必需机制 它是常见工程机制;存在 dropless 或动态形状实现
Token dropping 是删除 token 通常是跳过该 token 的某条专家分支,残差路径仍存在
Routing collapse 是 dropping 的唯一或必然主因 它是重要原因;小 batch、领域偏移、低 CF 等也可造成溢出
Expert Choice 一定破坏因果性 朴素全序列版本会破坏自回归因果性;双向、视觉、非自回归或因果化变体另论
Loss-free bias 按负载误差大小更新就是 DeepSeek-V3 实现 原始主方法和 DeepSeek-V3 使用固定步长 sign 更新
Loss-free 表示完全没有任何辅助损失 DeepSeek-V3 仍有很小的 sequence-wise 平衡损失,主要批级平衡不用辅助梯度

8.3 MoE(下)

原文或常见表述 校正后的说法
所有 FFN 都可按两矩阵公式计算 GLU/SwiGLU 通常有 gate、up、output 三个投影,宽度也常重新调整
MoE 一定是参数 N 倍、FLOPs k 倍 仅当单专家与 dense FFN 同宽且忽略共享专家、Router、通信等时成立
FLOPs 与专家数量无关 激活专家算术主要由 k 与单专家宽度决定,但路由、通信、存储和调度仍随架构变化
所有专家必须常驻同一张 GPU 所有权重要可访问,可分片到多 GPU、量化或 offload;代价不同
推理显存按 active 参数算 权重存储更接近总参数分片;激活参数只描述当前算术,KV cache 等另计
K3 激活爆炸是 2.8T 参数把误差逐级放大 更精确原因是连续变换、聚合尺度波动、无界 SwiGLU 乘积与低精度风险;总参数数不是直接乘数
RMSNorm 消除了误差 它主要控制聚合表示的 RMS 尺度,不能修复所有方向性或数值误差
SiTU-GLU 把两个分支硬裁剪到 4 和 25 它用平滑 (\tanh) soft cap;绝对值渐近受限
Quantile Balancing 每批绝对完美平衡 它用当前 margin 分位估计下一步 bias;近似、分布变化和系统约束仍存在
MoE Router 自己引入随机性 给定相同精确分数,Top-k 可确定;它更像对微小数值差异的路径放大器
Temperature=0 应绝对相同 理论贪婪解码确定;真实系统还受浮点、batch、kernel 和并发执行路径影响
Soft MoE 是每个 token 跑所有专家 它先把 token 连续汇聚成 expert slots,再处理并连续回写
Soft MoE 解决全部推理非确定性 它减弱硬路由不连续,但不能消除其他数值和 batching 来源

8.4 RAG 博客

原文或常见表述 校正后的说法
任何先取外部信息再生成都严格属于 RAG 这是宽泛工程用法;原始 RAG 有更具体的 learned retriever + generator 历史定义
PDF 都需要 OCR 扫描或图片文字需要 OCR;有文本层的 PDF 更应先做文本与版面解析
某一 PDF 解析产品是首选 工具效果依文档、语言、隐私、成本与评测而变
有一个通用最佳 chunk 大小 粒度要按任务、文档结构、模型和 golden set 调整
TF-IDF、BM25、倒排索引都是稀疏 embedding 模型 倒排索引是数据结构,TF-IDF 是权重/表示,BM25 是排序函数;SPLADE 才是典型 learned sparse model
BM25 长度项 (1-b+ba=1-b(a-1)) 正确是 (1-b+ba=1+b(a-1))
以前用 BERT,现在用 Transformer BERT 本身就是 Transformer encoder
双塔一定是两个对称网络 query/doc encoder 可共享或不共享,也可结构不对称
问答 RAG 基本都必须混合检索 混合检索常有价值,但应按语料与评测选择
BM25 与向量分数可直接加权相加 原始尺度不同,应归一化、校准、学习融合或使用 RRF
HNSW 底层有全部向量,所以能找到全局 Top-K HNSW 只探索部分图节点,是高召回 ANN,不保证精确全局 Top-K
IVF 与 HNSW 优缺点完全相反 二者是不同 ANN 思路,可组合,性能取决于参数和数据
向量数据库是 RAG 必需品 小规模可用本地索引或普通数据库;向量数据库主要解决规模化工程问题
模型 Thinking 时就在做查询优化 查询优化应是可观察、可评测的显式系统步骤;内部推理不自动等价
子查询都可以独立并行 很多复杂问题有依赖链,后续查询需要前一步实体
HyDE 的伪文档是答案 它是检索桥梁,不能作为事实证据
Cross-encoder 是任何场景下精度最高的方法 它通常很强,但效果受领域、训练数据、模型和预算影响
GraphRAG 是下一代通用替代方案 它适合关系与全局问题,但有抽取、消歧、维护和成本负担
RAG 成功只看是否检索到相关文本 还要评估上下文构建、事实依据、引用、拒答、延迟、成本和权限

返回目录


9. 费曼自测与实践练习

9.1 不看正文,用一句话回答

  1. KL 为什么不是普通距离?
  2. 为什么交换 (P) 与 (Q) 会改变 KL 的关注区域?
  3. 为什么 k3 的期望不变?
  4. 为什么“KL 数值无偏”不能推出“自动微分梯度无偏”?
  5. MoE 的总参数量与激活参数量有什么不同?
  6. 为什么 Top-k 会放大微小数值变化?
  7. 为什么 MoE FLOPs 低,不代表延迟一定低?
  8. Soft MoE 的 slot 是什么?
  9. BM25、倒排索引和 HNSW 分别属于哪一层?
  10. 为什么检索到语义相似文档仍可能回答不了问题?
  11. HyDE 的假想文档为什么不能作为引用来源?
  12. 为什么 RAG 必须分检索、上下文与生成三个层次评估?

9.2 参考答案

  1. KL 不对称,也不满足三角不等式,因此不是数学意义上的距离度量。
  2. 交换后,不仅概率比倒转,求期望的权重分布也改变;每个方向重点检查不同区域。
  3. (k_3=k_1+(r-1)),而在 (x\sim q,r=p/q) 时,(\mathbb E_q[r-1]=0)。
  4. 参数还影响采样分布;完整梯度包含 score-function 项,直接对固定样本表达式微分可能漏项。
  5. 总参数是系统储存的全部权重;激活参数是当前 token 真正运行的权重。
  6. Top-k 是离散排序边界,两个接近分数一旦交换,计算路径就发生跳变。
  7. 延迟还包括 All-to-All 通信、内存移动、kernel 效率、负载长尾和排队。
  8. slot 是多个输入 token 按连续权重汇聚得到的固定专家输入,不等于某个原始 token。
  9. BM25 是词法排名函数;倒排索引是数据结构;HNSW 是向量 ANN 索引算法。
  10. 相似可能只是主题接近,文档未必包含回答所需的条件、结论或证据。
  11. 它是模型为改善检索生成的假设文本,可能包含幻觉。
  12. 答案错误可能源于没召回、上下文组装失败,或模型未按证据生成;只看端到端结果无法定位。

9.3 三个最小实践

实践 A:手算 KL

选两个三分类分布:

[ P=(0.7,0.2,0.1),\qquad Q=(0.4,0.4,0.2) ]

完成:

  1. 计算 (D_{\mathrm{KL}}(P\parallel Q));
  2. 计算 (D_{\mathrm{KL}}(Q\parallel P));
  3. 解释哪个类别对两个方向贡献差异最大;
  4. 把 (Q) 的第三类改为 0,观察支持集问题。

学习目标:不要只得到一个总数,要看每项由“权重 × 对数比”如何组成。

实践 B:模拟 MoE 负载

设 8 个专家、1000 个 token、Top-2。

  1. 随机生成 Router 分数;
  2. 统计每个专家的负载;
  3. 计算理论平均负载 (1000\times2/8=250);
  4. 分别设置 CF=1、1.1、1.25,统计溢出;
  5. 加入固定步长 bias 更新,观察适应速度和振荡;
  6. 再人为制造一个专家偏置,观察 routing collapse。

学习目标:看到“路由质量、均衡与容量”是三个相关但不同的问题。

实践 C:搭建可诊断的微型 RAG

只用 20 篇短文档和 30 个问题。

至少保留以下日志:

原始 query
改写 query
BM25 Top-10
dense Top-10
融合结果
rerank 分数
最终上下文
最终答案
引用 source id

逐步测:

  1. 只用 BM25;
  2. 只用 dense;
  3. RRF 融合;
  4. 加 Cross-encoder;
  5. 改 chunk 粒度;
  6. 加 parent expansion;
  7. 比较 Recall@5、引用准确率、延迟和成本。

学习目标:不用“感觉更好”调系统,而是找出改动究竟改善了哪一层。

9.4 推荐阅读顺序

若数学基础较弱:

第 2 节基础
→ 第 4 节 MoE 直觉
→ 第 6 节 RAG
→ 第 3 节 KL
→ 第 5 节高级 MoE

若正在学习训练算法:

第 3 节 KL
→ PPO / policy gradient 原论文
→ 第 4 节 MoE 路由损失
→ 第 5 节负载与稳定性

若正在搭建知识库:

第 6.1~6.4 数据与切块
→ 6.5~6.10 检索与重排
→ 6.12~6.14 上下文、生成与评估
→ 第 7 节统一视角

返回目录


10. 术语速查表

术语 来源/字面含义 在本文中的作用
Actor 行动者 输出策略分布并选择动作/token
Advantage 优势 某动作相对基线好多少,驱动 policy gradient
ANN 近似最近邻 牺牲少量精确性换大规模向量搜索速度
Attention 注意/加权读取 让 token 从上下文其他位置汇总信息
Auxiliary loss 辅助损失 给负载均衡等内部目标提供梯度
Batch 一批样本 并行计算单位,也会影响数值 kernel 与负载统计
BM25 Best Match 系列第 25 版 经典词法相关性排名函数
Capacity 容量 专家一次最多处理的 token 分配数
Chunk 块/片段 RAG 的索引和召回基本单位
Critic 评判者 估计回报,帮助构造低方差 advantage
Cross-encoder 交叉编码器 联合读取 query 与 doc 做精细重排
Dense model 稠密模型 每个输入运行同一批主要参数
Dispatch 分发 把 token 或 slot 送给专家
Embedding 嵌入 把对象映射成可计算向量
Entropy 信息熵 分布自身的平均不确定性/编码成本
Expert 专家模块 MoE 中可被条件激活的 FFN
Expert parallelism 专家并行 把不同专家分布到不同设备
FFN 前馈网络 对每个 token 做非线性通道变换
FLOPs 浮点运算数 估计算术工作量,不等于实际延迟
GLU 门控线性单元 用门分支调制内容分支
Grounding 依据约束 要求答案受外部证据支持
HNSW 分层可导航小世界图 高召回的向量 ANN 索引
HyDE 假想文档嵌入 用生成的假想相关文档改善查询表示
Inverted index 倒排索引 从词项映射到包含它的文档列表
IVF 倒排文件向量索引 先找近簇,再在簇内搜索
KL divergence Kullback–Leibler 散度 衡量用一个分布近似另一个分布的相对信息损失
KV cache Key–Value 缓存 自回归生成中缓存历史注意力状态
Latent space 潜在空间 模型内部的压缩表示空间
Logit 未归一化分数 经 Softmax 后形成概率
Metadata 元数据 用于过滤、追踪、权限和结构恢复
MLE 最大似然估计 提高观测数据在模型下的概率
MoE 混合专家 用稀疏条件计算扩展总参数容量
OCR 光学字符识别 把图片中的文字转成字符
Policy 策略 给定状态时的动作概率分布
PPO 近端策略优化 通过受限策略更新提高 RL 稳定性
Quantile 分位数 用排序位置而非均值描述阈值
RAG 检索增强生成 先取外部信息,再用其增强生成
Recall 召回 真正相关项中被找回多少
Rerank 重排 对粗召回候选做更精细相关性排序
RRF 倒数排名融合 用名次而非原始分数融合多路检索
RMSNorm 均方根归一化 控制向量整体尺度
Router 路由器 给专家打分并选择 Top-k
SFT 监督微调 用标注输入输出继续训练模型
Softmax 指数归一化 把 logits 转成概率分布
Support 支持集 分布可能取到的区域
Temperature 温度 调整生成分布尖锐程度
TF-IDF 词频–逆文档频率 衡量词对文档的词法重要性
Token 符号单元 模型处理和生成的离散基本单位
Top-k 最高 k 个 在候选中做稀疏离散选择
Vector database 向量数据库 管理大规模向量索引、过滤与在线服务

返回目录


11. 参考资料

11.1 四篇原始博客

  1. olddove,《MoE 相关知识点汇总与讲解(上)》
    https://linux.do/t/topic/2684588

  2. olddove,《MoE 相关知识点汇总与讲解(下)》
    https://linux.do/t/topic/2687837

  3. olddove,《RAG,你真的了解 RAG 吗?RAG 全链路拆解》
    https://linux.do/t/topic/2720669

  4. olddove,《KL 散度概论的个人总结》
    https://linux.do/t/topic/2673517

11.2 KL、PPO 与 RLHF

  1. Kullback, S. & Leibler, R. A. (1951). On Information and Sufficiency.
    https://doi.org/10.1214/aoms/1177729694

  2. Shannon, C. E. (1948). A Mathematical Theory of Communication.
    https://doi.org/10.1002/j.1538-7305.1948.tb01338.x

  3. Schulman, J. Approximating KL Divergence.
    http://joschu.net/blog/kl-approx.html

  4. Tang, Y. & Munos, R. (2025). On a few pitfalls in KL divergence gradient estimation for RL.
    https://arxiv.org/abs/2506.09477

  5. Schulman, J. et al. (2017). Proximal Policy Optimization Algorithms.
    https://arxiv.org/abs/1707.06347

  6. Christiano, P. et al. (2017). Deep Reinforcement Learning from Human Preferences.
    https://arxiv.org/abs/1706.03741

  7. Ouyang, L. et al. (2022). Training language models to follow instructions with human feedback.
    https://arxiv.org/abs/2203.02155

11.3 MoE、路由与稳定性

  1. Jacobs, R. A., Jordan, M. I., Nowlan, S. J. & Hinton, G. E. (1991). Adaptive Mixtures of Local Experts.
    https://doi.org/10.1162/neco.1991.3.1.79

  2. Shazeer, N. et al. (2017). Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer.
    https://arxiv.org/abs/1701.06538

  3. Fedus, W., Zoph, B. & Shazeer, N. (2021). Switch Transformers.
    https://arxiv.org/abs/2101.03961

  4. Zhou, Y. et al. (2022). Mixture-of-Experts with Expert Choice Routing.
    https://arxiv.org/abs/2202.09368

  5. Dai, D. et al. (2024). DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models.
    https://arxiv.org/abs/2401.06066

  6. Wang, P. et al. (2024). Auxiliary-Loss-Free Load Balancing Strategy for Mixture-of-Experts.
    https://arxiv.org/abs/2408.15664

  7. DeepSeek-AI (2024/2025). DeepSeek-V3 Technical Report.
    https://arxiv.org/abs/2412.19437

  8. Puigcerver, J. et al. (2023). From Sparse to Soft Mixtures of Experts.
    https://arxiv.org/abs/2308.00951

  9. Kimi Team (2026). Kimi K3: Open Frontier Intelligence.
    https://arxiv.org/abs/2607.24653

  10. Shazeer, N. (2020). GLU Variants Improve Transformer.
    https://arxiv.org/abs/2002.05202

  11. Zhang, B. & Sennrich, R. (2019). Root Mean Square Layer Normalization.
    https://arxiv.org/abs/1910.07467

  12. Thinking Machines Lab. Defeating Nondeterminism in LLM Inference.
    https://thinkingmachines.ai/blog/defeating-nondeterminism-in-llm-inference/

11.4 RAG 与信息检索

  1. Lewis, P. et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks.
    https://arxiv.org/abs/2005.11401

  2. Karpukhin, V. et al. (2020). Dense Passage Retrieval for Open-Domain Question Answering.
    https://arxiv.org/abs/2004.04906

  3. Malkov, Y. A. & Yashunin, D. A. (2016/2020). Efficient and Robust Approximate Nearest Neighbor Search Using HNSW Graphs.
    https://arxiv.org/abs/1603.09320

  4. Gao, L. et al. (2022). Precise Zero-Shot Dense Retrieval without Relevance Labels (HyDE).
    https://arxiv.org/abs/2212.10496

  5. Formal, T. et al. (2021). SPLADE: Sparse Lexical and Expansion Model for First Stage Ranking.
    https://arxiv.org/abs/2107.05720

  6. Robertson, S. & Zaragoza, H. (2009). The Probabilistic Relevance Framework: BM25 and Beyond.
    https://doi.org/10.1561/1500000019

  7. Cormack, G. V., Clarke, C. L. A. & Buettcher, S. (2009). Reciprocal Rank Fusion Outperforms Condorcet and Individual Rank Learning Methods.
    https://doi.org/10.1145/1571941.1572114

  8. Edge, D. et al. (2024). From Local to Global: A Graph RAG Approach to Query-Focused Summarization.
    https://arxiv.org/abs/2404.16130


结语

把四篇文章真正学会,不是记住更多缩写,而是能反复问出下面五个问题:

  1. 被比较或被选择的对象是什么?
  2. 分数是在谁的分布下计算的?
  3. 这个分数能否求导,梯度是否对应真正目标?
  4. 离散选择会造成什么容量、负载或召回问题?
  5. 理论公式经过有限精度、批处理、索引和系统调度后,还剩下哪些保证?

能回答这五个问题,你就不再只是“知道 KL、MoE、RAG 的名词”,而是具备了分析新模型、新论文和新系统的通用框架。

返回目录

评论