第一部 · 地图第 3 章 / 14

不只是神经网络

搜索、规则与试错。这三种「老式」AI 至今仍在你的导航软件、下棋程序和游戏角色里工作,而且它们是理解后面所有内容的必要背景。

主线 8 分钟 · 深入 6 段 · 实验 2 个
地图、棋盘、迷宫:三种不靠学习的 AI。
地图、棋盘、迷宫:三种不靠学习的 AI。

你打开地图,输入目的地,一秒钟之内它给出一条路线。这里面没有神经网络,也没有任何「学习」。它做的是搜索:在几千万个路口和路段组成的网络里,找出一条总代价最小的路径。做这件事的算法诞生于 1968 年,至今没有被取代。

这一章讲三种不靠学习的 AI:搜索、规则和试错。它们是第一章那张地图上最外圈的居民。今天的新闻很少提它们,但它们无处不在,而且现代最强的系统,比如 AlphaGo 和会调用工具的智能体,恰恰是把它们和神经网络组合在一起的结果。理解它们,你才能看清神经网络到底解决了什么、没解决什么。

搜索:在可能性的森林里找一条路

很多看起来需要智能的问题,本质上都是「在大量可能性里找一个好的」。走迷宫、排课表、解数独、下棋、规划机器人的动作,都是这样。搜索算法的思路很朴素:从起点出发,一步步展开可能的下一步,直到碰见目标。

朴素的做法是把所有可能性都试一遍。这在小问题上可行,在真实问题上不可行:国际象棋每一步大约有三十几种走法,走十步就有 $30^{10}$ 种,接近六百万亿;围棋则是每步两百多种,可能的对局数量超过宇宙里的原子数。第二章讲的「组合爆炸」就是这个意思。

聪明的搜索靠两样东西省力。一是剪枝:早早判断某个分支不可能更好,就不再展开它。二是启发式:用一个便宜的估计告诉算法「往哪边走更有希望」。地图软件用的 A 算法就是启发式搜索的经典:它对每个路口计算「已经走了多远」加上「离目的地的直线距离」,优先展开总和最小的那个。直线距离是个粗略的估计,但它永远不会高估真实距离,这个性质保证了 A 找到的一定是最短路,同时又比盲目搜索快得多。

浅色:被展开过的格子;空白:从未看过的格子 每个格子打一个分 f(n) = g(n) + h(n) g:从起点走到这里已经花了多少 h:到终点还要多少的估计(直线距离) 每次展开 f 最小的格子。 只要 h 从不高估,第一次取出终点时走过的一定是最短路。 h ≡ 0 就是 Dijkstra:正确,但四面八方都要探一遍。
A* 给每个格子打分 f = g + h,每次展开分最低的。浅色格子是它看过的,远少于整张图。

搜索算法有一个庞大的家族,它们的区别只在两件事:按什么顺序展开节点,以及有没有用估计。

算法 展开顺序 用估计吗 保证最优 典型用途
广度优先 离起点近的先 是(步数意义上) 小迷宫、社交网络里的「几度人脉」
深度优先 一条路走到黑再回头 拼图、排课这类「找一个可行解」
Dijkstra 已走代价最小的先 路网、网络路由
A* 已走代价 + 估计剩余最小的先 是(估计不高估时) 导航、游戏寻路、机器人规划
束搜索 每层只保留最好的几个 机器翻译和语言模型解码
蒙特卡洛树搜索 随机模拟多的分支先 是(用模拟结果) 围棋、复杂博弈

最后一行值得注意:第八章讲的语言模型生成,本质上也是在「可能的续写」这棵树上搜索,束搜索就是它常用的一种策略。搜索从来没有离开过 AI,它只是换了个名字藏在生成里。

深蓝 1997 年击败卡斯帕罗夫,靠的就是这一套:一秒钟评估两亿个局面,配上几十年积累的开局库和残局库,以及一个由国际象棋大师参与调校的局面评估函数。它没有「学」过任何东西,每一分能力都是人设计和算力堆出来的。这是第一次浪潮那种思路的巅峰,也几乎是它的终点:同样的方法用在围棋上完全不行,因为围棋的分支太多,而且「这个局面谁占优」这件事,没有人能写出一个像样的评估函数。

A* 给每个待展开的节点打一个分数 $f(n) = g(n) + h(n)$。$g(n)$ 是从起点到这个节点已经确定的代价,$h(n)$ 是从这个节点到目标的估计代价。算法每次都展开 $f$ 值最小的节点。

关键在 $h$ 上。如果 $h$ 从不高估真实的剩余代价(术语叫「可采纳」),那么当目标节点第一次被取出时,它的 $f$ 值就等于真实最短路的长度,任何其他路径都不可能更短。直线距离在地图上显然满足这个条件:两点之间没有比直线更短的路。

如果 $h$ 恒等于零,A 退化成 1959 年的 Dijkstra 算法,仍然正确,但会把各个方向都均匀地探索一遍,慢得多。如果 $h$ 估得非常准,A 几乎沿着最短路笔直走过去,几乎不浪费一步。启发式越接近真实值,搜索越省力,但过于乐观(高估)会失去最优性保证,这时算法变得更快但可能给出次优的路。工程上常常故意这样做,因为用户宁要一秒钟给出的九十五分答案,也不要一分钟给出的满分答案。

这个「用一个便宜的估计引导昂贵的搜索」的思想,是后面 AlphaGo 的核心,也是今天推理模型「先想一想再回答」的远亲。

规则:把知识写成 if-then

第二种老式 AI 是规则系统。第二章讲过它作为「专家系统」的兴衰,这里讲它今天以什么形态活着。

一条规则长这样:「如果学生连续三次作业未交,且最近一次测验低于六十分,则标记为需关注。」几百条这样的规则串在一起,配一个推理引擎按顺序匹配,就是一个规则系统。它的优点在于透明可控:每一个结论都能追溯到触发它的规则,改一条规则就能精确地改变行为,不需要重新训练什么。

正因为这两个优点,规则系统在监管严格的地方从未退出:银行的反欺诈第一道防线、税务系统的合规检查、医院的用药冲突提醒、航空的调度约束。这些地方需要的不是「大概率正确」,而是「每一个决定都能解释、都能审计」。

规则的弱点也没有变:写不完,而且不会自己适应世界的变化。所以今天的实际系统大多是混合体:机器学习模型给出一个概率,规则系统在它上面加一层硬约束。「模型认为这笔交易 95% 是正常的,但金额超过阈值且发生在凌晨,规则要求人工复核。」当你在第十一章看到智能体被要求「在执行删除操作前必须确认」,那就是规则在给神经网络系上安全带。

下面是一个真实风格的学情预警规则集的节选,用伪代码写,任何一所学校的教务系统都可能有类似的东西:

规则 1:连续 2 周未提交作业             → 标记「作业风险」
规则 2:本学期出勤率 < 80%              → 标记「出勤风险」
规则 3:最近两次测验平均分 < 60         → 标记「学业风险」
规则 4:同时命中任意两条               → 升级为「需关注」,通知班主任
规则 5:命中「需关注」且 14 天内无回访记录 → 提醒年级组长
例外 A:有病假记录的周不计入规则 1、2
例外 B:转学生入学 4 周内不触发规则 3

它的好处一目了然:每一个标记都能说出是哪条规则触发的,家长问起来有据可答;要放宽或收紧,改一个数字就行;不需要任何历史数据就能上线。

它的问题也一目了然:门槛是拍脑袋定的(为什么是 80% 而不是 75%),例外会越加越多,而且它抓不住规则没写到的模式,比如「成绩没掉但突然不再参与课堂讨论」。

所以今天的做法是两层:机器学习模型在上百个特征上学出一个「风险概率」,规则系统在它上面决定什么时候通知谁、什么情况下必须人工复核、哪些学生绝不能被自动标记。模型负责发现,规则负责边界。第五章讲评估时,你会看到为什么这个分工对学生来说很重要。

试错:在奖励里学会决策

第三种方法和前两种都不同。它不搜索,也不靠人写规则,而是让一个「智能体」在环境里反复尝试,做对了得到奖励,做错了受到惩罚,慢慢学会在每种情况下该做什么。这叫强化学习。

想象一只老鼠在迷宫里找奶酪。它一开始乱走,偶然走到奶酪那里,得到一次奖励。下一次它在同样的岔路口会稍微倾向于上次走对的方向。几百次之后,它对迷宫里每个位置、每个方向都有了一个「值多少」的估计,于是能径直走向奶酪。这个估计就是强化学习里的「价值」,而学习的过程就是把奖励沿着走过的路一点点往回传,让早期的正确决定也分到功劳。

智能体维护一张「什么情况下做什么值多少」的表 环境迷宫、棋盘、市场、一段对话 动作 a 新状态 s′ 和奖励 r 没有标签,只有行动之后的奖励;学的是「这种情况下该做什么」 探索 vs 利用:走已知的好路,还是试试别的岔路
强化学习的循环:智能体做出动作,环境返回新状态和奖励。

强化学习有一个所有其他方法都没有的难题:探索与利用的矛盾。已经知道一条能拿到奶酪的路,是该一直走它,还是该冒险试试别的岔路,说不定那边有更多奶酪?只利用不探索,会困在一个平庸的解里;只探索不利用,永远拿不到稳定的回报。人的一生也在做这个权衡,只是我们不用这个词。

奖励沿着走过的路往回传:离奶酪越近的格子,值越高。
奖励沿着走过的路往回传:离奶酪越近的格子,值越高。

强化学习是机器人、游戏 AI 和自动驾驶决策层的基础。它也是今天大语言模型训练的最后一道工序:第九章会讲,让模型「更有用、更诚实、更无害」的那一步,用的正是强化学习,奖励来自人类的偏好。

最经典的强化学习算法之一叫 Q 学习,1989 年提出,它简单到可以在一页纸上讲完。

智能体维护一张表 $Q(s, a)$,记录「在状态 $s$ 下采取动作 $a$,长远来看值多少」。开始时表里全是零。每走一步,它观察到当前状态 $s$,选一个动作 $a$(大多数时候选表里值最大的,偶尔随机探索),得到奖励 $r$,来到新状态 $s'$。然后它按下面这条规则更新表:

$$Q(s,a) \leftarrow Q(s,a) + \alpha\big[\,r + \gamma \max_{a'} Q(s',a') - Q(s,a)\,\big]$$

括号里是「实际得到的」减去「原来以为的」,也就是这一步的意外。$\alpha$ 是学习率,决定每次意外改变多少估计;$\gamma$ 是折扣,决定未来的奖励比眼前的打几折。这条更新规则有一个漂亮的性质:只要每个状态动作对都被尝试足够多次,表格最终会收敛到最优策略,不管智能体一开始有多笨。

Q 表的局限也很明显:状态一多,表就存不下。围棋的状态数超过 $10^{170}$,任何表都装不下。解决办法是不再用表,而是用一个神经网络去近似这个 Q 函数。2013 年,DeepMind 用这个办法让一个网络直接看着屏幕像素学会了几十种雅达利游戏,这就是「深度强化学习」,也是 AlphaGo 的前奏。

第九章会讲,让大语言模型「更有帮助、更诚实、更无害」的那一步用的是强化学习。这里先用本章的语言把它的结构摆出来,你会发现它和迷宫老鼠是同一件事。

状态是到目前为止的对话(用户的问题加上模型已经写出的部分)。动作是下一个 token。一局是从问题开始到回答结束。奖励在一局结束时给出:这个回答好不好。和迷宫不同的是,没有一个「奶酪」自动出现,奖励要有人定义。做法是先请人对不同回答排序,训练一个「奖励模型」学会像人一样打分,再让它来给语言模型的每一局打分。

这带来一个只有强化学习才有的麻烦:智能体会钻奖励的空子。迷宫里的老鼠如果发现「在原地打转也能拿到一点奖励」,它就会打转。语言模型如果发现「写得长、语气肯定、多用『当然可以』」能拿高分,它就会这样写,不管内容是否更好。这叫奖励破解,是第九章「对齐」阶段最头疼的问题之一,而它的根源在本章:任何靠奖励学习的系统,学到的都是「怎样拿到奖励」,而不是「奖励想表达的那个东西」。

强化学习的理论在 1980 年代末已经成形,但它的每一次「出圈」都和神经网络绑在一起。

1992 年,IBM 的杰拉德·特索罗让一个神经网络通过自我对弈学习西洋双陆棋,程序叫 TD-Gammon。它没有看过任何人类棋谱,几个月后达到了世界顶尖水平,还发现了一些人类棋手没用过的开局。这是「自我对弈 + 神经网络」第一次证明自己,比 AlphaGo 早二十四年,只是当时几乎没人注意。

之后是漫长的沉寂,强化学习主要活在机器人控制和运筹学里。2013 年,DeepMind 用一个卷积网络直接看着屏幕像素玩雅达利游戏,同一个网络、同样的超参数,在几十款游戏上达到或超过人类水平,这就是「深度 Q 网络」。它证明了强化学习可以直接从原始感知输入学习,不需要人手工设计状态。

2016 年 AlphaGo,2017 年 AlphaZero,2019 年在《星际争霸》和《Dota 2》上达到职业水平,这些是博弈线。另一条线更安静但影响更大:2017 年提出的「近端策略优化」让强化学习变得稳定好用,2022 年它被用来把语言模型对齐到人类偏好,也就是第九章的 RLHF。从棋盘到聊天助手,中间隔着的其实只是「奖励从哪里来」这一个问题。

三者合流:AlphaGo 是怎么赢的

2016 年 3 月,AlphaGo 以四比一击败李世石。很多报道把它写成「神经网络的胜利」,但更准确的说法是:它是本章三种方法与神经网络的合流。

每一步之上,是一棵可能性的树。
每一步之上,是一棵可能性的树。

它用搜索:每一步都用蒙特卡洛树搜索向前推演几十步,评估各种走法的后果。它用试错:通过几百万盘自我对弈的强化学习,把一个只会模仿人类棋谱的网络练成了超越人类的棋手。它用规则:围棋的规则本身就是搜索时判定合法走法和胜负的硬约束。而神经网络的作用,是替代了深蓝时代靠人手写的评估函数:一个「策略网络」告诉搜索该优先考虑哪几步,一个「价值网络」告诉搜索当前局面谁占优。这两个网络就是第二章里让深蓝方法在围棋上失败的那块缺口。

一年后的 AlphaZero 更进一步:不看任何人类棋谱,只给规则,从零开始自我对弈,几天之内在围棋、国际象棋和将棋上都超过了之前所有程序。它让人们第一次认真考虑一个问题:如果机器不需要人类的经验也能变强,那么在哪些领域,人类的经验反而是一种限制?

这个组合的模式,今天在更大的尺度上重演。一个会调用工具的智能体,本质上是「语言模型给出候选动作,搜索和规则约束动作的执行,环境反馈作为奖励」的循环。所以这一章虽然讲的是「老方法」,它们并没有过时,而是换了一种形式,藏在最新的系统里。

带走一句话

神经网络解决的是「怎样从数据里得到一个好的判断」;搜索解决的是「怎样在大量可能性里高效地找」;规则解决的是「怎样保证某些事一定或一定不发生」;强化学习解决的是「怎样在有后果的行动中学会决策」。真正的系统需要它们全部。

自测先自己想,再点开答案
  1. 地图软件的路线规划为什么不用神经网络?

    答案

    因为这是一个结构清晰的搜索问题:路网是明确的图,代价是明确的距离或时间,A* 这样的算法能在保证最优的前提下快速求解,不需要从数据中「学习」。神经网络在这里可能用于预测路段拥堵(那是预测任务),但找路本身用搜索更合适。

  2. 启发式函数「从不高估」这个条件,为什么对 A* 这么重要?

    答案

    它保证当目标第一次被取出时,没有任何未探索的路径可能更短,所以找到的一定是最优路。如果启发式高估了某些方向,算法可能提前放弃那条实际上更短的路。

  3. 为什么强化学习必须处理「探索与利用」的矛盾,而监督学习不需要?

    答案

    监督学习的数据是给定的,模型只是从中拟合规律。强化学习的数据来自智能体自己的行动,它选择走哪条路就决定了它能看到什么;只走已知的好路,就永远发现不了可能更好的路。

  4. AlphaGo 里神经网络具体替代了深蓝方法中的哪个部分?

    答案

    深蓝靠人手写的局面评估函数判断谁占优、该优先考虑哪些走法。围棋上没有人能写出这样的函数,AlphaGo 用价值网络和策略网络从数据和自我对弈中学出了它们,搜索的框架本身仍然保留。

本章术语

搜索Search

在大量可能性里系统地寻找一个满足条件(或最优)的解:从起点出发展开可能的下一步,直到到达目标。走迷宫、排课、下棋、路径规划都是搜索问题。朴素搜索会遭遇组合爆炸,实用的搜索靠剪枝与启发式省力。

启发式Heuristic

一个便宜的估计,告诉搜索「往哪边更有希望」。地图上的直线距离就是到目的地真实距离的启发式。好的启发式让搜索几乎不走弯路;从不高估真实代价的启发式能保证搜到最优解。

A* 算法A* search

1968 年提出的启发式搜索算法,对每个节点计算「已走代价 + 到目标的估计代价」并优先展开最小者。只要估计从不高估,它保证找到最短路,且远快于盲目搜索。导航软件与游戏寻路至今用它。

规则系统Rule-based system

用人写的 if-then 规则做判断的系统。优点是透明、可审计、可精确控制;缺点是写不完、不会自己适应变化。今天常与机器学习模型组合使用:模型给概率,规则加硬约束,例如智能体执行危险操作前必须确认。

强化学习Reinforcement Learning, RL

让智能体在环境中反复尝试,按行动之后得到的奖励调整策略,学会「在这种情况下该做什么」。它没有标签,只有奖励;必须处理探索与利用的矛盾。是机器人、游戏 AI 的基础,也是大语言模型对齐阶段的核心方法。

奖励Reward

强化学习中环境对智能体行动的反馈数值。学习的目标是最大化长期累积奖励。奖励的设计极其关键:设计不当会导致智能体钻空子(奖励破解),这一问题在用人类偏好训练语言模型时同样出现。

探索与利用Exploration vs. exploitation

强化学习特有的矛盾:是沿用已知有效的行动(利用),还是尝试未知的行动以发现可能更好的选择(探索)。只利用会困在平庸解,只探索拿不到稳定回报。监督学习的数据是给定的,不存在这个问题。

蒙特卡洛树搜索Monte Carlo Tree Search, MCTS

通过随机模拟大量对局来评估走法的搜索方法,把算力集中在最有希望的分支上。AlphaGo 用它向前推演,并用策略网络与价值网络替代了以往靠人手写的评估函数,是搜索与神经网络合流的典型。