CH 03认识论 II:归纳问题与幻觉的根源
上一章讲清了「知道」的判据,这一章讲「凭什么相信」。 核心结论先给你,它可能是全站最有用的一句话:机器学习做的是归纳,而归纳在哲学上从来没有被证明过—— 它依赖一个无法被验证的假设(「未来会像过去」)。理解这一点,你就能提前预判模型会在哪里失效, 而不是等事故发生后写复盘。同时,这一章会解释幻觉为什么删不干净——不是工程没做好,是目标函数的性质决定的。
3.1休谟的归纳问题
1739 年,26 岁的休谟在《人性论》里提出了一个至今没有公认解答的问题。 它被公认为哲学史上最难的问题之一,而它恰好是机器学习的理论地基正在漏的那个洞。
我们所有的推理都建立在因果关系上;而因果关系的全部知识都来自经验; 但经验只告诉我们过去如何,从不能告诉我们未来必然如何。
—— 休谟《人性论》第一卷(大意)拆成三步,一步步看它是怎么卡住的:
- 我们的预测依赖因果规律。「加热水到 100°C 会沸腾」「下雨水会湿」—— 你能做任何预测,都是因为假定了某种规律性的连接。
- 这些规律的知识只能来自经验。你没有先天地知道水会沸腾,你是观察到的。
- 但经验只覆盖过去。你观察了一万次水沸腾,这一万次都在过去。 你要断言「下一次也会沸腾」,就必须假定「未来会像过去一样」。
现在关键的一步来了——这个假定本身是怎么来的?
如果有人问:「你凭什么相信未来会像过去?」
你的回答只能是:「因为一直以来都是这样。」
但这个回答又是一个从经验出发的归纳推理——它已经预设了「未来会像过去」,而这一点正是要被证明的东西。
用归纳来证明归纳。这是一个循环论证。休谟的结论是:归纳没有理性根据,我们对它的信任是一种心理习惯,不是理性推论的结果。
罗素的例子:那只被养肥的火鸡
常被归于罗素的一个例子,能让你一眼看出归纳的脆弱(这个例子常出现在讨论归纳的文献中):
一只火鸡被养在农场里。它每天观察:早上 9 点,人类会来喂食。
它做了大量观察——第 1 天、第 2 天、第 100 天、第 1000 天,无一例外。它甚至可以算出一个很漂亮的置信区间, 统计上非常显著。它归纳出结论:每天早上 9 点会有食物。
然后感恩节到了。早上 9 点来的不是食物。
这只火鸡的错误不在于「观察得不够多」——它的样本量很大、规律很稳、统计上无懈可击。 它的错误在于前提:它假定了「一直如此」意味着「永远如此」,而这个假定本身就是归纳。
工程含义:任何泛化性能报告都必须附带说明它在哪些分布变化下失效。 只报一个测试集分数,等于隐藏了全部风险。
3.2归纳为什么不可能被证明
你可能会想:「那我们用概率论上来证明它不就行了?」这条路被详细尝试过,卡在两个地方。
尝试一:用大数定律保证
有人会说:样本量足够大时,观察频率会趋近真实概率(大数定律),所以归纳可靠。
① 大数定律本身也是从归纳中来的。它描述的是「如果过程满足某些条件,那么频率会收敛」—— 而我们怎么知道未来会满足这些条件?又是归纳。
② 更致命的是:它管的是「频率」,管不了「性质」。火鸡的观察频率收敛得很好, 但它对「明天会发生什么类型的事」没有任何保证。 大数定律能告诉你「历史上 9 点喂食的比例」,不能告诉你「明天 9 点是否属于喂食这一类事件」。
尝试二:假设「自然齐一性」
这是密尔等人的思路:我们预设一条公理——「自然过程是齐一的」, 即未来会遵循与过去相同的规律。有了这条公理,归纳就有效了。
但这只是把问题挪了个位置:这条公理本身怎么来的?还是从经验归纳来的。 而且它是一个非常强的假设——它等于说「宇宙中不存在会改变规律的时刻」, 这是一个我们无法从有限观察中证实的全称命题。
对你的意义:既然归纳没有理性根据,那么模型的可靠性也不可能被证明, 只能被持续监测。这直接推出了工程上的一个硬要求: 上线后的分布监测不是可选项,而是认识论上的必需品。
3.3古德曼的绿蓝悖论:更狠的一刀
休谟指出了归纳缺乏根据。1955 年,纳尔逊·古德曼在《事实、虚构与预测》里提出了一个更尖锐的问题: 假设我们接受归纳,那么哪种归纳是合法的?
他构造了一个人造谓词来展示麻烦:
定义一个新词 grue(绿蓝):
一个对象是「绿蓝的」,当且仅当——它在某个未来时刻 T 之前被观察时是绿的,而在 T 之后被观察时是蓝的。
现在,假设 T 定在 2030 年 1 月 1 日,而在那之前我们观察了一万颗翡翠,每一颗都是绿的。
这一万个观察,同时支持两个互相矛盾的结论:
「所有翡翠都是绿的」——因为观察到的是绿。
「所有翡翠都是绿蓝的」——因为它们在 T 之前被观察到,且都是绿的,完全符合 grue 的定义(并在 T 之后会是蓝的)。
同一批证据,同等地支持两个未来预测完全相反的假设。
关键问题:你凭什么说「绿」这个假设比「绿蓝」更合理?
直觉上你会说「绿蓝是人为构造的、不自然」。古德曼承认这点,但他指出—— 「自然」和「人为」的界线,本身需要被定义,而任何定义都要面对同样的问题。 他最终的方案(用谓词的「稳固性」/entrenchment 来解释)也受到很多批评,至今没有公认的解答。
这个视角解释了你遇到过的一个现象
因为训练过程没有唯一解。损失函数降到最低只是必要条件,不是充分条件—— 无数个参数配置都能达到相同的训练损失,而它们的泛化行为不同。 梯度下降 + 随机初始化选择落在哪一个,这里面天然带着任意性。
所以:模型的「能力」不是唯一确定的,它是一个分布。 报一个跑分而不报方差,等于隐藏了一半的信息。这也是为什么严格的评测报告必须包含多次运行的均值与方差。
3.4波普尔与可证伪性
面对休谟的结论,二十世纪的波普尔给了一个完全不同的回应: 他放弃了「证明」,转而主张科学的标志不是可证实,而是可证伪。
一个理论如果不能被任何可能的观察所反驳,那它就不是科学理论。
—— 波普尔《猜想与反驳》的核心主张(大意)波普尔的方案很漂亮:既然你无法证明「所有天鹅都是白的」,那就不去证明—— 改为积极地尝试推翻它。找到一个黑天鹅,「所有天鹅都是白的」就被推翻了。知识通过「猜想与反驳」增长,而不是通过累积证实。
| 对比 | 证实的逻辑 | 证伪的逻辑 |
|---|---|---|
| 方向 | 积累正面证据,逐步加强信念 | 主动寻找反面证据,试图推翻 |
| 逻辑强度 | 弱:再多正面例子也不能证明全称命题 | 强:一个反例就能推翻全称命题 |
| 实践含义 | 「我们的系统在这些测试上都通过了」 | 「我们尝试了这几种方式,都没能让它失败」 |
- 不问「测试通过了吗」,问「我们尝试从哪些角度攻破它?攻破了几次?」
- 专门建一个「对抗集」:由尽力想让它出错的案例组成,而不是由典型case组成。
- 如果一轮下来一个失败案例都没找到,这本身是个警报信号——说明攻击强度不够,不是系统完美。
- 它适用于全称命题,不适用于概率性主张。「这个模型 95% 的情况下正确」很难被单个反例证伪—— 5% 的失败本来就是它的一部分。所以对 ML 系统,证伪需要统计意义上的证伪(失败率显著高于声称值)。
- 它不告诉你哪个理论更好。两个都没被证伪的理论,无法据此排序。 这一点对工程很重要:「两种方案都没被推翻」不等于它们等价,你仍需要别的判据。
- 现实中很难干净地证伪。当一个模型失败时,你可以归因于「数据不好」而不是「方法错」; 加上辅助假设(训练方式、超参、提示词),理论总能被保住。 这就是为什么「失败复盘」常常变成互相甩锅——它在结构上允许无限推迟证伪。
3.5【工程锚点】泛化就是归纳
现在把上面的东西全部落到实践。这张表你应该贴在团队墙上:
| 归纳问题里的概念 | ML 工程里的对应物 | 它什么时候背叛你 |
|---|---|---|
| 「未来会像过去」 | 「部署分布 = 训练分布」 | 用户群体变了、业务场景扩展了、上游数据源改了格式 |
| 归纳依赖观察到的规律 | 模型学到的统计相关性 | 相关性存在但因果链断裂时(这也是虚假相关的根源) |
| 证据支持多个假设(绿蓝) | 多个模型都能拟合训练数据 | 你会误以为「效果就是这样」,其实只是「这次随机的效果」 |
| 无法用理性证明,只能假设 | 没有理论保证的泛化 | 任何时候。它一直是个假设,不是保证 |
| 火鸡的样本量很大却错了 | 测试集很大也不代表安全 | 测试集与部署环境同样偏离时——你会拥有一份很漂亮的分数和一堆线上事故 |
测试集为什么不能作为「安全证明」
很多人把测试集分数当作「系统能工作」的证据。用归纳问题的视角看,这里有三重漏洞:
- 测试集是同分布的。标准做法是从同一批数据里切分出测试集。 这保证了「测试集与训练集同分布」,但完全没有保证「测试集与部署环境同分布」—— 而后者才是你真正需要的那个保证。
- 测试集被反复使用。你用它调参、选模型、做决策,几十轮之后它实质上已经变成了训练集的一部分。 这在方法论上是「信息泄漏」,而且是极难避免的——这就是「测试集过拟合」。
- 测试集是你自己选的。你选择了问题类型、标注标准、评估指标。 它测量的是「你关心并想到的那些维度」——而事故往往来自你没想到的维度。
- 保留一个「冷冻测试集」:从创建之日起就锁起来,只在重大版本发布前使用一次, 用完即废弃并重建。这是防止测试集过拟合最有效的办法。
- 建一个「真实环境集」:从生产环境采样真实的、未经清洗的输入。 它通常比干净的测试集难看很多,也更能预测真实表现。
- 报告要写成范围而不是单值:「准确率 87%–92%(5 次运行,不同随机种子)」比「准确率 90%」诚实得多。
3.6【工程锚点】分布外为什么必然失败
「分布外」(OOD)这个词常被当作一个待解决的技术难题。 但从归纳问题的角度,它不是难题,是边界条件——它不是「还没做好」,而是「本质上做不到」。
关键在于:这个输出既不是「对的」也不是「错的」,而是「无意义的」—— 它只是函数在该点的取值,没有任何经验基础的支撑。但因为输出看起来像一个正常答案, 你会把它当成一个有根据的回答。
四种分布偏移,危险程度不同
| 类型 | 表现 | 可检测性 | 危险度 |
|---|---|---|---|
| 协变量偏移 | 输入分布变了,但输入到输出的关系没变 | ✅ 较高 | 🟡 可以检测输入特征分布,据此重训 |
| 标签偏移 | 各类别的比例变了,但每个类别内的特征规律没变 | 🟡 中 | 🟠 需要监控输出分布 |
| 概念漂移 | 输入到输出的关系本身变了(比如用户偏好、行业术语含义变化) | 🔴 难 | 🔴 高:输入分布可能完全正常,但答案已经错了 |
| 对抗性输入 | 人为构造的、专门触发错误模型的输入 | 🔴 极难 | 🔴 高:必要时需专门防御手段 |
第三行最需要警惕。概念漂移的输入看起来完全正常—— 用户问的问题和以前一模一样,措辞一样,格式一样。但正确的答案变了。 你的输入分布监控不会报警,因为你监控的是输入;你需要的是输出质量监控, 而这通常最贵、最难、也最容易被省略。
一个反直觉的设计原则
既然分布外必然失败,那么产品设计的目标就不应该是「杜绝失败」——那是做不到的。 目标应该是:让失败以可检测、可恢复的方式发生。
| 设计选择 | 糟糕的做法 | 更好的做法 |
|---|---|---|
| 输出形式 | 直接给结论 | 给结论 + 依据来源 + 不确定提示 |
| 失败可见性 | 模型默默给出错误答案 | 低置信时显式降级(「我不确定,请核实」) |
| 可恢复性 | 错误答案直接进入下游流程 | 关键动作前需要人工确认 |
| 可检测性 | 无日志、无监控 | 记录输入特征、输出、置信度,支持回溯分析 |
3.7【工程锚点】幻觉的哲学根源
这一节是全站最重要的内容之一。结论是:幻觉不是实现缺陷,是当前训练目标的必然后果。 理解这一点,你就不会再把「消灭幻觉」当成一个可以排期的目标,而会去设计与幻觉共存的产品。
根源一:模型的学习目标是「像人类文本」,不是「说真话」
这个目标奖励的是什么?是「生成在人类语料里常见的、通顺的、连贯的文本」。 它不奖励「符合事实」——因为训练信号里没有「事实」这个变量,只有「下一个 token 是什么」。
所以在目标函数的层面上,「说真话」和「说得像真的」是没有区别的。 后者甚至更容易达成,因为有时候编造一个流畅的细节比承认不确定更「像」训练数据里的文本 (真实语料里,人们通常直接给出答案,而不是说「我不确定」)。
根源二:模型没有「不知道」这个状态
这是一个经常被忽略的结构性问题。人类认知里有一个明确的内部状态:「我不知道」。 当你被问一个不了解的问题时,你能感觉到那个空缺。
但模型是一个函数——它没有「空缺」这个状态。 对任何输入,它都会给出分布,然后采样。「不知道」对它来说不是一个状态,而只能是另一个输出。
这跟人类完全不同:人类说「我不知道」通常是真的不知道, 模型说「我不知道」和它是否知道之间没有稳定的因果关系。
两类幻觉,需要完全不同的对策
| 类型 | 定义 | 对策 |
|---|---|---|
| 事实性幻觉 与世界的偏差 |
输出与客观事实不符(编造人名、事件、数字) | 检索增强(RAG)、工具调用核实、引用强制、事实抽检。 本质是用外部验证来补足模型缺失的验证机制。 |
| 忠实性幻觉 与上下文的偏差 |
输出与你提供的材料不符——你说「根据下列文档回答」,它却加了文档里没有的内容 | 更严格的结构化输出约束、逐句引用要求、答案与来源的自动一致性检查。 这类幻觉更隐蔽,因为它在事实上可能正确,只是没有依据。 |
举例:你做了一个制度问答助手,把公司规章喂进去。用户问「年假几天」, 文档里写「工作满一年 5 天,满三年 10 天」,而模型回答「工作满一年 5 天,满三年 10 天,满五年 15 天」—— 最后一句文档里没有,它自己补的。而且恰好符合行业惯例,所以看起来非常可信。
为什么会这样?因为模型的世界知识里「年假随工龄阶梯增长」是高度常见的模式, 它在补全一个「更完整」的答案。从训练目标看,这个补充提高了文本的通顺度和完整性。
对策:不要只检查「答案对不对」,要检查「答案的每一句能不能在材料里找到出处」。 这是可以自动化的:把答案拆成句子,逐句做「与来源材料的相关性验证」,低于阈值的标红。
为什么幻觉率降到一定程度就降不动了
这解释了一个普遍的工程现象:幻觉率从 20% 降到 3% 相对容易(加检索、加约束、加校验), 但从 3% 降到 0.3% 极其困难,而且每一点下降都要付出不成比例的代价。原因有三层:
- 目标函数层面:只要训练目标是「生成像人类文本的内容」,「生成看似合理的内容」就永远是低成本的, 而「承认不知道」是高成本的(偏离训练分布)。这个张力无法被完全消除。
- 验证机制层面:模型没有内置验证器。你只能外挂验证(检索、工具、人工)—— 而外挂验证的覆盖率永远不完整,总有它覆盖不到的情况。
- 长尾层面:剩下的 3% 往往集中在罕见、复杂、或本身存在分歧的问题上。 这些问题更难解决,而且解决它们需要的成本更高、收益更低。
- 在高风险场景,把幻觉的后果挡住——不用「让它更准」,而用「让它出错时不造成损害」: 加人工确认、加硬约束、加下游校验。
- 让幻觉可被发现——要求引用、标注不确定、提供来源链接。
- 把「拒答正确率」当作一等指标——参考上一章的四指标体系。
- 诚实告知能力边界——在界面上说明「本系统基于 X 资料,超出范围的回答可能不准确」。 这不是免责声明,这是帮助用户正确使用工具的必要信息。
3.8奥卡姆剃刀与模型选择
「如无必要,勿增实体」——奥卡姆剃刀大概是流传最广的哲学原则,也是被误用最多的一条。 在 AI 语境下它经常被用来支持「小模型更好」或「简单方案更优」,但这么用是有问题的。
它原本在说什么
在解释力相同的情况下,应当选择假设更少的理论。
—— 奥卡姆剃刀的常见表述(注意「解释力相同」这个前提)两个关键限制:
| 限制 | 含义 | 在 AI 里意味着什么 |
|---|---|---|
| ① 前置条件 | 必须在解释力相同时才谈得上「更简单」。 | 如果小模型做不到大模型能做的事,它们不构成「解释力相同」, 奥卡姆剃刀对此没有发言权。不能用它论证「应该用小模型」。 |
| ② 「简单」没有唯一定义 | 参数更少算简单?还是假设更少算简单?还是描述长度更短算简单? | 一个参数量小的模型可能隐含了更多人为设计的归纳偏置(架构先验), 从「假设数量」的角度它反而更复杂。「简单」的度量不同,结论会反转。 |
这个推论的问题在于:「记住」和「泛化」不是二选一。 一个系统可以同时表现出记忆和泛化,而区分两者需要实验,不能靠「简洁性直觉」。 凡是试图从「复杂/简单」直接推出「不智能/智能」的论证,都跳过了必要的实证步骤。
3.9动手练习
-
列出你的「火鸡假设」。写下你的项目赖以成立、但从未被验证的三个前提。
它们通常长得像这样:「用户的提问方式和我们现在假设的一样」、
「上游数据的格式不会变」、「用户的偏好不会因为我们的产品而改变」。
产出:三个前提 + 每个前提「如果被推翻,系统会怎样」 -
做一次证伪式测试。不要去跑标准测试集,改为主动构造 20 个「我认为最可能让它出错」的案例,
然后跑一遍。记录失败率。
如果失败率为 0,请反思:是你系统太强,还是你的攻击太弱? -
检查你报告里的方差。找一份你之前的评测结果,看它是不是单次运行的数字。
如果是,用 3–5 个不同随机种子重跑,算出范围。
这个动作几乎总能揭示之前被忽略的不确定性 -
给你的 RAG 加一个忠实性检查。把模型答案拆成句子,
逐句检查能否在当前检索到的材料中找到支持。凡是找不到支持的句子,标记出来。
这一步能抓出大量「事实正确但无依据」的补充内容 -
写一段「能力边界说明」。用用户能理解的语言,说明你的系统的适用范围和已知局限。
写完后自问:如果你是一个用户,读了这段说明,你的期望会变吗?
如果答案是「不会」,那说明说明写得太模糊,需要更具体
3.10自测题
Q1. 用三句话复述休谟的归纳问题,并说明它为什么无法被解决。
① 我们的一切预测都依赖「未来会像过去」这个假定。
② 这个假定只能来自经验,而经验只覆盖过去。
③ 因此我们无法用理性为它提供辩护。
为什么无法解决:任何试图证明它的论证,要么本身就用到了归纳(循环), 要么需要引入一个比归纳更强的假设(如「自然齐一性」),而那个假设同样无法被证实。 这不是「暂时没做到」,而是这类问题的结构决定的。
Q2. 古德曼的绿蓝悖论比休谟的问题「更狠」在哪里?
休谟指出归纳缺乏根据(没理由)。古德曼指出:即使你接受归纳, 你仍然面对「该选哪一个归纳」的问题——同一批证据同等地支持多个预测完全相反的假设。
所以问题从「凭什么相信」变成了更棘手的「怎么在无限多个都与数据一致的假设中挑选」。 现代 ML 用「归纳偏置」来回答这个问题,但归纳偏置本身也是人为选择的, 所以它把问题前移而不是解决了。
Q3. 为什么幻觉无法被彻底消除?至少说出三个层次的原因。
① 目标函数层:训练目标是「生成像人类文本的下一个 token」, 它奖励流畅与完整,不奖励真实性。「说真话」和「说得像真的」在目标函数上不可区分。
② 结构层:模型没有「不知道」这个内部状态。「不知道」对它只能是一个输出, 不能是一个状态。所以拒答行为与「是否真知道」之间没有稳定因果。
③ 验证层:模型没有内置验证机制,只能外挂(检索、工具、人工)。 外挂验证的覆盖率永远不完整,总有覆盖不到的情况,而残差集中在最难的长尾上。
三层叠加的结果:降到个位数百分比可以,降到 0 不可能。 所以正确的目标是在高风险场景阻断后果,并让幻觉可被检测。
Q4. 你的测试集准确率 95%,为什么不能作为「系统可靠」的证据?
三个漏洞:
① 同分布问题:测试集与训练集同分布,但不保证与部署环境同分布。 你需要的是后者。
② 反复使用导致过拟合:用它调参、选模型几十轮之后,它实质上已经变成了训练数据的一部分。
③ 选择性偏差:测试集的问题类型、标注标准、指标都是你选的, 测的是「你想到并关心的维度」,而事故来自没想到的维度。
补救:冷冻测试集、真实环境集、报告范围而非单值。
Q5.【动手题】你的团队说「我们的 RAG 系统幻觉率已经降到 2% 了,可以上线」。 你会问哪三个问题?
问题一:这个 2% 是怎么测的?测试集从哪来? 如果测试集是你们自己按典型场景写的,那它天然避开了长尾, 真实环境下的幻觉率会显著更高。要问清楚有没有从生产环境采样、有没有覆盖边界情况。
问题二:这 2% 里,事实性幻觉和忠实性幻觉的比例是多少? 两者的严重程度不同。忠实性幻觉(答案里补了材料中没有的内容)更隐蔽, 在制度、医疗、法律类场景中可能比明显的事实错误更危险, 因为它看起来完全合规、符合常识。如果这个 2% 里大部分是忠实性幻觉,那不能简单认为「比事实幻觉好」。
问题三:出错的时候,用户会发现吗?后果能不能被阻断? 这是最关键的一问。2% 能不能接受不取决于数字本身,取决于错误的后果:
- 如果这是一个给学生查资料的辅助工具,错误答案会被学生交叉核对,2% 可能可以接受。
- 如果这是自动生成合同条款、或者给患者提供用药参考,2% 完全不可接受, 无论投入多少成本都要加人工复核。
如果团队回答不出第三问,说明他们还没想清楚这个系统出错时谁受损—— 而这个问题不解决,讨论「2% 够不够」是没有意义的。
- 能不看笔记复述休谟的归纳问题,并说明它为什么无法用理性解决。
- 能解释「泛化就是归纳」,并说出你的项目依赖了哪三个未经验证的前提。
- 能区分事实性幻觉与忠实性幻觉,并说明为什么后者可能更危险。
- 能说出幻觉无法彻底消除的至少三个层次的原因。
- 能正确使用奥卡姆剃刀——先比能力,再比复杂度,不倒置顺序。
- 完成一次证伪式测试,得到一份真实的失败案例清单。