📘 第1章 人工智能的过去、现在和未来
📄 一句话概括

从 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 秒实验

  1. 把 epochs 从 800 改成 80000,重跑第二段。 收敛数还是 0,末轮输出还是 1100。这一行能让你彻底放弃「是不是轮数不够」这个念头。
  2. 把训练规则里的 e = fn(x) - step(...) 改成 e = (fn(x) - step(...)) * 0.1, 也就是把学习率调小十倍,重跑。权重停的位置会变,收敛数还是 0。
  3. 在第四段的循环里把 range(50) 改成 range(500),看那 14 个函数是不是还是 500/500。 如果某个掉下来了,说明是初值撞上了坏区域,这跟「不可分」是两回事,别混。

常见误区

  1. 以为明斯基证明了「神经网络不行」。他证明的是「单层不行」,顺带说了一句多层「不值得研究」。 前一句是数学,后一句是判断。数学没错,判断错了二十年。
  2. 以为感知器的失败是因为学习率或轮数没调好。第三段那四条不等式里没有轮数、没有学习率、 没有初值。它们是代数关系,任何超参数都改不了它。
  3. 以为专家系统失败了。MYCIN 的准确率超过当时的一般医生,XCON 真给 DEC 省了钱。 它失败的地方是「搬到第二个领域」,而产品只要守着一个领域就能活着。
  4. 以为两次寒冬是外行唱衰造成的。两次都是内行先算清了成本:第一次是算力和表达力不够, 第二次是知识的人工成本太高。唱衰只是结果,不是原因。
自测三问(点开对答案) 1. 为什么异或用单个感知器学不会?用一句话说清,别用「线性不可分」四个字糊过去。 —— 因为异或要求:两个输入相同时输出 0、不同时输出 1。 四点摆成正方形,两个 1 在对角、两个 0 在另一条对角。 **感知器只能画一条直线,而一条直线无论怎么摆,都无法让两个对角点在同一侧、** **另两个对角点在另一侧。**代数的说法是四条不等式互相矛盾,解集为空。 2. 十六个二元布尔函数里,单层感知器能学会几个?这个数字该怎么理解? —— 14 个。 **这个数字说明感知器并不弱——它的覆盖率是 87.5%。**但剩下那两个(异或、 同或)恰好是所有「需要组合两个条件」的问题的最小模型,而现实里的判断几乎都是组合的。 **所以「87.5% 的覆盖率」和「0% 的实用价值」可以同时成立。** 3. 「存在解」和「找得到解」差在哪? —— 存在解是数学问题:给定结构,问有没有一组参数能让所有样本都对。 找得到解是算法问题:给定结构和数据,问怎么一步步走到那组参数。 **异或加两个隐单元,解是存在的(九个参数就能写出来),** **但 1969 年没有人知道怎么把误差分给隐层。**这一步要等反向传播。

两次寒冬之后,第三次热潮靠的不是更聪明的推理,是三样东西同时到位。 下一节把这三样拆开,一样一样砍给你看。

相关笔记