从零实现1957年弗兰克·罗森布拉特的感知机:第一个神经网络模式识别实战

1次阅读
没有评论

共计 1537 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

背景介绍

1957 年,弗兰克·罗森布拉特发明了感知机,这是第一个能够实现简单模式识别的神经网络模型。感知机的出现标志着人工神经网络研究的开端,为后续深度学习的发展奠定了基础。虽然感知机的结构非常简单,但它已经具备了现代神经网络的核心思想:通过调整权重来学习输入数据的模式。

从零实现 1957 年弗兰克·罗森布拉特的感知机:第一个神经网络模式识别实战

数学原理

感知机的决策函数可以表示为:

f(x) = sign(w · x + b)

其中,w 是权重向量,x 是输入向量,b 是偏置项,sign 是符号函数(输出 + 1 或 -1)。

权重更新规则采用简单的误差修正方法:

w_new = w_old + η * (y_true - y_pred) * x

其中,η 是学习率,y_true 是真实标签,y_pred 是预测标签。

Python 实现

下面是一个完整的感知机分类器的 Python 实现,使用 numpy 库进行向量化计算:

import numpy as np

class Perceptron:
    def __init__(self, learning_rate=0.01, n_iters=1000):
        self.lr = learning_rate
        self.n_iters = n_iters
        self.weights = None
        self.bias = None

    def fit(self, X, y):
        n_samples, n_features = X.shape

        # 初始化权重和偏置
        self.weights = np.zeros(n_features)
        self.bias = 0

        # 将标签转换为 + 1 或 -1
        y_ = np.array([1 if i > 0 else -1 for i in y])

        # 训练循环
        for _ in range(self.n_iters):
            for idx, x_i in enumerate(X):
                linear_output = np.dot(x_i, self.weights) + self.bias
                y_pred = np.sign(linear_output)

                # 更新规则
                update = self.lr * (y_[idx] - y_pred)
                self.weights += update * x_i
                self.bias += update

    def predict(self, X):
        linear_output = np.dot(X, self.weights) + self.bias
        return np.sign(linear_output)

实战演示

让我们用这个感知机模型来解决 AND 逻辑运算问题:

# AND 逻辑运算数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([-1, -1, -1, 1])

# 创建并训练感知机
p = Perceptron(learning_rate=0.1, n_iters=100)
p.fit(X, y)

# 测试
predictions = p.predict(X)
print(predictions)  # 应该输出 [-1, -1, -1, 1]

局限性分析

虽然感知机在简单线性可分问题上表现良好,但它有一个重大缺陷:无法解决非线性可分问题,比如 XOR 逻辑运算。这就是著名的 ” 感知机局限性 ” 问题。1969 年,Minsky 和 Papert 在《Perceptrons》一书中严格证明了这一局限性,导致神经网络研究进入了第一个寒冬。

现代意义

尽管有这些局限性,感知机仍然是现代神经网络的基础。多层感知机(MLP)通过堆叠多个感知机层并引入非线性激活函数,可以解决 XOR 等复杂问题。今天,感知机的核心思想仍然存在于深度学习的各个架构中。

思考题

如何扩展这个基础感知机来解决更复杂的分类问题?可以考虑以下几个方面:

  1. 引入非线性激活函数(如 sigmoid、ReLU)
  2. 堆叠多个感知机层形成深度网络
  3. 使用更复杂的优化算法(如 SGD、Adam)
  4. 增加正则化项防止过拟合

通过这些扩展,简单的感知机就能进化为强大的现代神经网络。

正文完
 0
评论(没有评论)