generative-ai-for-beginners:感知器(Perceptron)模型与训练算法技术解析
本文基于 15 课 RAG 与向量数据库模块下的感知器讲义(爱沙尼亚语译本 translations/et/15-rag-and-vector-databases/data/perceptron.md),系统讲解现代神经网络的最早雏形——1957 年 Rosenblatt 提出的感知器:其历史硬件实现 Mark-1、二值分类的数学模型、感知器准则(perceptron criterion)误差函数,以及基于梯度下降的训练算法与 Python 实现。读完后你将能够理解单神经元二值分类器的完整工作原理,复现其训练循环,并知道如何在仓库配套 Notebook 中用它区分手写数字。
历史背景:从 1957 年的 Mark-1 到现代神经网络
实现类似现代神经网络的第一次尝试,是由 Cornell Aeronautical Laboratory 的 Frank Rosenblatt 于 1957 年完成的。这是一个名为 Mark-1 的硬件实现,设计目标是识别三角形、正方形、圆形等原始几何图形。讲义原文还引用了当年《纽约时报》对感知器的报道:一台电子计算机的胚胎,[美国海军]希望它能行走、说话、看、写、自我复制,并意识到自身的存在——这既反映了当时对感知器的巨大期待,也说明了它在机器学习史上的起点地位。
Mark-1 的输入输出结构如下:
- 输入:图像由 20x20 的光敏元件(photocell)阵列捕捉,即神经网络拥有 400 个输入;
- 输出:仅 1 个二值输出;
- 网络结构:只包含 1 个神经元,也称为阈值逻辑单元(threshold logic unit);
- 训练方式:网络权重表现为电位器(potentiometer,一种可调节电路阻值的装置),需要在训练阶段手动调节——这正是后来算法化自动权重更新之前的做法。
感知器的数学模型
假设模型中有 N 个特征,则输入向量就是大小为 N 的向量。感知器是一个二值分类(binary classification)模型,即它只能区分输入数据的两个类别。假设对每个输入向量 x,感知器的输出为 +1 或 -1(取决于类别),输出按下式计算:
其中 f 是一个阶跃激活函数(step activation function):内积 wTx 为正时输出 +1,否则输出 -1。这里 w 是与输入特征等长的权重向量,wTx 即输入特征加权和。
✅ 从结构上看,感知器就是"线性加权和 + 阶跃函数"的最简神经网络:没有隐藏层、没有偏置项(偏置可通过追加一个恒为 1 的特征吸收),因此只能划分线性可分的两类数据。这一点在仓库配套的下一节讲义 多层感知器(Multi-Layered Perceptron) 中得到了印证——该讲义明确指出单层感知器是"线性两类分类模型",并以此引出多类分类、回归问题与不可线性分开类别的解决方案。
感知器准则:误差函数的定义
训练感知器的目标是找到一个权重向量 w,使尽可能多的样本被正确分类,即使误差(error)最小。讲义用感知器准则来定义误差:
其中:
- 求和仅针对那些被错误分类的训练样本 i;
- xi 是输入数据,ti 对正例取 +1、对负例取 -1。
直觉上:对分类正确的样本,wTxi 与 ti 同号,乘积为正;对被分错的样本,乘积为负。前面的负号使得"分错的样本越多、错得越离谱",E(w) 就越大——因此最小化 E(w) 等价于消除所有误分类。
用梯度下降训练感知器
感知器准则是权重 w 的函数,需要将其最小化。讲义给出的方法是梯度下降(gradient descent):从某个初始权重 w(0) 出发,每步按下列公式更新权重:
其中 η 是学习率(learning rate),∇E(w) 是 E 的梯度。对感知器准则求梯度后代入更新式,得到:
即:每当一个样本被分错,就把权重朝该样本的类别方向修正一个与 η 成正比的量。这一推导也完整呈现在 多层感知器讲义 的"梯度下降优化"小节中,并进一步推广为带参数 θ=⟨w, b⟩ 的通用训练目标——"神经网络训练的目标就是改变参数 θ 来最小化误差"。
讲义给出的 Python 参考实现如下:
def train(positive_examples, negative_examples, num_iterations = 100, eta = 1):
weights = [0,0,0] # Initialize weights (almost randomly :)
for i in range(num_iterations):
pos = random.choice(positive_examples)
neg = random.choice(negative_examples)
z = np.dot(pos, weights) # compute perceptron output
if z < 0: # positive example classified as negative
weights = weights + eta*weights.shape
z = np.dot(neg, weights)
if z >= 0: # negative example classified as positive
weights = weights - eta*weights.shape
return weights
结合公式理解这段代码:
num_iterations(默认 100)是训练步数,eta(默认 1)即学习率;- 权重初始化为 3 维零向量
[0,0,0]——3 维对应 2 个特征加 1 个偏置项,与上面"偏置可通过恒为 1 的特征吸收"的结构解释一致; - 每个训练步随机抽一个正例
pos和一个负例neg,用np.dot计算感知器输出 z; - 若正例输出 z < 0(被误判为负类),按
weights + eta*...正向修正;若负例输出 z ≥ 0(被误判为正类),按weights - eta*...负向修正——这正是"仅对误分类样本更新权重"的感知器准则的在线(随机抽样)实现。
需要注意:原讲义代码中
eta*weights.shape是笔误,按推导的更新式w + η·x_i·t_i及代码注释语义,正确写法应为weights + eta*pos与weights - eta*neg(即按误分类样本本身更新,而非按权重的形状/规模更新)。复现时应以该修正版本为准。
小结
本讲义的核心知识点可以归纳为三点:
- 感知器是最早的神经网络实现之一(1957 年 Mark-1),400 个光敏输入、1 个二值输出、1 个阈值逻辑单元;
- 感知器是二值分类模型,输出 y(x) = f(wTx),f 为阶跃函数;
- 训练目标是最小化感知器准则 E(w) = -Σ wTxiti(仅对误分类样本求和),用梯度下降按 w(t+1) = w(t) + Σ η xiti 迭代更新权重。
实战延伸:手写数字分类任务与课程内衔接
讲义的练习部分提出一个完整的实战任务:在课程中我们已用感知器完成"两个手写数字"的二分类,练习要求彻底解决数字分类问题——给定一张图片,判断它最可能对应哪个数字。讲义建议读者使用仓库配套 Notebook(notebook-rag-and-vector-databases.ipynb)动手实践;若要借助无代码工具搭建感知器,讲义还推荐了微软 Azure ML 设计器上的对应实验。
在整门课程中,这一讲义并非孤立存在,它与同目录下的 data/perceptron.md(英文版原讲义)、data/own_framework.md(多层感知器与自研模块化训练框架)以及 data/frameworks.md 构成"单层感知器 → 多层感知器 → 主流框架"的递进学习路径。值得注意的是,感知器正是本 RAG 课程知识库的一部分:主讲义 15-rag-and-vector-databases/README.md 中演示的问答应用,检索的示例问题恰恰就是 "what is a perceptron?"——感知器讲义的文本经过分块与嵌入后被建入向量索引,再由 LLM 基于检索到的段落生成答案。换言之,本文讲解的经典算法,同时也是向量检索系统中被检索与引用的知识源之一。
适用前提说明:本文所有模型公式与代码均以仓库讲义为准。感知器只能处理线性可分的二分类问题;多类分类、回归与不可线性分开的数据,需要引入 多层感知器讲义 中介绍的隐藏层、偏置项与反向传播机制。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00