
Grok 3 与 DeepSeek-R1 是怎么学会思考的?
你是否思考过:大模型是如何做到既能到出口成章又能演算数学题的呢?今天,让我们用实例来揭开大模型中「思维链」的神秘面纱。
1、什么是思维链技术?
简而言之,思维链技术就是让大模型在回答问题时,不再只给你一个冰冷的答案,而是会抽丝剥茧般地一步步展示它是如何找到答案的。
要知道,传统 LLM 的训练目标是预测下一个 token,而不是系统地推理数学问题。它们在庞大的文本语料库中学到了各种模式,但「数学公式的严谨推演」并非其主要任务。就好比一个狂热的小说家,擅长讲故事,却不能推演平面几何。
过去模型常常「一口气出答案」,让人不知其所以然;而引入思维链后,大模型开始认真剖析问题,像个老学究一样,慢慢盘点每个推理步骤、思路和细节,甚至让问题解决过程变得丰富多彩。
看问题:“9.9 和 9.11 哪个大?”
这个问题你一定很眼熟,以往的 LLM 模型往往一口气给出答案:
“9.9 大” 或者 “9.11 大”
相信大家都见过上面这类问答。
而有思维链加持的大模型会类似下面这样回答:
[思维链开始]
步骤 1: 比较整数部分,9.9 和 9.11 的整数部分均为 9,相等。
步骤 2: 比较小数部分。将 9.9 补零为 9.90,与 9.11 对齐小数位数。
步骤 3: 比较十分位:9.90 的十分位是 9,9.11 的十分位是 1,9 > 1。
步骤 4: 由于十分位已分出大小,无需继续比较后续位数。
[思维链结束]
最终答案: 9.9 更大
当然,像“步骤 n:” 之类的文字不需要出现在最终的回答中。
我们生活中的很多问题都不是简单的“一步到位”。大到规划一场旅行,小到如何在朋友圈中秀出你的“高情商”,都需要多步骤好好斟酌。大模型也是如此,只有通过多步推理,才能理解问题的复杂性,给出更准确、更合理的回复。
研究者们发现,当让模型生成中间过程时,它不仅局限于直接回忆知识,而是利用内在逻辑「自行推演」出合理的答案。这就像你的大脑:遇到难题时,你会先喊「冷静思考」,然后按部就班地分解问题。
一个例子
模型被问到:“你觉得猪能飞吗?”传统回答:直接回答“不会”(语气平淡,仿佛没有看过《哪吒之魔童闹海》)。
然而,启用了思维链后,模型会这样戏剧性地展开思考:
步骤 1: 回顾常识 —— 猪通常不会飞,毕竟它们天生厚重大气。(想象一下猪穿着小翅膀在天空飘,滑稽得像动画!)
步骤 2: 考虑例外 —— 有没有可能在特定情境下实现“猪飞”?比如某部科幻电影里,通过改造、生物工程让猪拥有了喷气式翅膀。
步骤 3: 分析科技现实 —— 目前的技术还没能让猪飞起来,毕竟重力太强,哪怕是超级英雄也得靠电影特效。
最终结论: 猪会飞只存在于你的梦里或者奇幻小说中,而在现实生活中,我们只能默默哀叹:“猪还是不飞,老天对它们太仁慈了。”
这样的回答不仅逻辑清晰,还充满幽默感,既让人啼笑皆非,又能学到知识。可以说,思维链使得模型回答从“僵硬的机器式”变得几乎像个会讲笑话的谈话高手。
更有意思的是,这种方法还可以帮助模型发现潜在的细节错误。如果中间某一步出错了,那么后续的流程也会暴露问题,从而促使模型进行自我修正!这就好比你在煮咖啡时突然发现多加了一勺咖啡粉,结果导致风味失调。
2、严肃一点讲
思维链(Chain of Thought, CoT)是一种提示策略,通过在输入提示中提供一系列中间推理步骤,引导大型语言模型逐步思考并生成最终答案。与传统的直接提问方式相比,CoT 模仿了人类的思考过程:在面对复杂问题时,通常会将问题分解为多个小步骤,逐一解决,最终得出结论。
CoT 的核心思想在于:通过显式地展示推理过程,帮助模型更好地理解问题的结构和逻辑,从而提升其在需要多步推理的任务中的表现。
例如,在解决数学问题时,CoT 不仅要求模型给出答案,还要求其展示演算和推理过程;在常识推理中,CoT 帮助模型通过逻辑链条得出更合理的结论。
首先,CoT 也是在传统 LLM 的任务框架下行事,即预测下一个 token。那么它怎么做到植入推理过程呢?
下面我们以一个具体案例,从 LLM 模型的输入和输出角度,来解释思维链在算法层面的工作原理。
这个例子不仅展示了模型如何从输入生成中间推理步骤(即思维链 tokens),再输出最终答案,而且也揭示了这些过程背后的大致算法机制。
案例 1:计算表达式
请计算:
有思维链加持的大模型回答起来可能输出如下文本:
[思维链开始]
步骤 1:首先计算括号内的加法,3 + 5 = 8。
步骤 2:然后将结果乘以 2,8 × 2 = 16。
步骤 3:接着减去 4,16 - 4 = 12。
步骤 4:最后,除以 2,12 ÷ 2 = 6。
[思维链结束]
最终答案:6
上面是大致样子,链的具体形式当然是灵活的。
下面是算法层面的详细解释:
- 输入与分词
- 输入文本:用户输入的文本为
请计算:((3+5) * 2 - 4)/2
- 分词与编码:模型首先将这段文本分解为一系列的单词或符号(也称为“tokens”),例如:[ \text{["请", "计算", ":", "(", "(", "3", "+", "5", ")", "*", "2", "-", "4", ")", "/", "2"]} ] 接着,每个 token 都被映射成一个高维向量,输入到 Transformer 编码器中。
- 隐藏状态与模型推理
- Transformer 编码器:经过多层自注意力(self-attention)和前馈神经网络,这些 token 的向量得到了上下文敏感的表示(隐藏状态)。这些隐藏状态为之后的生成过程提供了充分的“记忆”和语境。
- 提示与解码:当模型开始生成回答时,通常会使用一种解码器机制(如贪心搜索或束搜索),它逐步生成文本 tokens。– 在传统模式下,模型可能直接生成最终答案 “6”。– 而采用链式思维提示后,模型被引导生成一系列中间推理步骤。这些步骤就是“思维链” tokens,例如:
a.“步骤 1:...”
b.“步骤 2:...”… 依次生成,直到完成问题求解。
- 输入与输出的完整路径示意
下面用一个简单的 ASCII 流程图展示整个过程:
++
| 用户输入文本 |
| "请计算:((3+5)*2-4)/2" |
++
│
▼
++
| 分词 & 编码 |
| Tokenization & Embedding |
++
│
▼
++
| Transformer 编码器 |
| 生成上下文感知的隐藏状态 |
++
│
▼
++
| 解码过程: |
| 生成中间的 Chain-of-Thought |
|(步骤 1、步骤 2、… 推理过程) |
++
│
▼
++
| 生成最终答案 Output Tokens |
| “6” |
++
从算法角度看,思维链相当于为 LLM 增加了一个「推理草稿纸」:
- 输入阶段:用户问题经过分词和编码,生成隐藏状态。
- 生成阶段:模型被引导生成中间「草稿」,描述每一步推理过程的 tokens 。
- 输出阶段:基于这些中间 tokens,最终汇总出正确答案的 tokens。
这种机制让模型不仅能回答「多少」这样的问题,而且能展示「为什么」,使回答过程逻辑严谨,仿佛一个会详细讲解思路的老师在旁辅导。通过对内部中间 tokens 的采样和自我校验,思维链让复杂问题求解变得既透明又高效,真正打破了以往仅靠模式匹配的黑盒局限。
案例 2:微积分演算
在一些研究中,研究人员发现在解决复杂数学问题时,通过在提示中展示 3~5 个带有详细推理过程的示例,可以大幅度提高模型正确率;而在专门针对数学或逻辑推理问题进行微调时,常见的做法是构建包含数千到上万个示例的数据集。这些数据集帮助模型建立起「在解题过程中先明确中间状态,再得出结论」的推理习惯。
举例来说,假设我们希望模型学会解决微积分中的积分问题,数据集中可能包括了从建立积分公式、变量替换、积分分步计算、再到最后化简的完整过程。
以一题简单的不定积分为例,数据集示例可能这样构造:
问题:计算 ∫ (2x * cos(x²)) dx
推理过程:
步骤1:注意到 x² 的导数是 2x,因此做变量替换设 u = x²;
步骤2:则 du = 2x dx,故原积分可写为 ∫ cos(u) du;
步骤3:积分 ∫ cos(u) du = sin(u) + C;
步骤4:将 u = x² 代回,得 sin(x²) + C
最终答案:sin(x²) + C
类似的,稍微复杂一点的例子,如计算如下定积分。
思维链示例如下:
推理过程:
步骤 1:对积分采用分部积分法,设 u = ln(1+x),dv = dx。
步骤 2:则有 du = (1/(1+x)) dx,v = x。
步骤 3:应用分部积分公式:∫ u dx = u·v - ∫ v du,
得到:∫ ln(1+x) dx = x·ln(1+x) - ∫ [x/(1+x)] dx。
步骤 4:注意到分式可以拆分:x/(1+x) = 1 - 1/(1+x)。
步骤 5:因此 ∫ [x/(1+x)] dx = ∫ 1 dx - ∫ 1/(1+x) dx = x - ln|1+x| + C。
步骤 6:综合得:∫ ln(1+x) dx = x·ln(1+x) - x + ln|1+x| + C。
步骤 7:将积分区间 0 到 1 带入:
当 x = 1 时:1·ln2 - 1 + ln2 = 2ln2 - 1;
当 x = 0 时:0 - 0 + ln1 = 0。
步骤 8:定积分结果为 (2ln2 - 1) - 0 = 2ln2 - 1。
最终答案:2ln2 - 1
构造像这样的示例,如果多样性和覆盖面足够,可能需要上千例才能让模型全面掌握微积分问题的链式推理方法,但对于引导大型预训练语言模型来说,再提供几个样例就能显著激发它已有的能力。
对于像微积分这样的复杂数学任务,若从零开始训练让模型形成清晰链式推理的能力,大规模的预训练数据集中的「推理示例」可能达到数百万 tokens,而在专门微调时数百到数千个高质量推理示例已足矣激发和稳固这项能力。
网络规模与学习能力
这里有一点值得提一下,就是网络规模在链式推理中扮演了重要角色。
小网络的局限性:
- Token 级别关系:小型网络受制于其参数数量和计算能力,往往只能捕捉到局部的、短程的 token 级别关系。它们擅长完成一些简单的任务(如句子补全、短文本分类等),但在处理需要复杂逻辑推理和多步推导的问题时显得力不从心。
- 上下文局限:小网络在处理长文本时,可能会因为模型的容量限制,无法很好地记住或理解上下文关系。这导致其在多步骤推理过程中容易丢失重要信息或产生错误。
大网络的优势:
- 命题级别关系:大规模模型拥有更大的参数空间和更强的表示能力,可以捕捉到更复杂、长程的关系。这使得它们能够更好地理解和生成链式推理中的中间步骤,类似于「命题级别」的逻辑推导。
- 增强的上下文理解:大网络具备更强的上下文捕捉能力,可以在较长文本中保持一致性和连贯性。它们能在解决复杂问题时,保持对多步推理过程的记忆和逻辑链条的清晰展示。
具体示例对比
假设有一个复杂的数学问题,需要多个步骤才能求解:
小网络可能生成的内容:
问题:计算 ∫ (2x * cos(x²)) dx
答案:这是一个复杂的积分问题,需要做变量替换。
- 缺陷:小网络可能停留在简单的描述上,无法具体展示变量替换和逐步积分的过程。
大网络生成的内容:
问题:计算 ∫ (2x * cos(x²)) dx
步骤1:注意到 x² 的导数是 2x,因此做变量替换设 u = x²。
步骤2:则 du = 2x dx,故原积分可写为 ∫ cos(u) du。
步骤3:积分 ∫ cos(u) du = sin(u) + C。
步骤4:将 u = x² 代回,得 sin(x²) + C。
答案:sin(x²) + C
- 优势:大网络能够详细展示每个中间步骤,逻辑清晰,确保问题求解过程透明且可验证。
理论支持:在诸多研究中,比如 OpenAI 发表的关于 GPT-3 的论文,他们发现随着网络规模的增大,模型在复杂任务上的表现显著提升。这不仅包括语言理解和生成,还涵盖了逻辑推理和数学问题求解。大规模模型通过大量预训练数据,学会了从简单的 token 关系推导出更高阶的逻辑模式,这正是链式推理得以实现的基础。
思维链的有效训练确实依赖于足够大的网络规模。小型网络在学习和表现复杂逻辑链条方面存在天然的限制,而大规模网络具备更强的表示能力和上下文理解力,可以在多步骤推理中展现出更好的性能。这个过程不仅需要庞大的模型参数,还依赖于大量高质量、多样化的数据来强化和检验模型的推理能力。
3、总结
思维链技术正是利用了大模型生成下一个 token 的自回归机制,让模型在每一步输出时都显式地展示其「中间思考过程」。这意味着,当模型面对一个复杂问题时,它不再试图一口气生成最终答案,而是在生成过程中逐步展开逻辑步骤,类似于我们人类在思考问题时写下草稿、一步步推理的过程。
这种机制的核心在于:
- 逐步展开:模型按顺序生成中间步骤,每个步骤都为后续步骤提供了「上下文」,确保最终结论更具条理性和逻辑性。
- 透明推理:通过生成中间 tokens,思维链不仅提高了答案的准确性,也让用户可以看到模型的推理过程,从而增强了答案的可信度。
- 自我校验:如果某个步骤出现逻辑漏洞,整个链条可能会暴露问题,使得模型有机会在后续生成中自我纠正。
总之,思维链技术利用 token 生成机制,让大模型具备「按步骤解决问题」能力,也是为何在当前的很多复杂任务(比如数学题、逻辑推理)中,链式思维表现出了卓越的效果。
怎么样,现在再去跟 DeepSeek-R1 之类的 AI 聊天,是不是心里更有底啦。
本文主要通过举例子揭开思维链的神秘面纱,至于之后发展出来的更多衍生技术,如零样本 CoT、自动 CoT 以及多模态 CoT 等,不在本文涉及范围。
4、附录
最后,为了加深对 LLM 的了解,我们再来举例更多的数学相关的思维链数据集中的具体例子,结合了公开数据集中的典型问题和实际应用场景。
1)数列推理问题
问题:给定数列 1,2,6,24,120,? ,... 问号处的数字是多少?这个数列有什么数学意义?思维链:
- 步骤1:观察数列的递增规律:1 → 2(×2),2 → 6(×3),6 → 24(×4),24 → 120(×5)。
- 步骤2:发现每个数字是前一个数字乘以递增的整数(2, 3, 4, 5…),因此下一个数应为 120×6 = 720。
- 步骤3:识别数列的数学意义:这是阶乘数列(n!),即1! = 1, 2! = 2, 3! = 6, 4! = 24, 5! = 120, 6! = 720。答案:720,数列为阶乘数列。
2)多步骤数学应用题
问题:一个人有 16 个球,其中一半是高尔夫球,而高尔夫球中又有一半是蓝色的。问有多少个蓝色高尔夫球?思维链:
- 步骤 1:总高尔夫球数 = 16×½ = 8 个。
- 步骤 2:蓝色高尔夫球数 = 8×½ = 4 个。答案:4 个蓝色高尔夫球。
3)代数问题
问题:将 100 根火柴分成 10 堆,每堆数量为单数,且相邻两堆相差 2 根。如何分配?思维链:
- 步骤1:单数序列可从 1 开始,每次加 2,即 1,3,5,…,19。
- 步骤2:验证总和:1+3+5+…+19 = (10 项等差数列求和) = 10² = 100。
- 步骤3:分配方案为 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 根。
4)视觉误导下的数学验证
问题:下图中的两个怪物看起来大小不同,但实际上是否相同?(需结合图像)思维链:
- 步骤1:使用测量工具对比高度和宽度。
- 步骤2:分析视觉错觉来源(如背景线条或透视效果)。
- 步骤3:确认两者实际尺寸相同。答案:大小相同,视觉误差由背景设计引起。
5)复杂数学推理(GSM8K 数据集示例)
问题:简给妈妈 2 朵花后剩下 10 朵,接着给爸爸 3 朵,爸爸现在有多少朵花?思维链:
- 步骤1:简最初有花数 = 10+2 = 12 朵。
- 步骤2:给妈妈后剩余 10 朵,再给爸爸 3 朵,则爸爸有 3 朵。
- 步骤3:注意问题中的“给爸爸后他会有多少朵”,而非简剩余多少。答案:3 朵。
6)数值比较与符号推理
问题:为什么大模型可能错误认为 9.11 大于 9.9?思维链:
- 步骤1:模型将 “9.11” 切分为 “9”、“.”、“11”,而 “9.9” 切分为 “9”、“.”、“9”。
- 步骤2:模型误将 “11” 与 “9” 直接比较,导致错误结论。
- 步骤3:通过 CoT 提示,模型需逐步比较小数点后位数:9.11 = 9 + 0.11,9.9 = 9+0.9→0.9 > 0.11。答案:9.9 更大。
7)字母计数任务
问题:单词 “strawberrrrry” 中有多少个字母 “r”?思维链:
- 步骤1:逐个字母拆分:s-t-r-a-w-b-e-r-r-r-r-r-y。
- 步骤2:标记每个 “r” 的位置(第 3、7、8、9、10、11 位)。答案:6 个 “r”。
本文转载自机器学习与数学,作者: 大师兄
