学习大模型时,我一开始把两个概念混在了一起:
推理模型会多想几步,MoE 会找几个专家,是不是都在让多个模型讨论,然后选一个答案?
继续往模型内部看,才发现它们说的是不同的事情。
推理模型关注的是:怎样通过训练和回答时的计算,更好地解决需要推导的问题。MoE 关注的是:处理一个 token 时,模型内部哪些参数参与计算。
这篇文章用一道打折题和一个"4 选 2"的专家例子,把它们串起来。
阅读说明:本文讨论常见自回归 Transformer 模型及其稀疏 MoE 结构。题目答案、24 层、4 个专家、合并权重和小向量均为教学示例,不是某个模型的实测输出。真实模型示例会单独注明来源。
1. 先分清:"推理"这个词有两种意思
中文里经常都叫"推理",英文却是两个词。
| 名称 | 指的是什么 | 简单理解 |
|---|---|---|
| Inference,推理计算 | 用已经训练好的模型进行计算、生成结果 | 模型开始运行了 |
| Reasoning,推理能力 | 分步推导、处理条件、检查解法等能力 | 模型在解一道需要推导的题 |
| Reasoning Model,推理模型 | 训练和使用方式侧重于推理能力的模型 | 更擅长利用中间步骤解题 |
| MoE,混合专家 | 一种组织和选择模型内部计算模块的结构 | 当前 token 交给哪些专家计算 |
大型推理模型也常被称为 LRM,即 Large Reasoning Model。
普通聊天模型运行时也在做 Inference,也可能完成推理任务。"推理模型"这个名字并不意味着其他模型完全不会推理。
2. 用一道打折题,看"多想几步"是什么
假设题目是:
一件商品原价 80 元,先打八折,再减 10 元,最后多少钱?
一种回答方式是直接给出:
text
最后是 54 元。
另一种方式会先形成中间步骤:
text
八折后的价格:80 × 0.8 = 64 元。
再减 10 元:64 - 10 = 54 元。
最终价格:54 元。
这些是手写的教学答案,不是两类模型的实际对比测试。普通聊天模型同样可以写出第二种答案。
生成中间步骤的作用,是让后续计算能够利用前面的结果。例如,已经得到"64 元",下一步就可以围绕"64 减 10"继续。
这种生成中间推导的方式,通常称为思维链,也就是 Chain of Thought。相关研究表明,它能改善一些多步推理任务的表现,但不保证每道题都有效。思维链论文
推理型模型的区别,还在于它通常经过针对性的训练,更擅长生成有用的中间步骤,并在需要时检查、修正解法。
这里的"中间步骤"是在解释一类常见实现。模型还会计算每层的隐藏向量等内部状态,产品展示的思考文字也可能经过隐藏或摘要处理,因此可见文字不是全部内部活动的完整记录。
3. 多想几步,会多经过几层吗?
先记住:层数和生成轮数是两个量。
假设一个模型有 24 层,采用最基本的逐 token 生成方式:
text
输入问题先经过预填充,建立各层 KV 缓存;
再由输出层打分并选择第一个新 token。
之后每一步:
输入上一步的新 token → 第 1 层 → ... → 第 24 层 → 输出打分 → 下一个 token
每一层接收的是数字向量,完成注意力、FFN 等规定的计算后,把结果交给下一层。各层结构通常相似,但使用各自的参数;它们不是分别负责"读题""算折扣""检查答案"的三个固定步骤。
层内规定的运算做完就返回结果,类似一个函数执行完毕,不需要靠结束标记退出。Transformer 原始论文
下面是基础生成循环的简化图,省略了层内结构、采样细节和服务端调度:

KV Cache 保存先前计算得到的键和值。后续步骤可以复用这些信息,不必每次重新计算全部历史 token 的 K/V;新输入的 token 仍然要经过模型各层。KV Cache 官方说明
一段中间推导通常包含多个 token,因此需要多次生成。模型仍然是原来的 24 层,只是这套计算被使用了更多次。每个 token 也不等于一个汉字,更不等于一句完整的推导。
这里讲的是基础生成方式。实际推理引擎可能用推测解码等优化,一次验证多个候选 token,所以不要把"一轮程序调用"严格等同于"一个 token"。
什么时候停止?
可以把停止分成两个层次:
- 结束中间推导:转入最终答案,整个回答还没有结束。
- 结束整段生成:遇到配置的结束标记,或达到 token 上限、停止字符串等条件,运行程序结束循环。
结束中间推导可能只是模型开始输出最终答案,也可能由特定格式标记表示,不一定退出生成循环。不存在所有推理模型通用的"确认想对了就跳出"的机制。
结束标记通常由模型预测出来,再由运行程序识别。思考预算也可能由产品设置约束,具体机制取决于模型和服务实现。达到硬上限时,回答还可能被截断,并不保证已经形成完整答案。生成参数官方说明
因此,"停止了"只说明满足停止条件,不等于系统已经证明答案正确。
4. 模型怎么学会有效地推理?
通常先有一个经过预训练的基座模型,它从大量资料中学到了语言规律和知识。基础的下一 token 训练会提高训练文本中目标 token 的预测概率,并通过 Loss、反向传播和优化器更新权重,不需要人工逐句评分。
在此基础上,常见的后续训练包括学习解题示例、根据任务结果进行强化学习,以及利用强模型生成的数据进行蒸馏。具体模型可以采用不同组合,并非每个推理模型都必须走完全相同的流程。
仍然用打折题举例。先让模型尝试不同回答,再用规则核对最终结果:
| 教学候选 | 最终结果 | 简化的结果奖励 |
|---|---|---|
先算 80 × 0.8,再减 10 |
54 元 | 1 |
先算 80 - 10,再乘 0.8 |
56 元 | 0 |
奖励 1 和 0 只是示意。真实训练可能结合多种奖励、约束和归一化方法。

这张图省略了采样批次和具体强化学习算法。奖励是训练信号,仍需转换成可优化的目标,才能计算梯度、调整参数。
反复练习后,训练希望提高模型生成成功解法的概率。这属于训练阶段的权重更新,日常调用模型回答问题时,通常不会继续更新权重。
每道题都需要另一个模型评分吗?
不需要。数学题可以按规则核对结果,代码题可以运行测试;对表达是否清楚、回答是否有帮助等开放问题,则可以使用人工评价或训练出的奖励模型。
例如,DeepSeek-R1-Zero 的研究使用了规则式奖励来验证数学结果、代码测试等;R1 完整版又采用了多阶段训练。这不能简化成"所有模型都由人工评分"或"所有推理训练都依赖一个小评分模型"。DeepSeek-R1 论文
还要区分验证的力度:只检查最终数字为 54,并不能证明中间每一步都正确;通过几个代码测试,也不保证程序不存在其他错误。
5. 更多计算,也可以用来尝试多个解法
回答时增加计算量,不只有延长一段推导这一条路。
还是那道题,可以让模型分别尝试几个解法,再核对计算顺序和结果,挑出通过验证的答案。对于更复杂的题目,也可以尝试修正已有解法,或者搜索不同的解题路径。
这里可能涉及模型之外的运行程序和验证器,并不是所有推理模型都自带整套流程。已有研究会根据问题难度分配计算,比较长推导、搜索、验证和筛选等方式的效果。测试时计算研究
对简单的折扣计算,额外尝试很多次可能只会增加等待时间。对困难问题,额外计算可能有帮助,但"想得更久"始终不是正确性的保证。
6. MoE 放在模型的哪里?
现在换一个角度:前面讨论的是怎样解题,这里看处理一个 token 时,模型内部怎样分配计算。
常见 Transformer 层里有注意力模块和 FFN。FFN 可以先理解成一个接收向量、经过多步矩阵运算、输出新向量的计算模块。
在常见的稀疏 MoE 设计中,某些层原本的一个 FFN,被替换为多个专家 FFN,并增加一个负责选择的路由器。不是所有 MoE 模型的每一层都必须这样替换。Mixtral 架构说明
下图只比较注意力之后的 FFN 部分,省略归一化和残差连接:

"专家"在这里通常是一组 FFN 参数。它接收和输出数字向量,并不是一个独立聊天机器人,不会在这一层单独写一份答案。
7. 一个 token 怎么分给专家?
假设某个 MoE 层有 4 个可选专家,每次只选 2 个,也就是 Top-2。
进入这个模块的是当前 token 的向量 x,其中已经包含上游层和注意力带来的上下文信息。路由器根据 x 计算专家分数,挑选其中两个,并得到用于合并的权重。
下面假设选中专家 1、专家 3,合并权重为 0.7 和 0.3。这些都是教学数字,不代表某个真实模型的路由记录。

这是数据分发和合并的简化图,省略路由分数的具体归一化方式,以及设备之间的数据传输;虚线只表示未选中,不代表执行该专家。
路由器先用自己的参数打分,不需要先运行所有专家,再比较谁算得好。
为了看清"合并",再假设两个专家输出的是以下二维向量:
text
专家 1 的输出:[2, 4]
专家 3 的输出:[6, 8]
合并结果:
0.7 × [2, 4] + 0.3 × [6, 8]
= [3.2, 5.2]
真实模型使用的向量通常远不止两个数字,但这里的加权相加是逐维进行的。
同一个 token 到下一个 MoE 层时,面对的是那个层自己的路由器和专家,选择可以改变。换一个 token,或者换一段上下文,选择也可能改变。推理时,路由器和专家的已训练参数通常不变,动态变化的是路由结果和本次计算出的合并权重。Mixtral 架构说明
8. 路由器和专家怎么学?会不会只用几个专家?
专家数量、每次选择几个专家等结构配置,通常由设计者事先确定;具体的路由和专家参数,通过训练学习。
可以把训练想象成不断分配练习:路由器把不同的 token 分给不同专家,专家主要从分配给自己的 token 获得训练信号,训练算法也调整路由器的可训练参数。
这里省略了一个实现细节:Top-K 的"选谁"是离散操作,不能把整个选择过程都当成普通连续函数直接求导。具体训练会通过可训练的打分、合并权重及其他机制获得学习信号。稀疏门控 MoE 论文
专家会自动变成"数学老师"和"历史老师"吗?
不能这样直接对应。专家可能形成某些处理倾向,但职责可以重叠,路由也可能受词法、句式和上下文影响。Mixtral 的路由分析就没有发现与学科名称简单一一对应的专家分工。Mixtral 路由分析
如果路由器总选专家 1 呢?
那会出现有的专家很忙、有的专家很闲的问题,也可能浪费计算和学习机会。
常见方法会鼓励负载均衡,例如增加均衡目标,或根据忙闲调整路由倾向。目标是避免长期过度集中,而不是要求每一句话都平均分给所有专家。
有些模型还区分两种专家:
| 类型 | 参与方式 |
|---|---|
| 共享专家 | 该 MoE 层中的每个 token 都会经过它 |
| 路由专家 | 由路由器为每个 token 挑选其中一部分 |
共享专家不是所有 MoE 模型必有的设计。DeepSeek-V3 的技术报告介绍了共享专家、路由专家及负载均衡机制。DeepSeek-V3 技术报告
9. MoE 少的是参数参与量,还是"内部 token"?
这里最容易把不同的数量混为一谈。
| 数量 | 表示什么 | MoE 的关系 |
|---|---|---|
| 输入、输出 token 数 | 输入内容和生成内容有多长 | 不会因分配给多个专家就增加或减少 |
| 中间推导 token 数 | 一类推理实现中,生成的中间推导有多长 | 不由是否采用 MoE 直接决定 |
| 总参数量 | 模型一共保存多少可训练数字 | 包括全部专家及其他模块 |
| 每 token 激活参数量 | 处理某个 token 时参与计算的参数规模 | 只涉及选中专家及其他参与模块 |
同一个 token 分给两个专家,是同一个向量进入两路计算,不会因此产生两个新的文字 token。
MoE 允许模型保存很多参数,同时让每个 token 只使用其中一部分。这个优势比较的是总容量与每 token 的计算需求,并不意味着任意 MoE 都比任意稠密模型更快。Mixtral 官方说明
那为什么大 MoE 还是很难放进一张显卡?
因为没被当前 token 选中的专家,以后仍可能被用到,它们的权重需要保存在显存、内存或其他存储中。
实际运行还要考虑:
- KV Cache:保存已有上下文的注意力信息。
- 临时张量和工作区:支撑当前这批计算。
- 跨设备通信:专家分布在不同显卡时,需要发送输入向量、收回结果。
因此,显存需求不能只拿"激活参数量"乘以每个参数的存储字节数来估算。卸载到内存、量化或多卡部署可以改变存储安排,但也各有代价。DeepSeek-V3 的部署设计专门处理了专家分布、负载和通信问题。部署章节
10. 把推理模型和 MoE 放到一起
回到开头的问题:同一个模型,完全可以既是推理模型,又采用 MoE 架构。
以本文的教学模型为例:
text
为了算出价格,模型生成一段中间推导。
↓
生成过程中,输入 token 的向量依次经过各层。
↓
到达 MoE 层时,路由器选出本层参与计算的专家 FFN。
↓
合并结果,继续后面的层,最后输出下一个 token。
↓
反复生成,直到给出答案并满足停止条件。
推理模型可以利用更多有用的中间步骤,MoE 可以控制每个 token 调用的专家计算量。两者作用在不同地方,能够同时存在。
真实例子是 DeepSeek-R1 完整版:它基于 DeepSeek-V3-Base 训练,使用 MoE 架构;官方同时发布的那批基于 Qwen、Llama 的 R1 蒸馏模型,则是稠密模型。由此也能看出,推理能力并不只属于 MoE。R1 官方模型说明
以后再看到一款新模型,可以分别追问三个问题:它怎样训练推理能力,回答时怎样使用计算预算,以及内部采用什么计算结构。这三个问题,比只看"会思考"或"有很多专家"更能帮助我们理解它。