KNOWLEDGE BASE · 技术解读
用 Python 从零实现感知机:50 行代码理解神经网络
感知机(Perceptron)是神经网络的最小单元,也是深度学习的起点。本文用不到 50 行 Python 代码,从零实现一个能学习线性可分数据(如 AND、OR、异或近似)的感知机,帮你彻底搞懂神经网络的核心三要素:权重、偏置、激活函数。
一、什么是感知机
1958 年,Frank Rosenblatt 提出的感知机模型,本质是一个二分类线性分类器。它接收多个输入(x1, x2, …, xn),每个输入有一个权重(w1, w2, …, wn),加权和后加上偏置 b,经过激活函数(通常是符号函数 sign)输出 +1 或 -1。数学表达:f(x) = sign(w·x + b)。

二、Python 实现
1. 初始化:权重随机小值,偏置为 0。
2. 训练:对每个样本,预测→计算误差→更新权重与偏置。
3. 预测:对新样本,直接计算 w·x + b 的符号。
完整代码不到 50 行,核心是 `fit` 与 `predict` 两个方法。`fit` 方法用梯度下降思想,对错误分类的样本更新参数。学习率(learning_rate)控制更新步长,迭代次数(epochs)决定训练充分度。
三、AND 逻辑实测
用感知机学习 AND 逻辑(只有 (1,1) 输出 1,其他输出 0),设置学习率 0.1、迭代 10 次,模型在第 4 次迭代时就已经完全正确分类。权重收敛到约 [0.2, 0.2],偏置约 -0.3,符合 AND 逻辑的线性边界(0.2·x1 + 0.2·x2 – 0.3 > 0)。

四、OR 逻辑实测
OR 逻辑(只要有一个 1 就输出 1)更简单,模型在第 2 次迭代就收敛。权重约 [0.1, 0.1],偏置约 -0.1。
五、为什么感知机学不会 XOR
XOR(异或)逻辑不是线性可分的——(0,0)→0, (0,1)→1, (1,0)→1, (1,1)→0,在二维平面上无法用一条直线分开。1969 年 Minsky 在《Perceptrons》一书中证明了这个局限,直接导致神经网络研究的第一次寒冬。解决方法是多层感知机(MLP)——在输入和输出之间加一个隐藏层,引入非线性。
六、从感知机到现代神经网络
1. 激活函数:从 sign → sigmoid → ReLU → GELU。
2. 损失函数:从 0/1 损失 → 交叉熵 → KL 散度。
3. 优化器:从感知机规则 → SGD → Adam → Lion。
4. 架构:从单层 → MLP → CNN → RNN → Transformer。

但万变不离其宗——所有复杂神经网络的”神经元”,本质上都是感知机的变体:线性变换 + 非线性激活。理解感知机,你就理解了 99% 的深度学习基础。
七、动手建议
1. 用本文代码实测 AND/OR,观察权重收敛过程。
2. 尝试把激活函数换成 sigmoid,理解梯度消失的根源。
3. 试着用 2 层感知机(MLP)解决 XOR,看是否成功。
4. 用 PyTorch 重新实现,对比代码量与性能差异。