首页
/ 神经网络入门之感知机:从 generative-ai-for-beginners 知识库看单层感知机的模型与训练原理

神经网络入门之感知机:从 generative-ai-for-beginners 知识库看单层感知机的模型与训练原理

2026-09-07 12:38:59作者:俞予舒Fleming

感知机(Perceptron)是现代神经网络中最原始的基石,也是本课程用于理解"AI 如何学习"的最小完整闭环。这篇文章以仓库中的课程讲义 15-rag-and-vector-databases/data/perceptron.md 为骨架,系统讲解感知机的历史渊源、数学模型(二分类与阶跃激活)、感知机准则与梯度下降训练算法,并基于仓库实际代码与配套文档补齐可从仓库直接验证的实现细节。读完你将能独立推导感知机的输入-输出关系与权重更新规则,理解"权重就是模型要学习的东西"这一核心命题,并为后续学习多层感知机(MLP)与反向传播打下基础。

说明:本仓库中的该讲义位于 15-rag-and-vector-databases 一课,其用途并不只是历史科普——在 15-rag-and-vector-databases/notebook-rag-vector-databases.ipynb 的 RAG(检索增强生成)示例中,data/perceptron.mddata/own_framework.mddata/frameworks.md 三份讲义被一起切分、向量化后写入知识库索引,作为"AI for Beginners 神经网络讲义"的一部分供检索问答使用。也就是说,你在本课读到的感知机讲义,本身就是课程用于演示知识库检索的样本数据之一。

感知机的起源:Frank Rosenblatt 与 Mark-1

理解感知机之前,先回到它诞生的年代。根据讲义记载,第一次接近现代神经网络雏形的尝试,由康奈尔航空实验室(Cornell Aeronautical Laboratory)的 Frank Rosenblatt 于 1957 年完成。它是一套硬件实现,命名为 "Mark-1",设计目标是识别原始的几何形状,例如三角形、正方形和圆形。

这套硬件的输入方式很有启发性:一幅输入图像由一个 20×20 的光电池阵列(photocell array) 表示,因此网络共有 400 个输入,以及一个二元输出(binary output)。也就是说,"感知机"在最早期并不是我们熟悉的软件模型,而是一台用电位器充当权重、靠人拧旋钮完成训练的物理装置:

  • 一个最简单的网络只含一个神经元,在神经科学语境中它也被称为阈值逻辑单元(threshold logic unit)
  • 网络的权重(weights) 像电位器一样工作,需要在训练阶段进行人工手动调节
  • 训练完成后,这台机器能依据 400 路输入光信号的加权总和是否超过阈值,输出"是/否"的分类结论。

讲义用一个形象的类比补充了背景知识:

✅ 电位器(potentiometer)是一种允许使用者调节电路电阻的装置。

这段历史的价值在于:它将"权重"这个抽象概念锚定到了非常具体的物理装置上。今天我们在代码里维护一个浮点向量 weights,本质上就是当年工程师拧动的那些旋钮。当年的媒体也为之兴奋——《纽约时报》在报道中写道,感知机是 "一台电子计算机的胚胎,海军期望它未来能够行走、说话、观看、书写、自我复制,并意识到自身的存在"。尽管这种预期后来被证明过度乐观,但感知机作为"第一个可学习的模式识别机器"的地位无可争议。

感知机模型:N 维特征上的二分类器

讲义的数学部分非常精炼,它是整篇理解感知机的钥匙。

输入向量与假设空间

假设模型有 N 个特征,则每条输入样本是一个大小为 N 的向量:

  • 输入向量记作 x(维度 N);
  • 权重向量记作 w(维度 N),外加一个可选的阈值/偏置项;
  • 感知机是一个二分类模型(binary classification),也就是说它只能在两类输入数据之间做出区分。

讲义约定:对每个输入向量 x,感知机的输出 y(x)+1-1 之一,具体取决于样本属于哪一类。这是后续一切推导的记号基础。

前向计算公式

感知机的输出按下式计算:

y(x) = f(wᵀx)

其中 f 是一个阶跃激活函数(step activation function)wᵀx 是权重向量与输入向量的点积(加权和)。阶跃函数的核心作用是对加权和做"门槛判定":加权和超过某个阈值时输出一类,否则输出另一类。正因为决策边界由线性加权和决定,感知机本质是一个线性分类器——它只能切分线性可分(linearly separable) 的数据,这也是后来多层感知机需要被提出的根本原因。

补充:在 15-rag-and-vector-databases/data/own_framework.md 中,课程把单层感知机的函数形式显式写为更一般的形式 f(x) = wx + b(w 为权重矩阵,x 为输入特征向量,b 为偏置向量),并指出这正是它与后续"多层、更复杂网络"的分水岭:多层网络只是让 f 的形式变得更复杂而已。单层感知机只能处理两类线性可分问题;要支持多分类、回归以及非线性可分数据,就必须引入多层结构与非线性激活。

训练感知机:从误差到权重更新

模型定义清楚了,剩下的核心问题是:如何让机器自己找到合适的权重 w? 讲义的逻辑链条如下。

感知机准则(Perceptron Criterion)

训练的目标是找到一个权重向量 w,使它能正确分类尽可能多的训练样本,也就是让误差(error)最小。讲义给出的误差定义是感知机准则(perceptron criterion)

E(w) = -∑ wᵀ xᵢ tᵢ

其中:

  • 求和对象是所有被错误分类的训练样本点 i;
  • xᵢ 是输入数据,tᵢ 是对应标签:负样本取 -1,正样本取 +1。

需要体会这个准则的两层含义:

  1. 只对分错的样本记账——分对的样本不贡献误差,这与直觉一致;
  2. 对分错样本,wᵀxᵢ 的符号与 tᵢ 相反(模型说"负",标签说"正",反之亦然),因此乘积为负、加负号后为正,E(w) 恒非负;E(w) 越小,说明错分样本的加权输出越接近正确一侧。

梯度下降(Gradient Descent)与学习率

E(w) 被看作权重 w 的函数,训练的目标就是最小化 E(w)。讲义采用了机器学习中最经典的方法——梯度下降(gradient descent)

  • 先从某个初始权重 w⁽⁰⁾ 出发;
  • 之后每一步按照下式更新权重:
w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ - η∇E(w)

这里:

  • η(eta) 称为学习率(learning rate),控制每一步更新的步长;
  • ∇E(w) 表示 E 对 w 的梯度(gradient),即误差函数在当前权重点上升最快的方向;减去梯度,就是让误差下降的方向。

对感知机准则的梯度完成计算后,可以化简得到感知机训练最核心的更新式:

w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ + ∑ η xᵢ tᵢ

注意这个更新式的含义非常直白:对每个被错分的样本,把权重视为沿"该样本的特征方向"移动 η·tᵢ 的量——正样本(tᵢ=+1)被错分为负时,把权重朝 xᵢ 的方向拉近;负样本(tᵢ=-1)被错分为正时,把权重朝 -xᵢ 的方向推开。这正是"纠正错误"的几何表达。

讲义还隐含交代了实现上的经典细节(这一做法在 15-rag-and-vector-databases/data/own_framework.md 中被进一步一般化):严格的梯度下降要对全量数据集求和,而实际训练通常随机抽取小批量数据(minibatch)计算梯度,因为每次都随机取子集,故称为随机梯度下降(SGD,Stochastic Gradient Descent)。感知机讲义中的训练循环每次只随机抽取一个正例和一个负例来更新,正是 SGD 思想的最朴素体现。

讲义中的训练算法与逐行解读

讲义给出了感知机训练的 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

结合上面的数学推导,这段代码反映的训练流程为:

  1. 初始化:把权重初始化为全 0 向量(原文注释戏称"几乎随机地")。
  2. 迭代 num_iterations 次(默认 100 次),每次:
    • 从正例集、负例集中各随机抽取一个样本;
    • 用当前权重计算正例的感知机输出 z = w·pos;若 z < 0,说明正例被误判为负类,则把权重向"正例方向"拉动;
    • 再计算负例的输出 z = w·neg;若 z >= 0,说明负例被误判为正类,则把权重向"负例反方向"拉动。
  3. 返回学习到的权重向量,供推理阶段用同一套 f(wᵀx) 规则对新样本做 +1/-1 判定。

需要说明的两点(来自讲义正文而非代码本身):

  • 代码中用 weights.shape 表达"每次更新按学习率整体移动权重向量",是教学演示的直观写法;对照正文公式 w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ + Σ η xᵢ tᵢ,更规范的做法是对每个错分样本执行向量加法 w ← w + η · tᵢ · xᵢ(错分样本才参与更新),数值实验时建议以该公式为准。
  • 函数签名中的 eta = 1学习率的默认取值num_iterations = 100迭代轮数默认值——二者都是可调超参数:η 过大容易在最优解附近震荡,过小则收敛过慢;迭代次数不足会欠拟合,过多则可能浪费时间(单层感知机在数据线性可分且 η 足够小时可以证明收敛)。

这段代码还包含了一个现代深度学习框架下不太显眼、但概念上非常关键的点:训练与推理共用同一套前向规则,权重是唯一在训练中变化的"记忆载体"。这个认知在后续学习 多层感知机讲义神经网络框架讲义 时会反复出现。

感知机在仓库中的延伸位置

感知机虽然是"最小"的神经网络,但它在课程体系中处于承上启下的枢纽位置,仓库中的两份姊妹讲义可以帮你建立全局视角:

  • 向上延伸为多层感知机(MLP)15-rag-and-vector-databases/data/own_framework.md 明确写到,上一节(即本节)"学习了最简单的神经网络模型——单层感知机,一个线性两类分类模型"。它随即指出单层感知机无法处理不可线性分离的类别、无法做多分类与回归,进而引入带非线性激活函数 α 的堆叠结构:z₁=w₁x+b₁z₂=w₂α(z₁)+b₂f=σ(z₂),并借助链式求导把梯度下降推广为反向传播(backpropagation)。可以说,感知机的误差最小化 + 梯度下降思想,正是 MLP 训练的源头。
  • 横向过渡到工程框架15-rag-and-vector-databases/data/frameworks.md 则指出,一旦进入真正的神经网络工程,训练需要两样能力——张量运算(如 numpy 提供的乘法、加法、sigmoid/softmax 等)与自动求梯度机制,并对比了 TensorFlow/Keras 与 PyTorch/PyTorch Lightning 的高低层 API。这些现代框架抽象掉的,恰恰是本节感知机中你亲手手写的"权重初始化—前向计算—根据误分类调整权重"这一整套循环。
  • 作为 RAG 知识库样本:在 15-rag-and-vector-databases/README.md 的场景设定里,本课要为教育类聊天机器人接入自有讲义作为知识底座,而数据侧正是 data/perceptron.md 等讲义文档;notebook-rag-vector-databases.ipynb 中把 "what is a perceptron?" 作为检索查询示例,经向量化后从索引中召回讲义片段并交给 LLM 作答。这意味着,你刚读懂的"感知机讲义",本身就是这个仓库 RAG 检索 demo 的可运行语料。

实践建议与学习路线

讲义在结尾给出的实践指引可以归纳为三步:

  1. 自己动手实现:将上面基于 NumPy 的训练代码补全为可运行脚本(补上 random/np 导入、数据加载与 w ← w + η·tᵢ·xᵢ 的向量化更新),用一个二维可线性分离的数据集验证收敛过程——观察权重如何逐轮"扭向"正确方向、误差如何下降。
  2. 扩展到手写数字分类:讲义布置的作业是,在完成"两个手写数字之间的二分类"之后,尝试用感知机思路解决完整的多类别数字分类(判定给定图像最可能对应哪个数字 0–9)。需要留意的是,单个感知机只能切一刀,完整的多分类需要把"一层感知机"扩展为多输出/多层结构——这正是 next 讲义 own_framework 的任务。
  3. 用现代框架复现:若想直接体验工程级工具,可参考 frameworks 讲义 的路线图,选择 TensorFlow 或 PyTorch,用高层 API 构造相同结构的网络并对比收敛曲线。

需要重申的边界是:感知机是线性二分类器,对线性不可分数据(如异或 XOR 分布)无能为力;它的价值不在于"最强",而在于它是理解"梯度下降如何驱动参数学习"这一整套现代深度学习心智模型的最小入口。

小结

  • 模型:感知机是 400(或任意 N)输入、单神经元的线性二分类器,输出由 y(x)=f(wᵀx) 与阶跃函数决定,权重即全部可学习参数。
  • 训练:以感知机准则 E(w)=-∑wᵀxᵢtᵢ 定义误差(只统计错分样本),用梯度下降迭代更新 w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ + η·xᵢ·tᵢ,其中 η 为学习率。
  • 实现:每次随机抽取正/负样本检查分类结果,错分即沿样本方向修正权重,迭代默认 100 轮(eta=1)。
  • 位置:在 generative-ai-for-beginners 课程中,它是神经网络知识链的起点,既是多层感知机与反向传播的前置讲义,也是本仓库 RAG 检索演示所真实索引的知识库文档之一。

如果你沿着这条线继续深入,下一篇 own_framework.md 将在同一套"误差最小化 + 梯度下降"心智模型之上,把感知机扩展成能处理多分类、回归与非线性问题的通用框架——而理解今天的单层感知机,就是掌握那一切的开始。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.13 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.8 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
529
593
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
915
1.83 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.58 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.35 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.01 K
515
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
547
388