被压缩的技术史:符号学习的设计、瓶颈与让位
被压缩的技术史:符号学习的设计、瓶颈与让位
零、引言
这得从宇宙大爆炸开始讲起。
138亿年前,奇点膨胀,基本粒子冷却凝结成氢氦,恒星在引力坍缩中点燃,重元素在超新星爆发中锻造,46亿年前地球成形,35亿年前原始生命在海底热泉口出现,寒武纪生命大爆发,恐龙崛起又陨落,灵长目从树冠下到草原,能人拿起石块敲出第一片石器,智人走出非洲,语言诞生,符号被发明,文字刻上泥板,城邦兴起又崩塌,亚历山大的图书馆焚毁,罗马陷落,阿拉伯人翻译希腊典籍,经院哲学在中世纪大学的回廊里争论共相,文艺复兴的光线从佛罗伦萨的穹顶洒下,牛顿写下《自然哲学的数学原理》,蒸汽机在曼彻斯特的棉纺厂里轰响,图灵在布莱切利公园破译恩尼格玛,冯·诺依曼架构写在手稿上,晶体管在贝尔实验室的桌子上点亮,硅谷的车库里焊接着电路板,TCP/IP协议的第一声”ping”传回——
好了,这些跟我们今天要讲的符号学习,一毛钱关系都没有。
教科书里那段被压缩的历史,不需要从古希腊的亚里士多德讲起,也不需要回顾莱布尼茨的”通用字符”。它只关乎一个朴素的工程问题:在算力只有今天百万分之一的年代,我们怎么让机器看起来有点智能?以及,后来发生了什么。
(以下为正文)
翻开任何一本当代人工智能的教科书,你大概率会在第一章读到这样一段话:“早期的符号学习方法由于知识获取瓶颈等问题,已被统计机器学习方法所取代。”寥寥数语,一段横跨三十年、深刻塑造了计算机科学面貌的历史就被打发了。
教科书这么写可以理解——它只保留“当前有效”的技术主线。但这种叙述的副作用是让读者误以为技术史是一条“新替代旧”的单线。实际上,技术史更像一个工具箱的更新:旧的工具没有“错”,只是新的工具在大部分场景下更顺手。
符号学习就是那个旧工具箱里的一件重要工具。理解它“长什么样”、“怎么运转”、“为什么被边缘化”,不是为了怀旧,而是为了看清我们今天站在哪里——以及当下大模型的边界在哪。
一、为什么符号学习是“当时的最优解”
在20世纪60到80年代,计算机的算力大约是这样的:每秒几万到几十万次浮点运算,内存以KB到MB计,硬盘昂贵且缓慢。没有互联网,没有大规模数字化数据集。
在这种约束下,如果你想让机器“有点智能”,你只有两条路:
- 让人来教机器:把人脑中的知识整理成规则,手工输入。
- 让机器自己学:给机器大量数据,让它自己找规律。
第二条路在当时的硬件和数据条件下几乎走不通。一个简单的两层神经网络连“异或”逻辑都学不会,更别说处理图像或文本。所以,第一条路不仅是“自然的选择”,几乎是唯一的选择。
符号学习就是这套“人工教机器”方法论的最高形态。它的技术核心可以拆解为三层:
- 知识表示层:用逻辑谓词、框架、语义网络等结构把现实世界的知识编码成计算机能存储的形式。
- 推理引擎层:给定一组事实和规则,自动推导出新事实。
- 解释层:能向用户展示“为什么得出这个结论”,因为推导路径是可追溯的。
这套架构在当时是极其务实的。它用极少的算力完成了有价值的辅助工作。
二、符号学习“长什么样”:从规则匹配到链式推理
简单来讲,可以把符号学习理解为“高级的 if-else”,这并不算错,但不够完整。它的核心是“产生式规则”(Production Rule)——经典的 “IF-THEN” 结构。但关键在于:
- 知识库(规则集)与推理引擎是分离的:你可以在完全不修改推理程序的情况下,通过增删知识库中的规则来改变系统的行为。
- 推理引擎可以做链式推导:从已知事实出发,自动触发多层规则,推导出间接结论。
代码示例一:最朴素的规则匹配
这是最直观的形式,类似于一个高级的“关键词”查找:
def is_sport(s):
# 知识库:一个包含所有“运动”关键词的列表
sports_knowledge_base = ['足球', '篮球', '乒乓球', '网球', '羽毛球']
# 推理过程:检查输入是否在知识库中
return s in sports_knowledge_base
print(is_sport('足球')) # 输出: True
print(is_sport('编程')) # 输出: False这本质上就是 if s in list,很简单。但真正的符号系统要复杂得多。
代码示例二:一个完整的“动物识别专家系统”
这是一个能进行链式推理的符号学习系统,模拟了经典的动物识别专家系统。
第一步:定义知识库
# 知识库:定义了一系列的推理规则
rules = [
{ "name": "规则1-哺乳动物-有毛发", "premise": ["有毛发"], "conclusion": "哺乳动物" },
{ "name": "规则2-哺乳动物-胎生", "premise": ["胎生"], "conclusion": "哺乳动物" },
{ "name": "规则3-鸟类-有羽毛", "premise": ["有羽毛"], "conclusion": "鸟类" },
{ "name": "规则4-鸟类-会飞且下蛋", "premise": ["会飞", "下蛋"], "conclusion": "鸟类" },
{ "name": "规则5-食肉动物-吃肉", "premise": ["吃肉"], "conclusion": "食肉动物" },
{ "name": "规则6-食肉动物-犬齿且爪利", "premise": ["犬齿", "爪利"], "conclusion": "食肉动物" },
{ "name": "规则7-老虎-哺乳动物且食肉", "premise": ["哺乳动物", "食肉动物"], "conclusion": "老虎" },
{ "name": "规则8-老虎-黄褐色且黑色条纹", "premise": ["黄褐色", "黑色条纹"], "conclusion": "老虎" },
]这并非简单的关键词匹配,而是定义了概念之间的逻辑关系。
第二步:实现推理引擎(正向链式推理)
def forward_chaining(known_facts, rules):
"""正向推理引擎:从已知事实出发,反复应用规则推导新事实"""
known_facts = set(known_facts)
triggered_rules = []
print(f"初始事实: {known_facts}")
while True:
new_fact_derived = False
for rule in rules:
# 检查一条规则的所有前提是否都在已知事实中
if all(p in known_facts for p in rule["premise"]):
# 如果结论是未知的新事实,则加入知识库
if rule["conclusion"] not in known_facts:
print(f"触发规则: {rule['name']} => 推导出新事实: {rule['conclusion']}")
known_facts.add(rule["conclusion"])
triggered_rules.append(rule["name"])
new_fact_derived = True
# 如果一轮遍历下来没有推导出新事实,则停止
if not new_fact_derived:
break
return known_facts, triggered_rules第三步:运行并查看推理过程
# 用户输入的初始事实
user_facts = ["有毛发", "吃肉", "黄褐色", "黑色条纹"]
# 推理机工作
final_facts, used_rules = forward_chaining(user_facts, rules)
print("\n===== 推理报告 =====")
print(f"最终知识库: {final_facts}")
print(f"推导出的结论: {final_facts - set(user_facts)}")
print(f"触发的规则: {used_rules}")运行输出:
初始事实: {'黄褐色', '吃肉', '黑色条纹', '有毛发'}
触发规则: 规则1-哺乳动物-有毛发 => 推导出新事实: 哺乳动物
触发规则: 规则5-食肉动物-吃肉 => 推导出新事实: 食肉动物
触发规则: 规则7-老虎-哺乳动物且食肉 => 推导出新事实: 老虎
===== 推理报告 =====
最终知识库: {'黄褐色', '食肉动物', '老虎', '黑色条纹', '有毛发', '吃肉'}
推导出的结论: {'老虎', '食肉动物', '哺乳动物'}
触发的规则: ['规则1-哺乳动物-有毛发', '规则5-食肉动物-吃肉', '规则7-老虎-哺乳动物且食肉']这就是符号学习的核心机制:把推理过程拆成可追溯的步骤。你随时可以问”为什么是老虎?”系统会回答”因为有毛发→哺乳动物,吃肉→食肉动物,哺乳动物且食肉动物→老虎”。
Prolog的做法更极端:你别教计算机怎么算,你告诉它什么是事实、什么是逻辑关系,它自己推就行了。
% 事实
parent(john, mary).
parent(mary, susan).
% 规则:祖先的定义
ancestor(X, Y) :- parent(X, Y).
ancestor(X, Y) :- parent(X, Z), ancestor(Z, Y).
% 查询
?- ancestor(X, susan).
% 输出: X = john ; X = mary.代码示例三:处理不确定性(MYCIN风格)
现实世界充满不确定性,符号学习也能处理这种情况。MYCIN引入了确信度因子(Certainty Factor, CF),取值范围为[-1, 1],表示对结论的置信程度。
def diagnose_infection(fever, white_blood_cell, cough_duration):
"""
MYCIN风格的诊断规则
结合多个证据进行不确定性推理
"""
# 规则1:高烧且白细胞高 → 细菌感染(置信度0.7)
if fever > 38.5 and white_blood_cell > 10000:
cf_bacterial = 0.7
else:
cf_bacterial = 0.0
# 规则2:低烧且咳嗽超过两周 → 病毒感染(置信度0.6)
if fever < 38.0 and cough_duration > 14:
cf_viral = 0.6
else:
cf_viral = 0.0
# 组合多个证据的置信度
if cf_bacterial > cf_viral:
return f"细菌感染 (CF={cf_bacterial:.1f})"
elif cf_viral > cf_bacterial:
return f"病毒感染 (CF={cf_viral:.1f})"
else:
return f"无法确诊 (CF=0.0)"
print(diagnose_infection(39.0, 12000, 3)) # 输出: 细菌感染 (CF=0.7)
print(diagnose_infection(37.5, 8000, 21)) # 输出: 病毒感染 (CF=0.6)这段代码展示了符号系统如何对不确定的信息进行量化推理——虽然不像贝叶斯概率那样严格,但在实践中足够有效。
三、致命的硬指标:为什么符号系统“走不下去了”
符号学习没有“失败”于理论错误。它失败于三个工程硬指标。
1. 规则数量的组合爆炸
规则不是线性增长的。假设你有1000条规则,每条规则平均匹配3个条件,推理引擎在最坏情况下要考虑的组合数是 $1000 \times 3^k$ 量级(k为推理深度)。当规则库扩展到上万条,匹配效率急剧下降。
更致命的是:规则之间的一致性维护是指数级的。新增一条规则可能和100条现有规则产生冲突,每解决一个冲突又可能引入新的冲突。这本质上是一个约束满足问题,其复杂度在最坏情况下是NP完全的。这不是“哲学困难”,是计算复杂度困难。
2. 知识获取的“边际成本递增”
专家系统的知识获取流程是这样的:访谈领域专家 → 知识工程师整理成规则 → 编码 → 测试 → 发现遗漏 → 修改规则。每增加一层功能,所需的新规则数量不是线性增加的,而是随着系统覆盖面的扩大,新规则与旧规则的交互越来越复杂,调试时间越来越长。
MYCIN的500条规则花了数年时间构建。而一个现代的深度学习模型可以在几小时内从数百万样本中学到远超500条规则所能覆盖的模式。这不是“人教机器”不如“机器自学”的哲学问题,是单位人力产出效率的工程问题。
3. 对模糊输入完全没有容错能力
符号系统的输入必须是结构化的符号。如果你告诉MYCIN“患者有点发烧,但不是特别严重”,系统无法处理这种模糊描述——它需要一个精确的数值(如38.5°C)或明确的分类(如“发烧=是”)。而现实世界的数据永远是带噪声的、不完整的、模糊的。
这一点在图像识别上体现得最彻底。在符号框架下,“识别一张图片里有没有猫”意味着你要写规则描述“猫”的几何特征——耳朵三角形、瞳孔竖条、有胡须……但这些特征在真实照片里千变万化,规则永远不够用。统计学习处理这个问题的方式完全不同:它不写规则,只调参数。
四、范式转移:统计学习的三个核心优势
符号学习走不通的时候,另一条路正在成熟。这条路不要求人写规则,而是让机器从数据中自己找规律。
从“写规则”到“调参数”
符号系统的核心动作是“写”:专家写规则,工程师写代码。统计学习的核心动作是“调”:给一个初始的数学结构,用数据去调整里面的系数(参数),让输出和预期越来越接近。
最简单的例子:用房屋面积预测房价。
你在看二手房,发现面积越大的房子总价越高。你随手记下几组数据:
| 面积(m²) | 总价(万元) |
|---|---|
| 60 | 180 |
| 80 | 230 |
| 100 | 300 |
| 120 | 350 |
| 140 | 410 |
这些点在纸上大致落在一条直线附近。你想知道一个95平方米的房子大概多少钱,最简单的方法就是找一条最接近所有这些点的直线,然后用这条直线去预测。
这条直线的方程是:
房价 = a × 面积 + ba 和 b 就是参数。“训练”就是根据这些数据点,自动算出最合适的 a 和 b。这个数据集的拟合结果大概是 a=2.9,b=10,即:
房价 ≈ 2.9 × 面积 + 10代入95平方米:2.9×95+10=285.5万元。
“最合适”的意思是:这条直线到所有数据点的整体距离之和最小。你不断调整 a 和 b,让这个距离总和越来越小,调到不能再小了,就“训练好了”。
一个更直观的类比:教孩子认猫
符号学习的方法:你拿出一张纸,写下“猫的特征是:有胡须、尖耳朵、瞳孔竖条、尾巴长、会喵喵叫”,然后让孩子按这个清单去判断。问题在于,当你看到一只无毛猫、一只折耳猫、一只尾巴受伤的流浪猫时,清单上的特征不全对得上。于是你不断补充规则,但总有例外。
统计学习的方法:你给孩子看一千张猫的照片,不告诉他任何规则,只说“这些都是猫”。再给他看一千张狗、兔子、狐狸的照片,说“这些不是猫”。孩子的大脑会自动调整某种“内部判断机制”,虽然没有明确的规则,但下次看到一张新照片时,他能以很高的准确率判断是不是猫。
这就是根本区别。符号学习试图用语言描述智能,统计学习试图用数据生成智能。
三个核心优势
1. 知识来源从“专家”变成了“数据”
符号系统每一条规则都需要人类专家提炼和编码。这在地质勘探、医疗诊断等窄领域是可行的,但到了图像识别、语音识别、机器翻译这些“人类自己也说不清规则”的领域,直接瘫痪——你能写出一条规则判断“一张照片里有没有日落”吗?你连自己是怎么看出来的都说不清。
统计学习完全绕过了这个问题。只需要大量标注好的图片,算法自己找特征。不是“更好”,是“唯一可行”。
2. 对模糊输入的天然抗干扰能力
符号系统面对一个规则库没覆盖的输入,会直接失败。统计学习输出的是概率分布,即使拿不准,也会给出“75%是猫,20%是狗,5%是狐狸”这样的结果,下游应用可以根据阈值决定如何处理。
这在语音识别中极其关键。没有人说话是字正腔圆、毫无噪声的。统计模型天然能处理这种模糊性,符号系统则完全招架不住。
3. 性能随数据量和算力持续提升
符号系统的性能受限于规则库的质量和规模,而规则库的质量受限于人力投入。一个人的脑力是有限的,一个专家团队的产出也是线性的。加入更多人力,规则库规模线性增长,但推理复杂度是指数级增长——性价比越来越低。
统计学习的性能则随数据量和算力增长而持续提升。1990年一个模型几万参数,训练几万张图片已经是极限。2023年一个模型数千亿参数,训练数据是互联网级别。性能的差异已经不是“好一点点”,而是“根本不在同一个维度上”。
两种路线的差异可以这样理解:
- 符号学习:知识是专家写进代码的。处理模糊输入需要精确匹配,否则失败。提升性能靠招更多专家写更多规则。每一步都可解释,适合封闭、规则明确的小领域。
- 统计学习:知识是机器从数据中学的。输出概率分布,天然容错。提升性能靠喂更多数据、用更多算力。内部机制是黑箱,适合开放、模糊、数据充分的大领域。
统计学习取代符号学习,本质上就是“从手工编码到数据驱动”的范式转移。而这个转移之所以发生在90年代末到2000年代,不是因为有人突然想通了什么哲学道理——纯粹是因为互联网带来了海量数据,GPU提供了海量算力,两个硬条件同时满足了。
五、数据怎么”流”过神经网络:从矩阵乘法到概率输出
前面的房屋面积预测房价,是一个输入(面积),一个输出(房价)。但实际情况中,影响房价的因素远不止面积——还有楼层、朝向、房龄、是否学区房等等。
真正要预测房价,输入可能是一串数字:面积80m²、房龄5年、有电梯、距离地铁800米……这串数字同时进入模型,经过计算,输出一个房价。
图片识别也是同理:一张图片有成千上万个像素,每个像素有RGB三个数值——加起来可能是几万个数字同时输入。经过层层计算,最后压缩成一个数字(比如“是猫的概率”)。
从输入到输出:矩阵乘法的直觉
假设我们有 3 个输入(比如面积、房龄、距离地铁的距离),要计算出 2 个中间结果,每个中间结果都是所有输入的加权和:
$$
\begin{cases}
h_1 = a_{11}x_1 + a_{12}x_2 + a_{13}x_3 + b_1 \\
h_2 = a_{21}x_1 + a_{22}x_2 + a_{23}x_3 + b_2
\end{cases}
$$
这里:
- $x_1, x_2, x_3$ 是输入(比如面积、房龄、距离)
- $h_1, h_2$ 是这一层输出的中间结果
- $a_{11}, a_{12}, …$ 是每个输入对每个输出的权重系数
- $b_1, b_2$ 是偏置(相当于直线方程里的截距)
用矩阵乘法可以把这个过程写得更简洁:
$$
\begin{bmatrix} h_1 \\ h_2 \end{bmatrix}
=
\begin{bmatrix}
a_{11} & a_{12} & a_{13} \\
a_{21} & a_{22} & a_{23}
\end{bmatrix}
\begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix}
+
\begin{bmatrix} b_1 \\ b_2 \end{bmatrix}
$$
这不复杂,就是把每个输入分别乘以各自的权重,求和,加偏置。有多少个输出,就重复多少次这样的计算。
一般形式
如果输入有 $n$ 个,这一层要输出 $m$ 个值,那就是:
$$
\begin{bmatrix} h_1 \\ h_2 \\ \vdots \\ h_m \end{bmatrix}
=
\begin{bmatrix}
a_{11} & a_{12} & \cdots & a_{1n} \\
a_{21} & a_{22} & \cdots & a_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
a_{m1} & a_{m2} & \cdots & a_{mn}
\end{bmatrix}
\begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix}
+
\begin{bmatrix} b_1 \\ b_2 \\ \vdots \\ b_m \end{bmatrix}
$$
这个矩阵里每一行对应一个输出,每一列对应一个输入,交叉点的数字就是“这个输入对这个输出的贡献权重”。
从“很多输入”到“一个输出”
神经网络的输入层有成千上万个数字(比如一张图片的所有像素值),但最终只需要一个输出(“是猫的概率”)。所以每一层的设计是逐步压缩的:
- 输入层:$n$ 个数字(比如 20000 个像素值)
- 隐藏层1:1000 个中间值
- 隐藏层2:100 个中间值
- 输出层:1 个数字(压缩到最后只剩一个)
每一层都在做同一件事:矩阵乘法 + 加偏置。
至于这个数字怎么变成“概率”——最后一层套了一个叫 sigmoid 的函数:
$$
\text{sigmoid}(y) = \frac{1}{1 + e^{-y}}
$$
这个函数把任意实数 $y$ 压缩到 0 到 1 之间:$y$ 越大越接近 1,$y$ 越小越接近 0,$y$ 在 0 附近输出 0.5 左右。于是输出 $y=2.3$ 时,sigmoid(2.3)=0.91,解释为“91% 的概率是猫”。
一句话总结:输入是一串数字(比如所有像素值),中间经过层层“加权求和→套函数”,最终压成一个数字,再套一个 0-1 压缩函数,读作概率。
从头到尾全是乘法和加法,没有魔法。
六、顺便拆一个词:“神经网络”和“脑神经”没什么关系
读者看到这里可能会想:“神经网络”是不是模拟人脑的?听起来很深奥。
这里要明确一点:当代人工智能里说的“神经网络”和生物大脑里的“神经网络”,除了名字里都有“神经”两个字之外,几乎没有任何值得一提的联系。
这是个历史遗留问题。1940年代,研究者发现可以用一些简单的数学单元组成网络来完成计算任务,为了向生物神经系统致敬,把这些单元叫做“神经元”,把网络叫做“神经网络”。这个名字一直沿用至今。
但今天的“神经网络”本质上就是一个多层数学函数嵌套。
把“一条直线”变成“很多层”:
刚才的直线是一层:输入一个 $x$,乘一个 $a$,加一个 $b$,输出 $y$。
如果把多个这样的“乘加”操作串起来呢?
第一层:h1 = a1 × x + b1
第二层:h2 = a2 × h1 + b2
第三层:输出 = a3 × h2 + b3这就是多层神经网络。每一层做的事情和小学的直线方程完全一样——乘一个数,加一个数。只是层数多了,中间的 h1、h2 叫做“隐藏层”。
中间加了一些叫“激活函数”的东西,比如 ReLU(就是“负数变0,正数不变”),作用是让多层叠加后能表示更复杂的关系。但底层的运算没有变:全是乘法和加法。
所以“神经网络”本质上就是很多层线性变换(矩阵乘法)的堆叠,中间夹杂一些简单的非线性的数学函数,和生物神经元的离子通道、突触传递、神经递质没有任何关系。它甚至连“模拟”都谈不上,纯粹是借了一个名字。
之所以需要说明这一点,是因为“神经网络”这个词自带一种“神秘感”——好像我们在用电脑模拟大脑一样。实际上,今天的AI研究者和神经科学家几乎不怎么互相借鉴方法论。AI从数据里调参数,神经科学在显微镜下数突触,两个领域各干各的,交集极少。
这和一个更普遍的现象有关:技术史上有太多名字比本质更唬人的例子。“人工智能”这个词本身就让很多人以为机器真的在“思考”;“深度学习”听起来像机器“学得很深”,实际上只是在用更多层数做矩阵乘法。当一个技术术语被过度拔高为某种“思想体系”或“世界观”的时候,讨论就容易偏离技术本身,变成立场站队。
所以,如果你看到有人把“神经网络”和“人脑”放在一起类比,基本可以判断:要么他在做科普的极度简化,要么他在用唬人的类比。真正搞这个的人,脑子里装的是梯度下降和反向传播,不是神经元放电。
七、符号学习的“技术遗存”
符号学习的核心技术在今天并没有消失,它们被消化进了其他系统:
- 规则引擎(如Drools)仍在金融风控、医疗临床路径、业务审批系统中广泛使用。规则的可审计性在这里是刚需。
- 知识图谱(如Google的Knowledge Graph)的查询语言SPARQL和推理机制,直接继承自语义网和描述逻辑的符号传统。
- Prolog/Datalog的思想被嵌入到数据库查询优化和程序分析工具中。
至于近年来被热议的“神经符号AI”,其本质是把符号推理当成一个外部工具来调用:当大语言模型需要做多步算术或逻辑推理时,它不自己算(因为算不准),而是生成一段代码交给解释器执行,或者调用一个符号求解器。这和“用计算器做数学题”在本质上是一样的逻辑:让擅长模式匹配的模块做模式匹配,让擅长精确计算的模块做精确计算。
这不是什么“哲学融合”,是很朴素的系统集成:一个复杂系统里本来就需要不同的子模块干不同的事,符号推理只是其中一个被重新发现有用的模块。
八、结语:教科书里省略的那句话
符号学习没有被“取代”——它被整合了。
教科书之所以“一笔带过”,是因为它聚焦于当下“有效”的技术。但真正的技术进步,从来不是“新替代旧”的单线叙事,而是旧思想的精髓在新技术载体上的消化与重组。
今天的大语言模型能聊天、能写诗、能写代码、能做复杂系统架构设计、甚至能帮你完成工作,但面对“3.11和3.9哪个大”、“strawberry里有几个字母r”这种简单问题时仍然犯错,因为它只有直觉(模式匹配),缺乏严谨的逻辑推理能力。这就是为什么符号系统的设计思想每隔几年就会被重新提起——不是因为怀旧,是因为可解释的、精确的、可验证的推理能力在需要安全性和可靠性的场景里,至今没有完美的替代方案。
而且这种“混合使用”在工程实践中早就发生了。一个AI系统可能用神经网络做感知、用规则引擎做决策、用知识图谱做检索,哪个顺手用哪个。那些把技术路线当思想路线来拥护或攻击的言论,无论站在哪一边,都是把工具问题上升为信念问题,和“用政治经济学分析某款游戏的战斗胜率以揭示资本主义的剥削本质”共享同一种思维方式——把本该朴素的技术迭代,硬生生拔高成了世界观之争。
符号学习留下的最重要的技术遗产,不是那些过时的Prolog代码或Lisp函数,而是一个至今未被彻底解决的设计挑战:
当我们需要一个既能从数据中学习、又能进行严谨逻辑推导的系统时,这两个模块应该怎么分工?
这个问题,教科书的“一笔带过”没有回答,但符号学习三十年的探索,为这个问题积累了足够的经验和教训。这不是一段需要被哀悼的历史,这是一块依然在发挥作用的基石。
P.S. 本文无意回应任何针对图形学的政治经济学批判,那不在我的讨论范围内。