🥰 Thanks you,李宏毅老师!🥰
本文最后更新于 2026年7月24日 晚上
以下内容来自于 NTU 李宏毅 2025 Fall 的课程 [传送门]
背景来自 XHS 小满 Summer
引入
使用了深度思考的模型:ChatGPT o1/o3/o4、DeepSeek r1、Gemini 2 Flash Thinking、Claude 3.7 Sonnet (Extended Thinking) ……
以 DeepSeek r1 为例,蓝色鲸鱼的内心小剧场。
上述思考过程通通会打包在 <think> ... </think> 中,方便界面显示。
“深度思考”语言模型的特色:推理(Reasoning)
在思考过程中,模型通常会有以下行为:
- 验证:验证自己的答案是否正确?
- 探索:尝试思考是否有其他的可能性?思考是否有其他的方法?
- 规划:完成这个任务需要哪些步骤?
注:此处 Reasoning 意为 “推理”,但模型推理的 Inference 意思完全不同!
Reasoning 是指:模型在 inference 的过程中,会产生特别长的思考过程!
Test-time Compute: 如果在测试阶段投入了大量的计算资源,则可能会得到更好的结果。
也即:深度不够,长度来凑!
在 AlphaGo 时代,实际已经在使用 Test-Time Compute 了
AlphaGo 在训练阶段会同时训练两个网络:
- Policy Network:负责决定下一步下在哪儿
- Value Network:决定当前局势赢面有多大
在测试阶段
- AlphaGo 并不是直接使用 Policy Network 的输出进行落子的!
- 它会将 Policy Network 的输出作为参考,提供几个备选项,再使用 Monte Carlo Tree Search(MCTS)选出最优下法。
这里用到的 MCTS 是一种非常消耗算力的方法:AlphaGo 会先脑内小剧场,思考后面几步的下法,再选择赢面最大的。
思考越多,往往结果越好:思考领域的 Scaling Laws。
章北海,要多想。🤣
如上图上的表格:如果我们在测试阶段消耗更多算力,则结果往往越好。
两种方法最后可以得到差不多的效果:
- 如果在训练的时候投注较多算力,则在测试阶段就可以投注较少算力
- 如果在训练的时候投注较少算力,则在测试阶段就可以投注较多算力
但是横轴(训练)所耗算力资源(1e13-1e16)比纵轴(测试)所耗算力资源(1e6-1e9)要多的多,所以把算力资源投注到测试阶段是更经济的方法!
打造「推理」语言模型的方法(四种):
- 不用微调参数
- 更强的思维链 (Chain-of-Thought, CoT):这要求模型性能得比较强
- 给模型推理工作流程:就算模型比较弱,也可以大幅提高输出质量
- 需要微调参数
- 教模型推理过程 (Imitation Learning)
- 以结果为导向学习推理 (Reinforcement Learning, RL)
如何打造推理语言模型?
更强的思维链
因为现在推理模型的过程往往会很长,因此叫 Long CoT
CoT:让模型先列出解题过程,再给出答案。
有两种实现方法:
- Few-shot CoT:先给出一些范例(问题-解法-答案 pairs),然后再问模型问题。这样模型会根据范例,知道要先写过程再写答案。
- Zero-shot CoT:根本不需要给范例!🤣 告诉模型“Let’s think step by step!”,模型自会列出解题过程。
Surervised CoT:在 prompt 里面明确告诉模型要如何 think step by step
其实只要把 prompt 写的长一些,给模型更多更精确的指示,模型自会进行 CoT!
但这也与模型能力有关,不是所有的模型都有能力根据复杂指令做 Long CoT!李宏毅老师亲测 Llama 3 不行 😂
给模型推理工作流程
力大砖飞疯狂抽卡
想法来源:无限猴子定理——无限个猴子用无穷长的时间打字,总能枚举出莎士比亚全集
- 如何让模型输出正确答案?
- 让他尝试几千几万个方法就可以了!
- 如何让大模型每次用不同的方法尝试?
- 最简单的方法就是让他多次回答同一个问题,LLM 每次的方法都会不太一样。
让语言模型不断去解同一个问题,不断产生不同的答案,他迟早会做对!
横轴是模型解题次数(1-1e4),纵轴是对正确答案覆盖率,每条线代表不同模型。
- 模型越大,"猴子打字"效率越高:大模型用更少的样本就能覆盖正确答案
- 愚者千虑,必有一得。小模型也能通过"堆样本"弥补:Pythia-1B(粉色)虽然弱,但样本足够多时也能有一定覆盖率
- 存在明显的"规模效应":70B 模型与 70M 模型之间的差距巨大,说明模型能力本身仍是基础
但是进行了多次生成,如何得知模型哪一次会得到正确答案?
使用 Majority Vote(多数投票)或者 Confidence(置信度)来选出答案。
把答案放到 <answer>...</answer> 标签中
- Majority Vote(多数投票)
- 原理:
- 让模型对同一个问题生成多条推理链(Chain-of-Thought)
- 提取每条推理链的最终答案
- 选择出现次数最多的答案作为最终结果
- 为什么有效:
- 语言模型的推理过程存在随机性,不同采样路径可能得到不同答案
- 正确的推理路径往会收敛到 相同答案
- 错误的推理路径则 分散在各种错误答案上
- 关键洞察:Self-Consistency 本质上是用统计一致性来替代完美的验证器——不需要知道正确答案是什么,只需要看哪个答案"最一致"。
- 原理:
- Confidence(置信度)
- 原理:
- 不依赖外部提示,而是通过分析模型解码过程中的置信度来选择答案
- 选择 模型最"自信"的答案
- 为什么有效:
- 模型在生成正确答案时,往往表现出更高的 token概率(更"确定")
- 通过比较不同输出路径中答案部分的置信度,可以筛选出更可靠的答案
- 原理:
在 Llama 3.2 1B 使用 Majority Vote 的方法,虽然还是没有赶上 8B 模型,但已经远超 1B 的自己。
加入验证机制
Best of N:训练一个 Verifier 模型,用于验证模型输出的答案(打分),哪个最大就选哪个当作正确答案。
- 如何训练验证器模型?(上面右图)
- 利用 Q-A pairs,用 LLM 产生多个 outputs,再凭借 ground-truth 给输出打标签,用以训练验证器。
除了并行采样,也可以串行采样,甚至还可以二者结合使用。
串行和并行采样如何结合最有效率,见图中论文。
但是现在的深度思考模型往往在中间输出过程就会进行验证!(如果等全部过程与结果输出之后再验证,会很浪费资源与时间)
左图:DeepSeek 会在解题途中进行验证!
右图:可以添加一个过程验证器(Process Verifier)进行打分
让 LLM 并行生成多个 outputs,而且只生成第一步,立刻使用 process verifier 进行打分,抛弃错误过程。
如何训练验证器?
上图:通过 prompt 的方式,让模型把解题过程分为多个步骤。一旦看到 < /step> 就停止生成,然后 process verifier 进行打分……
下图(左):生成 process verifier 的训练数据。上方过程从 step 1 出发的正确率是 2/3;下方过程从 step 2 出发的正确率是 1/3。
- 如何训练 process verifier 模型?(上面右图)
- 利用 Q-A pairs,用 LLM 并行产生多个 outputs(step 数可以不同),再凭借 ground-truth 给 ans 打标签,得到每个 step 下的 得到正确答案的概率,用以这个正确率训练 process verifier。
Beam Search:每次保留最好的 N 条路径(也有变形:比如,保留最好的前 25% 路径)示例中是 N=2。
实验证明:Beam Search > Best-of-N > Majority Vote。搭配上 Beam Search,1B 的模型甚至可以超越 8B 模型的效果!
Beam Search 的过程:
- 首先,对 step1 处输入 process verifier,保留 2 条最好路径
- 然后,让留下的每个 step1 都产生若干个 step2,这样就得到了许多条 step1-step2 路径
- 将 step1-step2 输入到 process verifier 中,再次保留 2 条最好路径!(也即,每个 step 永远只能留 2条)
- ……
上图的 DVTS 是 Beam Search 的一种变形。
其主要想法:在保留路径的时候,我们尽量保留两条不那么像的路径!
各类搜索算法,这些方法全部可以套用到刚刚的 Beam Search 框架下。
教模型推理过程
模仿学习,Imitation Learning
这一方法可以是监督学习(Supervised Learning),也可以是强化学习(Reinforcement learning)
生成训练数据:问题-推理过程-答案 pairs
合成训练数据:
- 通过 Prompt 让 LLM 进行 CoT,生成一系列 reasoning process 与 answer
- 用 ground-truth 对 answer 进行检查,选取正确答案对应的 reasoning procee 作为训练数据。
- 如果问题没有标准答案,则可以引入另一个 LLM/人 作为 Verifier 对答案进行评估!
利用 process verifier 来合成高质量数据
但是最终答案正确,并不意味着推理过程也正确!
我们的做法:
- 在 LLM 生成答案的每一步,都使用先前的 process verifier 方法进行检查,这样可以确保过程是相对正确的。
- 然后利用这些数据进行微调,这种情况类似监督学习。
- 但也可以对绿色 step 施加 reward,对蓝色 step 施加 punish,这种情况类似强化学习。
注:这里是在意 reasoning process 的,因此与后面的 DeepSeek-R1 采用的方法不同!
GPT4-o3 示例:推理过程不正确也无妨,只要能找到自己的问题就能正确!
因此,我们甚至不需要训练数据全部是正确的推理过程。
如果训练数据中的推理过程全部正确,模型也会认为自己的推理过程一定不会出错,进而无法获得 知错能改 的能力。
左图:要教会模型犯错之后如何改正,否则只会错上加错。
Stream of Search:使用 DFS 的想法,故意走一些错误的路。
- 主要想法:从树状结构中得到一些包含错误答案的 reasoning process
- 流程:
- 先深度优先搜索,把错误的 process 也放入训练数据中
- 为了防止模型输出前言不搭后语,在回溯时(上图右),加入一些 verifier 的反馈
另一篇文章也发现了这个问题:Shortcut Learning 只会顺风局,而 Journey Learning 才可以纠正自身
知识蒸馏:学习教师 Reasoning 模型的 reasoning process
以 DeepSeek-R1 作为老师,来教不同的 foundation model 学习 reasoning process,在数学和代码 benchmark(和推理有关)上的指标得到大幅提高!
以结果为导向学习推理
DeepSeek-R1 系列的做法
DeepSeek-R1 的训练过程
左图:不关注推理过程,只关注最后答案——答案对了给奖励,答案错了给惩罚!
右图:蓝色/绿色分别表示 DeepSeek-R1 和 GPT4-o1 回答 1 次问题的正确率;
右图:红色/梅红色分别表示 DeepSeek-R1 和 GPT4-o1 在使用 Majority Vote 下的正确率。
以 DeepSeek-v3-base 作为基座模型,以模型回答问题的正确率作为 reward 进行后训练(纯粹使用 RL),得到 DeepSeek-R1-Zero。它使用的是 基于规则的奖励系统(rule-based reward system),而非神经网络奖励模型,该系统主要由以下两部分组成,
- 准确性奖励(Accuracy Reward)
- 格式奖励(Format Reward)
强制模型将推理过程(Chain-of-Thought)包裹在<think>...</think>标签内,最终答案放在<answer>...</answer>标签中。这种显式结构化输出既增强了可读性,也便于后续解析与分析。
在训练 DeekSeek-R1-Zero 时,并没有专门训练其纠错能力,但 RL 带来了涌现现象:模型自发出现自我反思、多路径探索、"Wait"顿悟等高级推理行为(Aha moment)
但 DeepSeek-R1-Zero 并不好用,因为其推理过程可读性极差且多语言混杂——因为在训练的时候我们根本就没有关注其推理过程
成也 RL,败也 RL,DeepSeek-R1-Zero 的推理过程不是人读的
如何从 DeepSeek-R1-Zero 得到最终的 DeepSeek-R1
训练 DeepSeek-R1 的流程:
-
训练 DeepSeek-R1-Zero
-
造数据
- 使用 DeepSeek-R1-Zero 对 问题(主要是数学和代码问题)产生 Reasoning 过程,然后使用大量人力去修正 Zero 的 Reasoning 过程(人工标注)
- 另外,他们还从其他模型处得到数据
- 用其他模型以 Few-shot CoT 的方法,产生一些带有 reasoning 的数据
- 用 Prompting 的方法,让模型产生带有详细的、带有反思和验证的 answer
- 这一步造出的数据量较少,原文上是 “thousands of”。也确实,这是人工标注的,不会太多。
-
将上述两类数据作为训练数据,使用 Imitation Learning 从 DeepSeek-v3-base 中训练出 Model A
- 性能:Model A > DeepSeek-R1-Zero
-
Model A 进一步做 RL(以正确率和语言一致性作为 reward)训练出 Model B
- 性能:Model B < Model A(略微下降,毕竟是做了约束)
-
造数据
- 在问题中加入 各式各样的任务(包括一些没有标准答案的问题),然后使用 DeekSeek-v3 作为 verifier 来判断 Model B 得到 answer 的好坏。
- 以规则的方式,去掉 Model B 生成的一些糟糕的 reasoning 过程
- 在这一步骤,生成了 600k 的数据!
- 使用 DeepSeek-v3 做 self-output 生成了 200k 个数据。
- 在问题中加入 各式各样的任务(包括一些没有标准答案的问题),然后使用 DeekSeek-v3 作为 verifier 来判断 Model B 得到 answer 的好坏。
-
将上面数据对作训练集,再次使用 Imitation Learning 从 DeepSeek-v3-base 中训练出 Model C
-
Model C 再做一次 RL 得到 DeepSeek-R1
- 这一步主要强化模型 safety 和 helpfulness 的能力
- 技术报告中提到:DeepSeek-R1 也试过加入 process verifier 和 MTCS 来提高模型能力,但最终并没有好的结果
DeepSeek-R1 在推理发癫中
彩蛋:因为 DeepSeek-R1 的训练资料中有相当一部分是 AI 生成的,所以推理过程中会出现一些奇怪的东西。
左图:以 RL 训练是否成功,这与基座模型有很大的关系!
右图:事实上,DeepSeek-v3 本来就会 Aha 和 Wait,RL 只是对能力进行强化。
- 以 DeepSeek-R1-Zero 的训练方式来训练 Qwen-32B,和 QwQ-32B-Preview 相比,提升并不显著
- 但是知识蒸馏却可以大幅强化 Qwen-32B
RL 运作的本质:提升模型产生正确答案的概率,降低模型产生错误答案的概率。
- 想要做 RL 的前提是,你先要具有产生一定数量正确答案的能力!
- 如果想用 RL 强化模型 Reasoning 的能力,那么模型本身得先具有 Reasoning 的能力!
DeepSeek-R1 冗长的思考
planing + verification
用到了 explore
DeepSeek-R1 用到了上文讲的各类方法,但是思考过程太长了
过度的思考过于浪费时间资源和算力资源
能不能在需要 Reasoning 的地方再 Reasoning?
如何避免过度思考?
推理越长,并不意味着正确率越高
推理长度与正确率之间是负相关的
从上面的图表中我们可以得知,并不是推理长度越长,模型的正确率就越高。
但也不能说是因为推理长度变长导致正确率变低。决定推理长度与正确率的因素还有很多,比如题目难度、输入长度等等。
比较严谨的实验:让模型对同一问题回答 5 次,然后按 推理长度 分类。
左图:不同 group 内推理过程的长度(单位为 token)
右图:越长的答案,并不意味着正确率越高(group5 往往还会比 group1 更差)
上面的实验说明了,推理长度对正确率并不一定有帮助。
最好的工程师不是把事情做到完美,而是在有限资源下把事情做到最好!人工智能也是一样。
如何避免模型想太多
下面我们就针对上面的 4 类建立 reasoning 的方法,分别列举一些能够避免过度思考的方法
对 CoT 方法
右侧图表:CoD 大幅减少了推理过程开销,性能相较于 CoT 没有明显下降,甚至在一些测试上还优于 CoT
从 Prompt 上控制 CoT 的长度:
- 原本:think step by step
- 现在:think step by step,但生成的每一条草稿都不要超过 5 个字
对 Explore 方法
sampling 时,少采一点:
- Beam Search 的时候选择小一点的 beam
- 在 MCTS 的时候,生成小一些的树
对 IL 方法
左图:在模仿学习时,考虑推理长度的问题;右图:逐步缩短推理长度,渐进式地训练。
对模仿学习方法:
- 用同一个问题问教师模型很多次,选择其输出正确答案中推理长度最短的那个作为训练数据,这样可以 train 出推理长度较短的模型
- 可以逐步减少训练数据中 CoT 的长度以训练隐式 CoT 的模型
- 如果直接从 stage1,移除全部 CoT 过程,直接用 input-answer pairs 训练,一定学不到 CoT。为了方便模型学习,我们要逐步移除 CoT 过程(stage1 -> stage2 -> … -> stage6)
- 最后得到的 Implicit CoT 模型在一些简单问题上,与原来的 Explicit CoT 模型性能差不多,但它并不产生 CoT 的过程。
对 RL 方法
随着 RL 的不断进行,模型的输出会越来越长,这是因为我们没有对 推理长度 做惩罚。
直觉上:可以设置模型推理长度超过 某一阈值(比如 1k)就给惩罚
- 但这不好!如果问题比较难,会需要较长的推理,所以强制的给一个一刀切的阈值并不好。
左图:根据问题难度,制定一个推理长度的“相对标准”。
右图:设置 reward 让模型对 Prompt 中的推理长度敏感
如何制定一个相对标准?
- 让模型多次回答同一个问题,然后统计平均推理长度。
- 在做 RL 的过程中,在答对的情况下:如果推理长度比平均长,那就给惩罚;比平均短,那就给奖励。
在 RL 中,还可以控制推理的长度:以 正确率、目标长度和实际推理长度的差异 为标准,设计 reward。
左图:模型是在数学问题集上训练的。在 In Domain 的情况下,模型经 RL 后,可以较好控制推理长度;在 Out of Domain 的情况下,模型在一定程度上学到了控制推理长度的能力。
右图:Our Methods 是通过 RL 训练得到的可以控制推理长度的模型。其他模型是正常的基座模型(S1略有改动)。可以看到:RL 并没有使模型的推理能力受到太大的影响.
S1 是从 Gemini 知识蒸馏得到的,而且加入了控制推理长度的机制:如果模型讲的太长,超过阈值就直接终止;如果模型讲太短,就把终止符换成 wait,继续推理过程。
- 从图上看:强行约束对模型性能的损害较大。
Our Methods 的简要说明:
- L1 - Exact:如果 Prompt 中指定了一个阈值,则只有
模型推理长度=阈值是好的,凡是不等于阈值都是不好的。 - L1 - Max:如果 Prompt 中指定了一个阈值,则只有
模型推理长度<=阈值是好的,凡是大于阈值都是不好的。