感知机(Perceptron)原理与训练算法详解:generative-ai-for-beginners 神经网络入门笔记解读
导读
本文围绕开源课程仓库中的神经网络开篇笔记展开,系统讲解感知机(Perceptron)的由来、数学模型、误差定义与梯度下降训练算法,并结合课程第 15 课(RAG 与向量数据库)的实际语境,说明这份笔记在仓库中承担的角色。阅读本文后,你将掌握二元分类感知机的核心公式推导、一份可直接运行的训练算法骨架,以及如何把它扩展为完整的手写数字分类器。
这份笔记在仓库中的定位
本文对应的源文档位于 15-rag-and-vector-databases/data/perceptron.md(英文原稿),其丹麦语翻译版位于 translations/da/15-rag-and-vector-databases/data/perceptron.md。后者即本节写作所依据的关联文档,由 AI 翻译服务生成,如需精确引用,应以英文原稿为权威来源。
值得强调的是,这份看似“独立成篇”的笔记,在仓库中并不是孤立存在的。第 15 课的 README 明确说明,该课程的教学场景是“为教育科技创业项目接入自有的神经网络课程笔记,让聊天机器人基于这些资料回答学习问题”,其中 grounding 数据来源正是“AI for Beginners 的神经网络课程”。在 data 目录 中,它与 frameworks.md、own_framework.md 共同构成一份小型知识库语料。README 结尾的端到端示例中,系统输入的问题正是 user_input = "what is a perceptron?",配套 Notebook 也围绕这些笔记演示分块、向量化与检索增强生成的完整链路。
因此,读懂这份感知机笔记,既是理解传统神经网络起点的基础功课,也是理解本仓库 RAG 示例“数据从哪来、检索到什么”的钥匙。
历史背景:1957 年的 Mark-1 感知机
现代神经网络最早的成功原型之一,出自康奈尔航空实验室(Cornell Aeronautical Laboratory)的 Frank Rosenblatt。1957 年,他以硬件方式实现了名为 Mark-1 的感知机,设计目标是识别三角形、正方形、圆形等初级几何图形。
从结构上看,Mark-1 的输入图像由一个 20×20 的光电管阵列 表示——相当于把一幅图划分成 400 个像素单元——因此该网络拥有 400 个输入和 1 个二进制输出。一个简单的网络只包含一个神经元,这种结构也被称为阈值逻辑单元(threshold logic unit)。在那个年代,网络的“权重”由电位器(potentiometer)承担,训练阶段需要人工转动旋钮手动调节电路电阻——这与你今天在 model.fit() 中自动完成的梯度更新,隔着数十年的手工劳作。
当时的媒体对这一进展寄予了极大期望。《纽约时报》在报道中写道,感知机是“一台电子计算机的胚胎,海军期望它能够行走、说话、观看、书写、自我复制,并对自身的存在产生意识”。
一点背景注解:电位器是一种允许使用者调节电路电阻的元件。Mark-1 正是通过调节这些电阻来“学习”权重。
感知机模型:一种二元分类器
从数学角度,感知机是一个二元分类模型:它只能在两类输入数据之间做出区分。
假设模型拥有 N 个特征,那么输入向量 x 就是大小为 N 的向量。对于每一组输入 x,感知机的输出被约定为 +1 或 -1,具体取决于样本所属类别。输出由如下公式计算:
y(x) = f(wᵀ x)
其中:
- w 是权重向量(大小同样为 N),wᵀ x 是权重向量与输入向量的点积(加权求和);
- f 是一个阶跃激活函数(step activation function),它把加权求和的结果映射为 +1 或 -1 两个离散值。
可以这样直观理解:加权求和 wᵀ x 的正负号对应了输入点在“决策超平面”的哪一侧,阶跃函数再把该符号“折叠”成二元类别标签。感知机的分类能力由此而来——也正因如此,它天然适合处理线性可分的两类问题。
训练目标:最小化“感知机准则”定义的误差
训练感知机的目标,是找到一组权重向量 w,使其能正确分类绝大多数样本,也就是让整体误差最小。这份笔记给出的误差定义被称为感知机准则(perceptron criterion):
E(w) = -∑ wᵀ xᵢ tᵢ
其中各符号含义为:
- 求和只在被错误分类的训练数据点 i 上进行;
- xᵢ 是输入数据;
- tᵢ 是样本的期望标签,对负例取 -1、正例取 +1。
把误差 E 看成权重 w 的函数后,训练问题就转化为一个最优化问题:找到使 E(w) 最小的 w。注意求和下标限定在“被分错的样本”上:对正确分类的样本,wᵀ xᵢ 与 tᵢ 同号,乘积为正,一旦被排除出求和,误差反而减小;反之,分错的样本贡献正的误差项(取负号后成为正值),迫使优化过程去修正它们。
训练算法:梯度下降与权重更新规则
要最小化误差函数,文档采用的方法是最经典的梯度下降(gradient descent)。思路是:先取一组初始权重 w⁽⁰⁾,然后沿着误差下降最快的方向,逐步更新权重:
w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ - η∇E(w)
其中:
- η 是学习率(learning rate),控制每一步更新的步长;
- ∇E(w) 表示误差函数 E 在权重 w 处的梯度。
把感知机准则 E(w) = -∑ wᵀ xᵢ tᵢ 对 w 求梯度(求和项对 w 求导后,xᵢ tᵢ 就是梯度贡献),代入上式后得到最终的更新公式:
w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ + ∑ η xᵢ tᵢ
这个式子的几何含义非常优雅:当一个**正例(tᵢ=+1)被误判为负类时,向权重向量加上 η·xᵢ,把它“拉”向正例一侧;当一个负例(tᵢ=-1)**被误判为正类时,则减去 η·xᵢ,把它“推”离负例一侧。这正是感知机训练的全部秘密——一个循环、一个点积判断、一次向量加减。
Python 训练算法逐行解析
笔记给出了如下 Python 实现骨架(示意性代码):
def train(positive_examples, negative_examples, num_iterations = 100, eta = 1):
weights = [0,0,0] # 初始化权重(几乎可以视为随机 :)
for i in range(num_iterations):
pos = random.choice(positive_examples)
neg = random.choice(negative_examples)
z = np.dot(pos, weights) # 计算感知机输出
if z < 0: # 正例被误判为负类
weights = weights + eta*weights.shape
z = np.dot(neg, weights)
if z >= 0: # 负例被误判为正类
weights = weights - eta*weights.shape
return weights
逐行拆解其逻辑:
- 初始化:
weights = [0,0,0],对应模型有 2 个特征外加 1 个偏置项(bias)的情形;num_iterations=100为训练轮数上限,eta=1为学习率。 - 随机采样:每轮从正、负样本集合中随机各取一个样例,实现随机化的梯度更新。
- 前向判断:
np.dot(pos, weights)计算加权和 z,等价于公式中的 wᵀx。 - 条件纠错:若 z<0 说明正例被判成负类,此时权重应朝正例方向更新;若负例的 z≥0,则反向更新。
- 收敛返回:迭代完成后返回学习到的权重向量,供推理阶段
np.dot(x, w)取符号使用。
需要特别指出两点,帮助读者把这份骨架真正跑起来:
- 伪代码中的更新量写作
eta*weights.shape是示意写法,意在表达“按误差方向整体移动权重”的思想;由于 weights 是 Python list,weights.shape并非合法属性。结合上面的推导w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ + ∑ η xᵢ tᵢ,可以推断出可运行的更新应写作weights = weights + eta * np.array(pos)(正例误判时)与weights = weights - eta * np.array(neg)(负例误判时),即让权重沿该误判样本自身的向量方向修正。 eta默认取 1 在此是可行的,因为感知机准则的梯度本身已是按样本缩放的有界量;但在工程实践中,较小的学习率(如 0.1~0.01)通常更稳定,这一结论可从梯度下降通用性质推断,属于训练超参数调节范畴。
理解这份代码的另一种视角是把它与文档的数学公式逐项对照:np.dot(x, weights) 对应 y(x)=f(wᵀx),条件分支对应阶跃激活函数与误分类判断,而加/减更新恰好复现了 w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ + ∑ ηxᵢtᵢ。数学与代码在这里是一一对应的。
本课小结:感知机能做什么、不能做什么
学完本节,你应掌握的要点是:
- 感知机是二元分类模型,通过权重向量 w 对输入做加权求和,再用阶跃函数输出 +1/-1;
- 其误差由感知机准则定义,且只在被误分类的样本上求和;
- 训练采用梯度下降,按
w ← w + ηxᵢtᵢ逐样本修正权重,η 为学习率; - 单一阈值逻辑单元的历史原型是 1957 年 Rosenblatt 的 Mark-1,硬件上以电位器充当权重。
值得留意的边界在于:单个感知机本质上只能对线性可分问题划出一条直线(超平面)决策边界;面对 XOR 这类非线性可分问题,单层感知机会失效——这正是后续多层网络与非线性激活函数(乃至本仓库课程中的 LLM、RAG)登场的原因。
延伸练习:从二元分类走向手写数字识别
笔记的“作业(Assignment)”把问题推向纵深:前面实现的感知机只负责区分两个手写数字(如“3”与“7”),而完整的数字分类任务要求判断任意一张图片最可能对应哪一个数字(0~9)。这是一个多分类问题,经典解法是把问题拆成多个“一对一”或“一对多”的二元感知机组合,再通过投票或比较得分确定最终类别。
若想亲手实现并验证,可以:
- 阅读课程配给的练习与 Notebook,逐步完成特征向量化、训练与评估闭环;
- 参考 notebook-rag-vector-databases.ipynb 中“把文本/笔记切块 → 向量化 → 检索”的工程范式,理解这类“传统特征向量”方法如何在 RAG 场景中以 embedding 形式延续;
- 把本文的感知机笔记与同目录 own_framework.md、frameworks.md 对照阅读,形成从“单神经元”到“框架化建模”的知识脉络。
结语:为什么在生成式 AI 课程里还要读感知机
表面上看,感知机是 1957 年的古董;但在本仓库的课程设计中,它恰是被选中“接地”(grounding)到 RAG 应用里的核心知识语料——第 15 课 README 中聊天机器人收到的典型问题就是“什么是感知机”。因此,读好这份笔记既是掌握神经网络最小单元的数学体操,也是复现本仓库检索增强链路时理解“检索到的内容是什么”的前提:从 Mark-1 的电位器,到 wᵀx 的加权求和,再到以向量相似度为核心的现代 RAG,底层始终是同一个思想——用数值向量表达信息,再让模型依据向量做判断与生成。
附注:本节引用的关联文档 translations/da/15-rag-and-vector-databases/data/perceptron.md 系 AI 自动翻译版本,翻译可能包含误差或不精确之处;权威内容请以 英文原稿 为准。
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