要理解人工神经网络这条线路的起点,得先理解一个奇怪的转译动作:把“神经元放电”翻译成“逻辑命题为真”。

1943 年,神经生理学家 Warren McCulloch 和当时只有十八岁、没有任何正式学位的逻辑天才 Walter Pitts,在《数理生物物理学通报》上发表了《神经活动中内在思想的逻辑演算》(A Logical Calculus of the Ideas Immanent in Nervous Activity)1。他们抓住了真实神经元的一个粗糙但关键的特征:神经元的放电是“全或无”(all-or-none)的——要么发放一个动作电位,要么不发放,没有中间状态。

既然输出只有 0 和 1,McCulloch 和 Pitts 就把神经元当成一个逻辑命题的真值:放电=真,静息=假。一个神经元接收若干输入,每个输入要么兴奋要么抑制,当兴奋输入的总和超过某个阈值、且没有抑制输入被激活时,它就放电。他们随后用纯粹的命题逻辑证明:把这种单元按合适的方式连接起来,可以实现任意逻辑函数——与、或、非,以及它们的任意组合2

这是一个分水岭式的论断。它意味着大脑的“思维”原则上可以被还原为一张逻辑电路图,也意味着“计算”和“神经活动”在数学上是同一种东西。冯·诺依曼后来在设计存储程序计算机时引用了这篇论文;自动机理论、计算神经科学、人工智能都把它当作奠基文献之一1

McCulloch-Pitts 神经元(下称 M-P 神经元)的数学形式极简。给定输入 x1,,xn{0,1}x_1, \dots, x_n \in {0,1},权重 w1,,wnw_1, \dots, w_n(在最初的版本里是固定的 ±1\pm 1),阈值 θ\theta,输出为

y={1,i=1nwixiθ0,否则y = \begin{cases} 1, & \sum_{i=1}^{n} w_i x_i \ge \theta \ 0, & \text{否则} \end{cases}

写成一个阶跃函数(Heaviside step)就是 y=H ⁣(iwixiθ)y = H!\left(\sum_i w_i x_i - \theta\right)

它能算逻辑“与”:两个输入、权重都为 1、阈值设为 2,只有两个输入都为 1 时和才达到 2。它能算“或”:阈值设为 1。它能算“非”:用一个抑制性输入。把这些拼起来,理论上任意布尔函数都能搭出来。

但 M-P 神经元有一个致命的留白:权重和阈值是人手工设定的,模型本身不会学习。它是一台需要工程师拧螺丝的逻辑机器,不是一台能从经验里自己拧螺丝的机器。让神经元“会学习”的那一步,要等到 Hebb 和 Rosenblatt。


1949 年,心理学家 Donald Hebb 在《行为的组织》里提出了一条后来被反复引用的学习原则,常被概括成一句口诀:“一起放电的神经元,会连在一起”(neurons that fire together, wire together)。用数学语言说,如果突触前神经元 xx 和突触后神经元 yy 经常同时激活,它们之间的连接权重 ww 就应该增强:

Δwxy\Delta w \propto x \cdot y

Hebb 规则第一次把“学习”定义成“权重的局部修改”,而且是一条只依赖局部信息(前后两个神经元的活动)的规则。这正是后来所有神经网络学习算法的雏形:学习 = 调权重。但 Hebb 规则本身是无监督的、没有“目标”的,它只会让经常共现的连接变强,不会朝某个任务目标去优化。

把“目标”引进来、并给出第一台真正可训练的机器的,是 Frank Rosenblatt。


Rosenblatt 是康奈尔大学训练出来的心理学家,1956 年拿到博士学位后进入康奈尔航空实验室(Cornell Aeronautical Laboratory)3。1957 年他做出第一个感知机(Perceptron)原型,1958 年在《心理学评论》(Psychological Review,第 65 卷 386–408 页)发表《感知机:大脑中信息存储与组织的概率模型》34

感知机与 M-P 神经元的根本区别在于:权重不再是手工设定的,而是从数据里学出来的。Rosenblatt 把它描述为第一个“精确指定、面向计算”的神经网络模型,并配上了一套受物理系统启发的可调参数与训练数学4。它不是一个纯软件概念——Mark I Perceptron 是一台真实的硬件机器,用一个 20×20 的光电管阵列做“视网膜”,用电位器(可变电阻)的旋转角度物理地存储权重,靠电机自动调节。这是历史上第一台“看着学”的机器。

感知机的前向计算和 M-P 神经元几乎一样,只是把阈值 θ\theta 挪到左边、记成偏置 b=θb = -\theta,并把权重并进一个向量 w\mathbf{w}

y^={1,wx+b00,否则\hat{y} = \begin{cases} 1, & \mathbf{w}^\top \mathbf{x} + b \ge 0 \ 0, & \text{否则} \end{cases}

真正的新东西是学习规则。给定一批带标签的样本 (xi,yi)(\mathbf{x}_i, y_i)yi{0,1}y_i \in {0,1},感知机逐个看样本,每看一个就比较自己的预测 y^i\hat{y}_i 和真实标签 yiy_i,按误差修正权重:

ww+η(yiy^i)xi,bb+η(yiy^i)\mathbf{w} \leftarrow \mathbf{w} + \eta,(y_i - \hat{y}_i),\mathbf{x}_i, \qquad b \leftarrow b + \eta,(y_i - \hat{y}_i)

其中 η>0\eta > 0 是学习率。这条规则的直觉非常清楚:

  • 如果预测对了(yi=y^iy_i = \hat{y}_i),误差项 (yiy^i)=0(y_i - \hat{y}_i) = 0,权重不动。
  • 如果该输出 1 却输出了 0(yiy^i=+1y_i - \hat{y}_i = +1),就把 xi\mathbf{x}_i 加到权重上——这会让下次 wxi\mathbf{w}^\top \mathbf{x}_i 变大,更可能越过阈值。
  • 如果该输出 0 却输出了 1(yiy^i=1y_i - \hat{y}_i = -1),就把 xi\mathbf{x}_i 从权重里减掉——下次更不容易越过阈值。

每一次“犯错”都把决策边界朝正确方向推一点。这就是“从错误中学习”最朴素的数学化身。


感知机最迷人的地方,是它带着一个理论保证:只要数据是线性可分的,这个朴素的纠错规则一定会在有限步内停下来,而且能算出停下来之前最多犯多少次错。这就是 1962 年由纽约大学数学家 Albert Novikoff 证明的感知机收敛定理56

把标签换成 {1,+1}{-1, +1} 更方便表述。假设存在一个单位向量 w\mathbf{w}^w=1|\mathbf{w}^| = 1)能以间隔(margin)γ>0\gamma > 0 把数据分开,即对所有样本

yi(wxi)γ>0y_i,(\mathbf{w}^{*\top}\mathbf{x}_i) \ge \gamma > 0

再设所有数据点的范数有界,xiR|\mathbf{x}_i| \le R。那么感知机(η=1\eta = 1、从零权重开始)犯错的总次数 MM 满足

M(Rγ)2M \le \left(\frac{R}{\gamma}\right)^2

证明只用到两个简单的不等式,思路非常优雅,值得完整走一遍。设 wk\mathbf{w}k 是犯了第 kk 次错之后的权重,每次犯错都做 wk=wk1+yixi\mathbf{w}{k} = \mathbf{w}_{k-1} + y_i \mathbf{x}_i

下界(投影在增长):考察 wk\mathbf{w}_k 在理想方向 w\mathbf{w}^* 上的投影。每犯一次错,

wwk=wwk1+yi(wxi)wwk1+γ\mathbf{w}^{\top}\mathbf{w}_k = \mathbf{w}^{\top}\mathbf{w}{k-1} + y_i,(\mathbf{w}^{\top}\mathbf{x}_i) \ge \mathbf{w}^{\top}\mathbf{w}{k-1} + \gamma

从零开始累加 MM 次,得到 wwMMγ\mathbf{w}^{\top}\mathbf{w}_M \ge M\gamma。由柯西-施瓦茨,wMwwMMγ|\mathbf{w}_M| \ge \mathbf{w}^{\top}\mathbf{w}_M \ge M\gamma

上界(范数长得慢):考察 wk\mathbf{w}k 自身的长度平方。每次犯错(犯错意味着 yi(wk1xi)0y_i(\mathbf{w}{k-1}^\top\mathbf{x}_i) \le 0),

wk2=wk12+2yi(wk1xi)+xi2wk12+R2|\mathbf{w}k|^2 = |\mathbf{w}{k-1}|^2 + 2 y_i(\mathbf{w}_{k-1}^\top\mathbf{x}_i) + |\mathbf{x}i|^2 \le |\mathbf{w}{k-1}|^2 + R^2

累加 MM 次得 wM2MR2|\mathbf{w}_M|^2 \le M R^2,即 wMMR|\mathbf{w}_M| \le \sqrt{M},R

合并MγwMMRM\gamma \le |\mathbf{w}_M| \le \sqrt{M},R,两边整理得 M(R/γ)2M \le (R/\gamma)^2。证毕。

这个界为什么重要?它说明收敛次数完全不依赖于数据的维度,也不依赖于样本的数量,只依赖于“几何上数据分得有多开”(间隔 γ\gamma)和“数据有多大”(半径 RR)。间隔越大、越好分,犯错越少。这是机器学习里第一个把“可学习性”量化成几何量的结果,是后来支持向量机(最大化间隔)和统计学习理论的思想先声。


理论保证带来了第一波过度乐观。Rosenblatt 本人和当时的媒体都对感知机做了大胆预言,《纽约时报》报道说海军期待这种机器未来能行走、说话、看、写、自我复制并意识到自己的存在。一时间感知机被当成通向人工智能的康庄大道。

但收敛定理有一个被乐观情绪盖住的前提,藏在那个 if 里:只要数据线性可分。如果数据不是线性可分的呢?定理什么都不保证——事实上,对线性不可分的数据,感知机的权重会永远来回震荡,不会停。

而“线性可分”这个前提,远比人们想象的脆弱。


1969 年,麻省理工学院的 Marvin Minsky 和 Seymour Papert 出版了《感知机》(Perceptrons)一书,用严密的代数和几何分析,系统地刻画了单层感知机能算什么、不能算什么7。其中最著名、杀伤力最大的一个例子,是逻辑“异或”(XOR)。

XOR 的真值表是:(0,0)0(0,0)\to 0(0,1)1(0,1)\to 1(1,0)1(1,0)\to 1(1,1)0(1,1)\to 0。把这四个点画在平面上,标签为 1 的两个点 (0,1)(0,1)(1,0)(1,0) 落在一条对角线上,标签为 0 的两个点 (0,0)(0,0)(1,1)(1,1) 落在另一条对角线上。没有任何一条直线能把“1 类”和“0 类”分到两边——这就是线性不可分8

而单层感知机的决策边界 wx+b=0\mathbf{w}^\top\mathbf{x} + b = 0 恰恰就是一条直线(高维里是一个超平面)。所以单层感知机在数学上不可能学会 XOR。这不是训练不够久或学习率没调好的问题,是表达能力的硬上限。

更要命的是,Minsky 和 Papert 还分析了一类需要“全局”信息的几何谓词(比如判断一个图形是否连通),论证了某些问题所需的感知机规模会随问题规模爆炸式增长。书的整体基调,给当时方兴未艾的神经网络研究泼了一盆冷水。

历史叙述里常说《感知机》一书“直接引发了第一次 AI 寒冬”——这个因果应当谨慎对待。这本书出版后不久,神经网络研究的资助和热情确实显著下降,进入了从 1970 年代初到 1980 年代初的低潮期8。但把整场寒冬归因于一本书,是把复杂的资助政治、学术派系、技术瓶颈简化成了一个戏剧性的转折点。比较稳妥的说法是:《感知机》给出了单层模型局限的权威论证,与当时本就存在的过度承诺落空、算力不足等因素叠加,共同促成了那段低潮。

值得强调的是另一个常被忽略的事实:Minsky 和 Papert 批判的是单层感知机。他们也清楚,多层网络原则上能突破线性局限——把多个感知机叠起来,第一层先把 XOR 变换到一个线性可分的新空间,第二层就能分开。书里对多层网络能否被有效训练持悲观态度,而这恰恰是问题的真正关键:缺的不是多层结构的想法,而是训练多层网络的算法。这个算法,就是反向传播——它的核心思想其实在《感知机》出版前后就已被一些人独立发现,却要等到 1986 年才真正改变历史。那是下一章的故事。


把这一章的数学落到能跑的代码上,最能体会“收敛”与“不收敛”的分野。下面是用纯 NumPy 写的感知机,逐样本在线更新,完全对应第三节的更新规则(完整文件见配套代码 code/01_perceptron.py,可直接运行):

代码 · 01_perceptron.py
展开代码 · 01_perceptron.py
"""
第 01 章配套代码:感知机(Perceptron)从零实现
Runnable with: numpy only.  python3 01_perceptron.py

复现 Rosenblatt 1958 在线学习规则 + Novikoff 1962 收敛性的经验验证。
演示:感知机能学线性可分(AND/OR),不能学 XOR(Minsky-Papert 1969)。
"""
import numpy as np

rng = np.random.default_rng(0)


def perceptron_train(X, y, lr=1.0, max_epochs=100):
    """Rosenblatt 在线感知机。y in {0,1}。
    更新规则:  w <- w + lr * (y_i - y_hat_i) * x_i ;  b <- b + lr*(y_i - y_hat_i)
    返回 (w, b, epochs_to_converge, mistake_count)。
    """
    n, d = X.shape
    w = np.zeros(d)
    b = 0.0
    mistakes = 0
    for epoch in range(max_epochs):
        errors = 0
        for i in range(n):
            y_hat = 1 if (X[i] @ w + b) >= 0 else 0
            update = lr * (y[i] - y_hat)
            if update != 0:
                w += update * X[i]
                b += update
                errors += 1
                mistakes += 1
        if errors == 0:
            return w, b, epoch + 1, mistakes
    return w, b, max_epochs, mistakes


def novikoff_bound(X, y):
    """Novikoff 1962 错误上界 (R/gamma)^2 的经验估计。
    用 {-1,+1} 标签找一个分隔超平面的 margin 下界(这里用已收敛的 w 近似)。
    """
    Xpm = X
    R = np.max(np.linalg.norm(Xpm, axis=1))
    return R


if __name__ == "__main__":
    # 线性可分: 逻辑 AND
    X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=float)
    y_and = np.array([0, 0, 0, 1])
    w, b, ep, mis = perceptron_train(X, y_and)
    print(f"[AND ] 收敛于 {ep} epoch, 共 {mis} 次错误更新, w={w}, b={b:.1f}")

    # 线性可分: 逻辑 OR
    y_or = np.array([0, 1, 1, 1])
    w, b, ep, mis = perceptron_train(X, y_or)
    print(f"[OR  ] 收敛于 {ep} epoch, 共 {mis} 次错误更新, w={w}, b={b:.1f}")

    # 线性不可分: XOR —— 不会收敛(Minsky-Papert 1969)
    y_xor = np.array([0, 1, 1, 0])
    w, b, ep, mis = perceptron_train(X, y_xor, max_epochs=100)
    print(f"[XOR ] 100 epoch 仍未收敛 (ep={ep}), 错误更新累计 {mis} 次 —— 线性不可分,感知机无解")

    # Novikoff 边界示意(R = 最大数据范数)
    R = novikoff_bound(X, y_and)
    print(f"[Novikoff] 数据最大范数 R={R:.3f}; 错误界 (R/gamma)^2 随 margin gamma 减小而增大")

↓ 下载 01_perceptron.py

import numpy as np

def perceptron_train(X, y, lr=1.0, max_epochs=100):
    n, d = X.shape
    w = np.zeros(d); b = 0.0; mistakes = 0
    for epoch in range(max_epochs):
        errors = 0
        for i in range(n):
            y_hat = 1 if (X[i] @ w + b) >= 0 else 0
            update = lr * (y[i] - y_hat)          # 误差项 (y - y_hat)
            if update != 0:
                w += update * X[i]                # w <- w + eta*(y-y_hat)*x
                b += update                       # b <- b + eta*(y-y_hat)
                errors += 1; mistakes += 1
        if errors == 0:                            # 一整轮无错 => 收敛
            return w, b, epoch + 1, mistakes
    return w, b, max_epochs, mistakes

X = np.array([[0,0],[0,1],[1,0],[1,1]], dtype=float)
print(perceptron_train(X, np.array([0,0,0,1])))   # AND
print(perceptron_train(X, np.array([0,1,1,0])))   # XOR

实际运行的输出是:

[AND ] 收敛于 6 epoch, 共 11 次错误更新, w=[2. 1.], b=-3.0
[OR  ] 收敛于 4 epoch, 共 5 次错误更新, w=[1. 1.], b=-1.0
[XOR ] 100 epoch 仍未收敛, 错误更新累计 398 次 —— 线性不可分,感知机无解

AND 和 OR 是线性可分的,感知机分别在 6 轮和 4 轮内停下,权重 w=[2,1],b=3\mathbf{w}=[2,1], b=-3 给出的边界 2x1+x23=02x_1 + x_2 - 3 = 0 确实把 (1,1)(1,1) 单独分到正侧。而 XOR 跑满 100 轮也停不下来,错误更新累计近四百次还在震荡——这正是 Novikoff 定理的反面:前提(线性可分)不成立,保证(有限步收敛)就消失。代码把 1969 年那个抽象的代数结论,变成了屏幕上一行永不收敛的计数。


用一张图把这一章的几何直觉钉死。下面是 XOR 四个点的布局(o 为类别 0,x 为类别 1):

 x2
  1 |  x(0,1)        o(1,1)
    |
    |       (任何一条直线都无法
    |        把 x 和 o 分到两侧)
  0 |  o(0,0)        x(1,0)
    +-------------------------- x1
       0              1

AND 的布局则是线性可分的——只有 (1,1)(1,1) 是类别 1,一条直线(如 2x1+x2=32x_1+x_2=3)就能把它从其余三点里切出来:

 x2
  1 |  o(0,1)        x(1,1)      边界 2*x1 + x2 = 3
    |             /              (右上角单独划出)
  0 |  o(0,0)  / o(1,0)
    +-------------------------- x1

配套的 manim 动画 assets/manim/ch01_perceptron.py(含 PerceptronLineXORImpossible 两个 Scene)把这件事演成几何:在 AND 上,一条分隔直线随权重更新而旋转、平移,最终把两类点干净分开;在 XOR 上,同一条直线无论怎么转、怎么移,总有一个点被切到错误的一侧。两段动画并排,就是感知机一生的隐喻——在它能分开的世界里,它优雅、可证明、必然收敛;在它分不开的世界里,它再努力也只是徒劳地震荡。

这台 1958 年的机器,第一次让“学习”成为可被数学保证的事,也第一次让我们看清:单一线性决策面的表达能力是有硬边界的。突破这个边界需要两样东西——更深的结构,和训练更深结构的算法。前者的想法早已存在,后者,将在十七年后以“反向传播”之名,把整个领域从寒冬里拉出来。


本质

感知机真正的贡献不是“模仿神经元”,而是把“学习”这件模糊的事变成了一个可证明的几何操作:在特征空间里找一个分隔超平面,并给出一条一定能找到它的更新规则。它的伟大与它的局限是同一件事——它只会画一条直线。能用一条直线分开的世界,它必然学得会且必然收敛;分不开的世界(哪怕简单如异或),它再努力也只是徒劳地震荡。此后六十年的整部神经网络史,本质上是在回答感知机留下的那一个问题:当一条直线不够用时,怎么把许多条直线叠成任意复杂的曲面。


参考文献

  1. McCulloch, W. S., & Pitts, W. (1943). A Logical Calculus of the Ideas Immanent in Nervous Activity. Bulletin of Mathematical Biophysics, 5, 115–133. 原文 PDF(CMU 镜像):https://www.cs.cmu.edu/~epxing/Class/10715/reading/McCulloch.and.Pitts.pdf ;Springer 记录:https://link.springer.com/article/10.1007/BF02478259

  2. “A Logical Calculus of the Ideas Immanent in Nervous Activity” — 综述与影响(含 von Neumann 引用、Pitts 生平)。Wikipedia:https://en.wikipedia.org/wiki/A_Logical_Calculus_of_the_Ideas_Immanent_in_Nervous_Activity

  3. Rosenblatt, F. (1958). The Perceptron: A Probabilistic Model for Information Storage and Organization in the Brain. Psychological Review, 65(6), 386–408. Cornell Aeronautical Laboratory. PsycNet 记录:https://psycnet.apa.org/record/1959-09865-001

  4. Rosenblatt 1958 原文 PDF(UIC 镜像):https://homepages.math.uic.edu/~lreyzin/papers/rosenblatt58.pdf ;MIT Press Ideas That Created the Future 评注:https://ieeexplore.ieee.org/document/9357585

  5. Novikoff, A. B. J. (1962). On Convergence Proofs for Perceptrons. 原始技术报告(DTIC AD0298258):https://apps.dtic.mil/sti/tr/pdf/AD0298258.pdf

  6. 感知机收敛定理证明(教学整理,含 (R/γ)² 界)。University of Waterloo CS480/680 讲义:https://cs.uwaterloo.ca/~y328yu/teaching/480/480-note-per.pdf ;Perceptron 综述:https://en.wikipedia.org/wiki/Perceptron

  7. Minsky, M., & Papert, S. (1969). Perceptrons: An Introduction to Computational Geometry. MIT Press. 综述:https://en.wikipedia.org/wiki/Perceptrons_(book)

  8. “Perceptrons, XOR, and the first AI winter”(XOR 线性不可分性与寒冬背景,二手综述,含史料梳理)。Sean Trott:https://seantrott.substack.com/p/perceptrons-xor-and-the-first-ai ;“The Perceptron Controversy”(优先权与争议梳理):https://yuxi-liu-wired.github.io/essays/posts/perceptron-controversy/

解剖单个神经元:输入扇出连线绿正红负、亮度=|权重|,σ(Σwᵢaᵢ+b) 逐项与连线同色同步高亮,权重三视图(连线/数值列表/像素模式)并置,再用 sigmoid 曲线把加权和 z=1.70 挤进激活 a=0.85,最后退化为 1943 形式神经元的硬阈值。
把神经元放进二维特征空间:决策边界 wᵀx+b=0 是一条直线,在线学习每遇错分点(闪 accent)就按 w←w+η(y−ŷ)x 旋转/平移直线,直到把 AND 四点干净分开,并给出 Novikoff 收敛界 M≤(R/γ)²。
XOR 同类置于对角,直线绕原点转一圈始终切错——单层表达力硬上限与 1969 第一次寒冬;随后加一个隐藏层 h=σ(W₁x+b₁) 把四点折叠进新坐标,使原本不可分的两类在新空间被一条直线分开,引向多层网络与下一章反向传播。