本文从几何、数学证明、代码验证三个角度,彻底搞清楚这个深度学习史上最经典的问题。
1. 什么是异或(XOR)?
异或是一个逻辑运算,规则只有一句话:相同为 0,不同为 1。
| 输入 x₁ | 输入 x₂ | 异或输出 |
|---|---|---|
| 0 | 0 | 0(相同 → 0) |
| 0 | 1 | 1(不同 → 1) |
| 1 | 0 | 1(不同 → 1) |
| 1 | 1 | 0(相同 → 0) |
2. 什么是感知机?
感知机是最简单的神经网络,只有一个神经元,做的事情是:
ini
z = x₁ × w₁ + x₂ × w₂ + b
输出 = 1(如果 z > 0)
输出 = 0(如果 z ≤ 0)
其中:
x₁, x₂是输入w₁, w₂是权重(训练中学习)b是偏置(训练中学习)
训练的过程就是调整 w₁、w₂、b 这三个旋钮,试图让所有样本都分类正确。
3. 感知机能解决什么问题?
AND(与)问题 ✅
| x₁ | x₂ | AND |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
取 w₁=1, w₂=1, b=-1.5,验证:
ini
(0,0): 0+0-1.5 = -1.5 ≤ 0 → 输出 0 ✅
(0,1): 0+1-1.5 = -0.5 ≤ 0 → 输出 0 ✅
(1,0): 1+0-1.5 = -0.5 ≤ 0 → 输出 0 ✅
(1,1): 1+1-1.5 = +0.5 > 0 → 输出 1 ✅
OR(或)问题 ✅
取 w₁=1, w₂=1, b=-0.5,验证:
ini
(0,0): 0+0-0.5 = -0.5 ≤ 0 → 输出 0 ✅
(0,1): 0+1-0.5 = +0.5 > 0 → 输出 1 ✅
(1,0): 1+0-0.5 = +0.5 > 0 → 输出 1 ✅
(1,1): 1+1-0.5 = +1.5 > 0 → 输出 1 ✅
AND 和 OR 都没问题。但异或呢?
4. 为什么异或不行?------ 几何视角
感知机 = 画一条直线
x₁w₁ + x₂w₂ + b = 0 是一个关于 x₁、x₂ 的一次方程,在平面上就是一条直线。
- 直线上方:z > 0 → 输出 1
- 直线下方:z ≤ 0 → 输出 0
训练感知机 = 不断调整 w₁、w₂、b = 不断旋转和平移这条直线。
AND 和 OR 为什么能解决?
AND 问题:只有 (1,1) 输出 1

线的右上方只有 ●(1,1),其余 ○ 都在左下方 ✅
OR 问题:只有 (0,0) 输出 0

线的左下方只有 ○(0,0),其余 ● 都在右上方 ✅
XOR 问题:对角分布

无论直线怎么放,总有一边同时包含 ● 和 ○ ❌
异或为什么不行?
makefile
XOR:
x₂
1 │ ●(0,1) ○(1,1)
│
│
│
0 │ ○(0,0) ●(1,0)
└──────────────────── x₁
0 1
● 在对角线上(左上、右下),○ 也在对角线上(左下、右上)。
请尝试画一条直线,把所有 ● 放一边、所有 ○ 放另一边:
尝试 1(横切): 尝试 2(竖切): 尝试 3(斜切):
● ○ ● │ ○ ● ╲ ○
───────── ❌ │ ❌ ╲ ❌
○ ● ○ │ ● ○ ╲ ●
上面有●有○ 左边有●有○ 每边都有●有○
无论直线怎么放,总有一边同时包含 ● 和 ○。这就是"线性不可分"。
5. 严格数学证明
假设存在 w₁、w₂、b 能让感知机正确分类异或的所有样本,则必须同时满足:
less
① (0,0)→0: b ≤ 0 → b ≤ 0
② (1,1)→0: w₁ + w₂ + b ≤ 0 → w₁ + w₂ ≤ -b
③ (0,1)→1: w₂ + b > 0 → w₂ > -b
④ (1,0)→1: w₁ + b > 0 → w₁ > -b
推导矛盾:
③ + ④ 相加:
w₁ + w₂ > -2b
与 ② 联立:
css
-2b < w₁ + w₂ ≤ -b
即 -2b < -b,两边加 2b 得 0 < b,即 b > 0。
但 ① 要求 b ≤ 0。
矛盾! 因此不存在满足条件的 w₁、w₂、b。
证毕:单个感知机不可能正确分类异或问题的所有样本。
6. 代码验证:训练 100 轮仍无法收敛
python
import numpy as np
def step_function(x):
return 1 if x > 0 else 0
class Perceptron:
def __init__(self, input_size, lr=0.1, epochs=100):
self.weights = np.random.randn(input_size)
self.bias = np.random.randn()
self.lr = lr
self.epochs = epochs
def predict(self, X):
z = np.dot(X, self.weights) + self.bias
return step_function(z)
def train(self, X_train, y_train):
for epoch in range(self.epochs):
errors = 0
for i in range(len(X_train)):
pred = self.predict(X_train[i])
error = y_train[i] - pred
if error != 0:
errors += 1
self.weights += self.lr * error * X_train[i]
self.bias += self.lr * error
if (epoch + 1) % 20 == 0:
print(f"第{epoch+1}轮 - 错误数:{errors}")
# 异或数据
X = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([0, 1, 1, 0])
p = Perceptron(input_size=2)
p.train(X, y)
运行结果:
第20轮 - 错误数:4
第40轮 - 错误数:4
第60轮 - 错误数:4
第80轮 - 错误数:4
第100轮 - 错误数:4
100 轮训练,每轮 4 个样本全部预测错误,权重在不断震荡,永远无法收敛。
7. 解决方案:多层感知机(MLP)
核心思路:用两条线代替一条线
既然一刀切不开,就切两刀:

scss
第一刀(OR 线,蓝色):排除左下角的 ○(0,0)
第二刀(AND 线,红色):排除右上角的 ○(1,1)
两刀之间的绿色区域 = 异或为 1 的点 ✅
网络结构
隐藏层的两个神经元分别做 OR 和 AND 判断,关键在于输出层怎么组合它们:
| h₁ (OR) | h₂ (AND) | 想要的输出 y |
|---|---|---|
| 0 | 0 | 0 ((0,0) → 两个都没过线) |
| 1 | 0 | 1 ((0,1)或(1,0) → 过了 OR 线但没过 AND 线) |
| 1 | 1 | 0 ((1,1) → 两条线都过了) |
规律:h₁=1 且 h₂=0 时输出 1 ,即 y = h₁ AND (NOT h₂) = "过了第一刀但没过第二刀"。
用感知机实现这个逻辑,需要:
- h₁ 为 1 时拉高 → 正权重
- h₂ 为 1 时压低 → 负权重,而且要压得够狠(把 h₁ 的贡献完全抵消)
设 y = step(w_h1 × h₁ + w_h2 × h₂ + b),要满足:
css
h₁=0, h₂=0 → 0 + 0 + b ≤ 0 → b ≤ 0
h₁=1, h₂=0 → w_h1 + b > 0 → w_h1 > -b
h₁=1, h₂=1 → w_h1 + w_h2 + b ≤ 0 → w_h2 ≤ -(w_h1 + b)
取最简单的整数解:w_h1=1, w_h2=-2, b=-0.5(验证:-0.5≤0 ✓,1>0.5 ✓,1-2-0.5=-1.5≤0 ✓)
ini
输入层 隐藏层(2个神经元) 输出层
x₁ ──┬──→ [ h₁: OR 神经元 ] ──┐
│ w₁=1,w₂=1,b=-0.5 │
│ ├──→ [ y: 输出神经元 ]
│ │ w_h1=1, w_h2=-2, b=-0.5
x₂ ──┴──→ [ h₂: AND 神经元 ] ──┘
w₁=1,w₂=1,b=-1.5
完整手算
| x₁ | x₂ | h₁ = step(x₁+x₂-0.5) | h₂ = step(x₁+x₂-1.5) | y = step(h₁-2h₂-0.5) | 期望 |
|---|---|---|---|---|---|
| 0 | 0 | step(-0.5)=0 | step(-1.5)=0 | step(0-0-0.5)=step(-0.5)=0 | 0 ✅ |
| 0 | 1 | step(+0.5)=1 | step(-0.5)=0 | step(1-0-0.5)=step(+0.5)=1 | 1 ✅ |
| 1 | 0 | step(+0.5)=1 | step(-0.5)=0 | step(1-0-0.5)=step(+0.5)=1 | 1 ✅ |
| 1 | 1 | step(+1.5)=1 | step(+0.5)=1 | step(1-2-0.5)=step(-1.5)=0 | 0 ✅ |
全部正确! 两层网络完美解决了异或问题。
8. 直觉类比:切蛋糕
| 场景 | 单层感知机 | 多层感知机 |
|---|---|---|
| 类比 | 一刀切蛋糕 | 切两刀取中间那块 |
| 能力 | 只能切出两块 | 可以切出任意形状 |
| 决策边界 | 一条直线 | 多条直线组合成多边形 |
| 适用问题 | AND, OR(线性可分) | XOR 及任意复杂问题 |
9. 历史意义
| 年份 | 事件 |
|---|---|
| 1957 | Rosenblatt 发明感知机,引发第一波 AI 热潮 |
| 1969 | Minsky & Papert 出版《Perceptrons》,证明感知机无法解决异或 |
| 1969-1986 | 第一次 AI 寒冬(大家觉得神经网络没前途) |
| 1986 | Rumelhart 等人提出反向传播算法,多层网络可以训练了 |
| 此后 | 深度学习复兴,直到今天的 GPT、AlphaGo... |
一个小小的异或问题,改变了整个 AI 领域的走向。
10. 核心总结
┌────────────────────────────────────────────────┐
│ 感知机 = 一条直线 │
│ 异或 = 对角分布 │
│ 一条直线切不了对角 → 单层感知机无法解决异或 │
│ │
│ 解决方案:加一层隐藏层 │
│ → 每个隐藏神经元画一条线 │
│ → 输出层组合多条线的结果 │
│ → 可以切出任意复杂的分类边界 │
└────────────────────────────────────────────────┘
这也是为什么"深度"学习叫"深度"------因为层数(深度)决定了网络能表达的边界复杂度。单层太浅,只能画直线;层越深,能画出的"曲线"就越复杂。