从M-P神经元模型到感知机再到神经网络

系列文章见: 《回忆AI时代-从图灵机到人工智能》

关于神经网络的演进

1943年,神经生理学家 Warren McCulloch(沃伦・麦卡洛克)与天才数理逻辑学家 Walter Pitts(沃尔特・皮茨) 提出人类历史上第一个人工神经元数学模型,是一种模仿人脑神经元工作方式的计算模型简称M-P神经元模型,是现代所有神经网络、深度学习的理论源头。1958年,Frank Rosenblatt提出感知机,在M-P基础上增加权重自动学习规则,解决 “不能训练” 的核心缺陷。

  • M-P神经元模型(1943):观察生物神经元工作方式,但它的问题是,没有学习能力、权重是手工设定的和只能做逻辑推理(AND / OR)
  • 感知机(1958):第一个“可以学习”的神经网络,引入了权重自动调整并开启机器学习时代。但它的不足只能解决线性可分问题、无法处理XOR、结构太简单(单层)。
  • 反向传播(1986):多层神经网络可以训练了,解决“误差如何传回去”的问题。但它的缺点是计算量大(当时CPU很慢)、容易梯度消失(深层训练困难)、数据不够多。

M-P神经元模型

人们观察到生物神经元。

1
2
3
4
5
6
7
生物神经元

树突 → 接收信号

细胞体 → 处理信号

轴突 → 输出信号

对应抽象的数学公式。

1
2
3
4
5
6
7
8
9
10
11
输入
x1
x2
x3

加权求和
z = w1x1+w2x2+w3x3

激活

输出

感知机

感知机本质不停调整一条“分界线”,把数据分成两类。它的数学公式y=step(w⋅x+b)

  • w:权重(重要程度)
  • b:偏置(平移分界线)
  • step:激活函数(>0 输出1,否则0)

案例:用感知机推导AND逻辑。

x1 x2 y
0 0 0
0 1 0
1 0 0
1 1 1

Python代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np

# 训练数据
X = np.array([
[0, 0],
[0, 1],
[1, 0],
[1, 1]
])

y = np.array([0, 0, 0, 1])

# 初始化参数
w = np.random.randn(2)
b = 0.0
lr = 0.1

# 激活函数
def step(z):
return 1 if z > 0 else 0

# 训练感知机
for epoch in range(20):
for i in range(len(X)):
x = X[i]
target = y[i]

# 预测
z = np.dot(w, x) + b
pred = step(z)

# 误差
error = target - pred

# 更新规则(核心)
w += lr * error * x
b += lr * error

print(f"epoch {epoch}, w={w}, b={b}")

训练过程中:

  • 初期:乱猜
  • 中期:开始分开0和1
  • 后期:稳定收敛

最终会学到类似:

  • w ≈ [0.3, 0.3]
  • b ≈ -0.2

什么是神经网络

感知机只能解决线性问题,而神经网络(Neural Network)可以解决非线性问题。譬如我们来解决一个景点案例XOR(异或)问题。

XOR数据:

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np

# 输入
X = np.array([
[0, 0],
[0, 1],
[1, 0],
[1, 1]
])

# 输出(异或)
y = np.array([0, 1, 1, 0])

感知机,它解决不了XOR问题。

1
2
3
4
5
6
from sklearn.linear_model import Perceptron

model = Perceptron()
model.fit(X, y)

print("预测结果:", model.predict(X))

神经网络,可以解决。

1
2
3
4
5
6
7
8
9
10
11
from sklearn.neural_network import MLPClassifier

model = MLPClassifier(
hidden_layer_sizes=(4,), # 关键:隐藏层
max_iter=5000,
random_state=1
)

model.fit(X, y)

print("预测结果:", model.predict(X))