从 1956 年到 1993 年,人工智能起落了两轮半:两次热潮、两次寒冬。 热潮的推手是「这条路看起来能走通」,寒冬的原因是「走到底发现走不动」。 这一节把两轮起落的技术原因各量一遍。 第一次寒冬的核心证据是单层感知器连异或都学不会——这个结论 1969 年被算清楚, 今天用二十行代码可以自己复现。
上一节把「人工智能」这个词拆成了名字、判据和 AI 效果三件事。 这一节接着往下走:第一批程序长什么样,它们为什么先赢后输。 本节量的是单层感知器的能力边界,第 5 章的「神经网络」会讲怎么越过这条边界。
一、1956 到 1974:乐观的十八年
达特茅斯会议之后,第一批程序很快就出来了。 1956 年纽厄尔和西蒙写了「逻辑理论家」,能把《数学原理》里的命题逻辑定理一条条证出来。 1957 年同一批人又写了通用问题求解器 GPS。 这些程序的路子今天看很朴素:把问题写成状态,把操作写成规则,然后搜索。证明定理就是从公理出发, 一步步试,试到目标为止。它们在小问题上表现惊人,于是预言就来了。 西蒙 1965 年说:二十年内,机器能做人能做的一切工作。明斯基 1970 年说: 一代人之内,创造人工智能的问题会基本解决。这两个预言都没实现,但它们定义了那个年代的乐观基线。 乐观是有底气的。 那十八年里,计算机从真空管走到集成电路,内存从几 KB 涨到几十 KB, 每一次涨都让「多搜几层」变得可行一点。所有人都在等下一次涨。
二、感知器:第一次让机器自己学
1958 年,罗森布拉特在康奈尔做出了感知器,还造了硬件版 Mark I。 它的意义和前面的程序完全不同:前面的程序是人把知识写进去,感知器是给它例子,让它自己调权重。 规则简单到一句话:猜错了就把权重往正确方向推一点。
e = t - y # 目标减输出,错多少
w[0] += e * x[0]
w[1] += e * x[1]
b += e
这一行 w += e * x 是机器学习真正的起点。它第一次把「学习」变成了一个可执行的动作,
而不是一个哲学词。
罗森布拉特当时的话很大:
感知器最终能学会认人、能读、能自己造出更聪明的后代。《纽约时报》1958 年报道说,
海军期望它能「走路、说话、看、写、自我复制并意识到自己的存在」。
从「按规则搜索」到「按例子调参」,这一步跨得很远。但它的适用范围有一个硬边界,
1969 年被算清楚了。
三、1969 年那本书,和第一次寒冬
1969 年,明斯基和佩珀特出了《感知器》一书。 书里做了一件很朴素的事:把单层感知器能表示的函数全部算清楚,然后指出有一类它表示不了。 这类函数里最小的那个叫异或。它的真值表只有四行:两个输入不同时输出 1,相同时输出 0。
| x1 | x2 | 异或 | 同或 |
|---|---|---|---|
| 0 | 0 | 0 | 1 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
| 四个点画在平面上,两个 1 在对角,两个 0 在另一条对角。任何一条直线都不可能把这两组分开—— | |||
| 这就是「线性不可分」的几何含义。 | |||
| 书里还有更狠的一句: | |||
| 多层网络的问题「无意义」(non-trivial),不值得研究。 | |||
| 这句话被广泛解读成「神经网络这条路不通」,加上当时算力确实不够训练多层网络,资金和注意力一起撤了。 | |||
| 寒冬还有别的推手。 | |||
| 英国的 Lighthill 报告(1973)认为 AI 的成果只是「玩具」,英国政府随即大面积砍经费; | |||
| 美国 DARPA 也收紧了自由探索类项目的钱。1974 到 1980 年,第一次寒冬。 | |||
| 要说清楚一点:明斯基的数学没有错,异或确实不可分。错的是那句「不值得研究」—— | |||
| 它把一个技术结论(单层不行)说成了路线结论(这条路不行)。 | |||
| 这两者之间的距离,就是那二十年。 |
四、专家系统:第二次热潮
第一次寒冬里活下来的是另一条路: 不追求通用,只解决一个窄领域,但要做到专家水平。这就是专家系统。
| 系统 | 年份 | 干什么 | 结果 |
|---|---|---|---|
| DENDRAL | 1965 | 从质谱图反推有机分子结构 | 第一个真正的专家系统 |
| MYCIN | 1976 | 诊断血液感染并推荐抗生素 | 准确率约 69%,超过当时的一般医生 |
| XCON | 1980 | 给 DEC 的 VAX 机器配硬件 | 据 DEC 称每年省下数千万美元 |
| 它们的做法是把专家的判断写成 IF-THEN 规则,再加一个推理机去串。 | |||
| MYCIN 里有四百多条规则,每条都是「如果培养皿里长的是革兰氏阴性菌、且病人是免疫抑制状态, | |||
| 那么强烈怀疑绿脓杆菌」。 | |||
| 这条路在商业上真赚到钱了。1980 年代日本还搞了「第五代计算机」国家计划,砸了五亿多美元, | |||
| 目标是造出能跑大规模知识库的机器。 | |||
| 第二次热潮的规模比第一次大得多,因为它有产品、有客户、有收入。 |
五、第二次寒冬:知识从哪来
专家系统撞上的墙,不是算法,是知识。这个问题后来被命名为「知识获取瓶颈」。 第一层麻烦是专家说不出自己怎么判断。 你问一个有二十年经验的放射科医生「这张片子你为什么觉得有问题」,他多半会说「就是看着不对」。 能写进 IF-THEN 的,永远只是他知道的那一小部分。 第二层麻烦是规则一多就打架。四百条规则改一条,可能让另外几十条推不出结论; 几千条规则的库,没人能说清它到底会推出什么。维护成本随规则条数超线性增长。 第三层麻烦是它不会举一反三。MYCIN 能诊断血液感染,你把它搬到尿路感染上,全部规则要重写。 它学到的不是「感染」这个概念,是一堆具体情形到结论的映射。 1987 年前后,专门跑 LISP 的机器市场崩了——通用工作站变快了,专机不再划算。 加上日本第五代计划没能交出承诺的东西,第二次寒冬来了,一直持续到 1993 年前后。 两次寒冬的共同点值得记下来:都不是「AI 不行」,是「这一条路的成本结构撑不住了」。 第一次是算力不够 + 表达力不够;第二次是知识的人工成本太高。
六、第三次热潮:换了个方向
第三次热潮的起点不在「更聪明的推理」,而在「让机器自己从数据里找规则」。 这条路 1958 年就有了,只是当时叫感知器,被埋在寒冬里。 2006 年,辛顿等人提出用逐层预训练来训练深层信念网络,第一次让「很多层」变得可训。 2012 年,AlexNet 在 ImageNet 图像识别比赛上把 top-5 错误率从 26.2% 压到 15.3%, 第二名用的是传统特征工程。 那一年之后,第三次热潮不再是学术话题,它变成了产业。而它的推动力和前两次完全不同—— 不是更好的推理机,是三样东西同时到位: 海量的数据、便宜的并行算力、能训深的算法。这三样是下一节的主题。 这里先把两次寒冬的教训收一句:每次寒冬都不是因为「智能太难」, 是因为某一种表达方式的成本突然超过了它能带来的收益。 下一次寒冬(如果来的话)也会是这个形状,不会是因为「机器突然变笨了」。
七、动手 Demo:感知器的能力边界:十六个布尔函数,它学得会几个
这一节把 1969 年那本书里的结论自己跑一遍。用 Rosenblatt 的原版规则,不加任何技巧, 看它在异或上到底能不能收敛。 然后把它推到极限:二元布尔函数一共十六个,逐个试,看哪几个是单层感知器永远学不会的。 最后手算一组两个隐单元的权重,证明「存在解」和「找得到解」是两件事。
X = ((0.,0.),(0.,1.),(1.,0.),(1.,1.))
def step(v): # 一过阈值就翻成 1
return 1.0 if v > 0 else 0.0
def train(fn, seed, epochs=800): # Rosenblatt 规则:错了就改
rg = random.Random(seed)
w = [rg.uniform(-1,1), rg.uniform(-1,1)]
b = rg.uniform(-1,1)
for _ in range(epochs):
for x in X:
e = fn(x) - step(w[0]*x[0] + w[1]*x[1] + b)
if e:
w[0] += e*x[0]
w[1] += e*x[1]
b += e
return w, b
# 十六个二元布尔函数:四位真值表就是一个函数
for k in range(16):
bits = tuple((k >> (3-i)) & 1 for i in range(4))
fn = make_fn(bits)
hit = sum(1 for s in range(50) if ok(*train(fn, s), fn))
print(''.join(str(v) for v in bits), hit, '/ 50')
实跑输出:
--------------------------------------------------------------------
感知机能学什么、学不了什么
--------------------------------------------------------------------
==============================================================
[1] 一个神经元:一次加权求和,再过一道阈值
y = step(w1 * x1 + w2 * x2 + b)
step(v) = 1 当 v > 0,否则 0
它把平面切成两半,一半输出 1,一半输出 0。
分界线是那条 w1 * x1 + w2 * x2 + b = 0 的直线。
所以它能画出的边界,永远是一条直线——这是它的全部本事。
[2] 拿它去学异或:八个初值,每个跑 800 轮
初值种子 末轮四点输出 训练集全对 权重漂到哪
0 1100 否 w=(-1.31, -0.48) b=+0.84
1 1100 否 w=(-0.73, -0.31) b=+0.53
2 1100 否 w=(-1.09, -0.10) b=+0.11
3 1100 否 w=(-1.52, +0.09) b=+0.74
4 1000 否 w=(-1.53, -0.79) b=+0.79
5 1100 否 w=(-0.75, -0.52) b=+0.59
6 1100 否 w=(-1.41, -0.36) b=+0.97
7 1000 否 w=(-0.35, -0.70) b=+0.30
八个初值,收敛 0 个。
不是「这一次运气不好」——换初值、加轮数、调学习率,都还是这个结果。
[3] 不是没训够,是四个约束本身矛盾
把四点写成不等式(step 在 0 处取 0,所以「输出 1」要求严格大于 0):
(0,0) → 0 b ≤ 0
(0,1) → 1 w2 + b > 0
(1,0) → 1 w1 + b > 0
(1,1) → 0 w1 + w2 + b ≤ 0
第 2、3 条加起来是 w1 + w2 + 2b > 0;
第 4 条说 w1 + w2 + b ≤ 0,也就是 w1 + w2 ≤ -b;
两条一挤:-b + 2b > 0,于是 b > 0。
可第 1 条明明白白写着 b ≤ 0。矛盾——所以这四条永远不可能同时成立。
在 [-10, 10] 里随机撒 200000 组 (w1, w2, b):
满足第 1 条 99985 组,50.0%
满足前 3 条 8313 组,4.2%
四条全满足 0 组
前三条不算稀罕,随便撒点就能撞上一批;
第四条一加上去,整个空间被清空。这就是「线性不可分」的字面意思。
[4] 十六个二元布尔函数,能学的是哪几个
真值表 名字 50 个初值里收敛 结论
0000 恒 0 50 / 50 线性可分
0001 与 50 / 50 线性可分
0010 — 50 / 50 线性可分
0011 — 50 / 50 线性可分
0100 — 50 / 50 线性可分
0101 — 50 / 50 线性可分
0110 异或 0 / 50 线性不可分
0111 或 50 / 50 线性可分
1000 或非 50 / 50 线性可分
1001 同或 0 / 50 线性不可分
1010 — 50 / 50 线性可分
1011 — 50 / 50 线性可分
1100 — 50 / 50 线性可分
1101 — 50 / 50 线性可分
1110 与非 50 / 50 线性可分
1111 恒 1 50 / 50 线性可分
十六个函数,14 个能被单个感知器学会,2 个学不会。
学不会的正好是那两个「输入相同就必须不同输出」的:异或、同或。
1969 年 Minsky 和 Papert 把这件事故意算清楚,
它成了第一次寒冬的技术注脚——不是 AI 骗人,是边界被量出来了。
[5] 但加两个隐单元,解就存在了
两个隐单元,一个算「与」,一个算「或」:
h1 = step( 1 * x1 + 1 * x2 - 1.5 ) 只有 (1,1) 得 1
h2 = step( 1 * x1 + 1 * x2 - 0.5 ) 除 (0,0) 都得 1
y = step( -1 * h1 + 1 * h2 - 0.5 ) 或减与 = 异或
输入 h1(与) h2(或) 输出 期望
(0, 0) 0 0 0 0
(0, 1) 0 1 1 1
(1, 0) 0 1 1 1
(1, 1) 1 1 0 0
四点全对。参数一共 9 个:W1 四个、b1 两个、W2 两个、b2 一个。
注意:这 9 个数是我手算凑出来的,不是训练出来的。
「存在解」和「能找到解」是两件事——中间隔着一层,
叫「怎么把误差分配回隐层」。这门课第 5 章会正面回答它。
从 1958 年感知器发表,到 1986 年反向传播普及,中间隔了二十八年。
这二十八年里,卡住所有人的不是「网络不够大」,是这一句:
隐层的单元不对应任何标签,那它们的误差该算谁的?
第一段先把感知器说清楚。它只做两件事:加权求和、过阈值。几何上它画一条直线,把平面切成两半。
注意 step(v) 在 v 等于 0 时返回 0,
所以「输出 1」要求严格大于零——这条细节会在第三段变成关键。
第二段用八个不同的随机初值各跑 800 轮,收敛 0 个。八行的末轮输出全是 1100 或 1000,
也就是说它把所有该输出 1 的点都判成 1 了,代价是把 (1,1) 也判成 1。
它找到的是一条「或」的边界,因为「或」就在它够得着的地方。
注意看「权重漂到哪」那一列:w 和 b 每次都停在不同位置。
这不是收敛,是振荡——它在两个都不对的解之间来回跳,每跳一次都被下一个样本纠正回来。
第三段是这一节的核心。四个点写成四条不等式,第 2、3 条加起来得到w1 + w2 + 2b > 0,
第 4 条给出 w1 + w2 ≤ -b,两条一挤就是 b > 0,而第 1 条写的是 b ≤ 0。
矛盾是纯代数的,跟训练轮数、学习率、初值全都无关。
随机撒 20 万组参数这一行是为了让「矛盾」有体积。满足第 1 条的占 50.0%,
满足前三条的占 4.2%——不稀罕。四条一起满足的是 0 组。空间被清空了,这比任何训练曲线都硬。
第四段把范围推到全部十六个函数。结果是 14 个 50/50 全收敛,2 个 0/50 一个都不收敛。
这两个正好是异或和同或:真值表沿两条对角线各是一种值,而两条对角线之间相反。
顺带一个能记住的数:16 个里 14 个可分。所以单层感知器不是「不行」,是「行 87.5%」。
明斯基那句话的杀伤力,来自剩下那 12.5% 恰好是所有有意思的问题的起点。
第五段手算了一组解。两个隐单元,一个算「与」(只有 (1,1) 得 1),
一个算「或」(除 (0,0) 都得 1),输出层做「或减与」,正好是异或。九个参数,四点全对。
但这段代码里没有一个数是被训练出来的。这九个参数是我拿笔凑的。
「存在解」和「能找到解」之间隔着一层,叫「隐层的误差该算谁的」——1958 年到 1986 年,
二十八年就卡在这一句上。
30 秒实验
- 把
epochs从 800 改成 80000,重跑第二段。 收敛数还是 0,末轮输出还是1100。这一行能让你彻底放弃「是不是轮数不够」这个念头。 - 把训练规则里的
e = fn(x) - step(...)改成e = (fn(x) - step(...)) * 0.1, 也就是把学习率调小十倍,重跑。权重停的位置会变,收敛数还是 0。 - 在第四段的循环里把
range(50)改成range(500),看那 14 个函数是不是还是 500/500。 如果某个掉下来了,说明是初值撞上了坏区域,这跟「不可分」是两回事,别混。
常见误区
- 以为明斯基证明了「神经网络不行」。他证明的是「单层不行」,顺带说了一句多层「不值得研究」。 前一句是数学,后一句是判断。数学没错,判断错了二十年。
- 以为感知器的失败是因为学习率或轮数没调好。第三段那四条不等式里没有轮数、没有学习率、 没有初值。它们是代数关系,任何超参数都改不了它。
- 以为专家系统失败了。MYCIN 的准确率超过当时的一般医生,XCON 真给 DEC 省了钱。 它失败的地方是「搬到第二个领域」,而产品只要守着一个领域就能活着。
- 以为两次寒冬是外行唱衰造成的。两次都是内行先算清了成本:第一次是算力和表达力不够, 第二次是知识的人工成本太高。唱衰只是结果,不是原因。
自测三问(点开对答案)
1. 为什么异或用单个感知器学不会?用一句话说清,别用「线性不可分」四个字糊过去。 —— 因为异或要求:两个输入相同时输出 0、不同时输出 1。 四点摆成正方形,两个 1 在对角、两个 0 在另一条对角。 **感知器只能画一条直线,而一条直线无论怎么摆,都无法让两个对角点在同一侧、** **另两个对角点在另一侧。**代数的说法是四条不等式互相矛盾,解集为空。 2. 十六个二元布尔函数里,单层感知器能学会几个?这个数字该怎么理解? —— 14 个。 **这个数字说明感知器并不弱——它的覆盖率是 87.5%。**但剩下那两个(异或、 同或)恰好是所有「需要组合两个条件」的问题的最小模型,而现实里的判断几乎都是组合的。 **所以「87.5% 的覆盖率」和「0% 的实用价值」可以同时成立。** 3. 「存在解」和「找得到解」差在哪? —— 存在解是数学问题:给定结构,问有没有一组参数能让所有样本都对。 找得到解是算法问题:给定结构和数据,问怎么一步步走到那组参数。 **异或加两个隐单元,解是存在的(九个参数就能写出来),** **但 1969 年没有人知道怎么把误差分给隐层。**这一步要等反向传播。两次寒冬之后,第三次热潮靠的不是更聪明的推理,是三样东西同时到位。 下一节把这三样拆开,一样一样砍给你看。
- ☐ (本节完,下一节 1.3 人工智能的发展)
相关笔记
- 人工智能
- 人工智能的发展
- 神经网络
- 41 课 · 图解深度学习(第 2 章把反向传播推到底)
- 📘 图解人工智能 · 索引