一个神经元只做两件事:把输入加权求和,再把结果过一个弯的函数。z = w·x + b,输出 f(z)。 把 f 取成阶跃(大于 0 输出 1,否则 0), 它就变成了感知器——神经网络史上第一个能「学」的模型。 这一节的 Demo 用三组权重让它变成三个逻辑门: AND、OR 的 w 完全一样,只差 b;NAND 是把 AND 的 w 和 b 整个取负。
第 3 章跑通了完整流程,但那是「黑箱」。从这一节开始拆——一层一层拆到最里面那个乘法。 4.1 到 4.4 是一条线:神经元 → 激励函数 → 学习规则 → 多层网络。 50 年代到 80 年代的研究史,正好是这四节。 如果 1.1 节记住了「33 个参数的两层网络」,这一节就是那 33 个参数里的一个。
一、一个神经元
输入是一串数 x₁、x₂、…、xₙ,参数是权重 w₁、w₂、…、wₙ 和一个偏置 b。 先算加权和:z = Σ wᵢxᵢ + b,写成向量就是 z = w·x + b。 再把它过一个函数 f:a = f(z)。这个 f 叫激励函数,4.2 节专门讲。 几何上,z = 0 是一条直线(高维里是超平面)。 z 的符号告诉你「这一点在直线的哪一侧」,z 的大小告诉你「离直线多远」。 所以一个神经元天然就是一个线性分类器。
二、感知器:把 f 取成阶跃
1958 年 Rosenblatt 的感知器,f 是最简单的阶跃函数:z 大于 0 输出 1,否则输出 0(也有用 -1 的版本, 本质一样)。 它的学习规则只有一句话: 判对了什么都不做,判错了就把 w 往正确方向推一点。公式是 w ← w + η(t - y)x,η 是学习率, t 是正确答案,y 是当前输出。 这个规则朴素得不像话,但它有个漂亮的保证: 只要数据线性可分,它一定能在有限步内找到一组能分开的权重。这个结论叫感知器收敛定理。 注意后半句——「只要线性可分」。不可分的时候会发生什么,4.4 节的 XOR 会给出答案。
三、三个门,一组参数
AND:两个都是 1 才输出 1。取 w = (0.5, 0.5)、b = -0.7,只有 (1,1) 时 z = 0.3 大于 0。 OR:有一个 1 就输出 1。w 完全不用改,只把 b 从 -0.7 抬到 -0.2,(1,0) 时 z = 0.3 就过线了。 NAND:AND 取反。把 w 和 b 全部乘 -1,(1,1) 时 z = -0.3,输出 0,其余全是 1。 这三组数说明一件事:逻辑功能不在「结构」里,在「参数」里。同一个神经元,换一组数就是另一个门。
四、单个神经元的边界
一个神经元的判别边界永远是 w·x + b = 0,一条直线。 它能表达的函数类,就是「能用一条直线分开的那些」。 AND、OR、NAND 都能用一条直线分开——把四个点画在平面上,要分开的那一类确实在同一侧。 XOR 不能。 它的两类点在对角线上交错,任何直线都只能切出一种结果。这不是「还没训好」, 是「这个模型里根本没有解」。
五、「区别狗与猫」为什么难
书里 4-4 节一上来就问:怎么让机器认出狗和猫? 一张 256×256 的彩色图是 196608 个数。 要在这个空间里用一个超平面把狗和猫分开,等于要求「所有狗都落在超平面这一侧」——显然不成立。 所以真实任务从来不靠单个神经元。 要么加层(第 5 章的卷积),要么换特征(把图变成「有没有耳朵」这种数)。深度学习的路线是前者。
六、动手 Demo:三个逻辑门,一组权重
写一个最小的感知器:算 z = w·x + b,大于 0 输出 1。 然后换三组 (w, b),把 AND、OR、NAND 的真值表一次打出来。
import numpy as np
def neuron(x, w, b):
z = float(np.dot(w, x)) + b
return 1 if z > 0 else 0, z
gates = [("AND", (0.5, 0.5), -0.7),
("OR", (0.5, 0.5), -0.2),
("NAND", (-0.5, -0.5), 0.7)]
for x1 in (0, 1):
for x2 in (0, 1):
out = [str(neuron((x1, x2), w, b)[0]) for _nm, w, b in gates]
print(x1, x2, " ".join(out))
实跑输出:
--------------------------------------------------------------------
神经元与感知器:三个逻辑门,一组权重
--------------------------------------------------------------------
一个感知器:z = w·x + b,z 大于 0 输出 1,否则输出 0。
换三组权重,它就成了三个不同的逻辑门。
x1 x2 AND OR NAND
-------------------------
0 0 0 0 1
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
三组权重的差别只在数值:
AND w = (+0.5, +0.5) b = -0.7
OR w = (+0.5, +0.5) b = -0.2
NAND w = (-0.5, -0.5) b = +0.7
**注意 OR 和 AND 的 w 完全一样,只有 b 不同。**
b 决定了门槛高低:b = -0.7 要两个都是 1 才过(0.5+0.5-0.7 = 0.3);
b = -0.2 只要有一个是 1 就过(0.5-0.2 = 0.3)。
NAND 是把 AND 的权重和偏置整个取负——**取反这件事,在权重上就是乘 -1。**
所以「NAND 能表示的功能 = AND 取反」不是巧合,是一条可以直接算出来的关系。
三列结果:AND 只在 (1,1) 输出 1;OR 有三个 1;NAND 恰好和 AND 相反。 三张真值表加起来,只用了两个不同的 w 和三个不同的 b。 AND 和 OR 的 w 一模一样,只差 b: -0.7 要两个都是 1 才够(0.5+0.5-0.7=0.3),-0.2 有一个 1 就够(0.5-0.2=0.3)。 门槛高低就是 b 的作用。 NAND 是 AND 的整体取负。 「取反」在权重上就是乘 -1,这件事在数学上很平凡,但在电路里意义重大——NAND 是万能的, 任何逻辑电路都能只用 NAND 搭出来。 这三行数是后面所有内容的起点。 多层网络里每一个神经元,做的都是这件事,只是 w 不再由人指定,而是由数据学出来。
30 秒实验
- 把 AND 的 b 从 -0.7 改成 -0.5,真值表会变吗?改成 -1.0 呢?(提示:看 (1,1) 那行的 z 值)
- 找一个 w 和 b,让这个神经元实现「两个输入相同才输出 1」(XNOR)。试试看能不能找到。
- 把阶跃换成「z 大于 0.3 才输出 1」,AND 的 b 该改成多少?
常见误区
- 以为神经元在「识别特征」。单个神经元只是在算一个加权和,它的全部能力就是把空间切一刀。 所谓「识别」,是多层组合出来的效果。
- 以为感知器能学会任何东西。它只能学会线性可分的。 XOR 就是它的天花板,这一点 1969 年被证明,也是第一次寒冬的起点。
- 把偏置 b 当成可有可无的常数。没有 b,判别边界必须过原点,大量数据分不开。 b 决定的是「门槛」,和 w 一样是要学的参数。
自测三问(点开对答案)
1. 一个神经元在几何上做了什么? —— 算 w·x + b,然后看符号。 z = 0 是一条直线(超平面),z 的符号决定点在直线的哪一侧,所以它就是一个线性分类器。 2. AND 和 OR 为什么可以共用一组 w? —— 因为它们的 w 都是 (0.5, 0.5),区别只在门槛 b。 AND 要两个 1 才过线(b=-0.7),OR 有一个 1 就过(b=-0.2)。 3. NAND 为什么被称为「万能门」? —— 因为任何逻辑函数都能只用 NAND 组合出来。 数学上,AND、OR、NOT 都能用 NAND 表示,而它们三个是完备集。一个神经元的能力到此为止。下一节看那个「弯一下」的函数——它的形状决定了网络能不能训得动。
- ☐ (本节完,下一节 4.2 激励函数)