首页
/ generative-ai-for-beginners:感知器(Perceptron)模型与训练算法技术解析

generative-ai-for-beginners:感知器(Perceptron)模型与训练算法技术解析

2026-09-07 17:05:26作者:田桥桑Industrious

本文基于 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(取决于类别),输出按下式计算:

y(x)=f(wTx)y(x) = f(w^T x)

其中 f 是一个阶跃激活函数(step activation function):内积 wTx 为正时输出 +1,否则输出 -1。这里 w 是与输入特征等长的权重向量,wTx 即输入特征加权和。

✅ 从结构上看,感知器就是"线性加权和 + 阶跃函数"的最简神经网络:没有隐藏层、没有偏置项(偏置可通过追加一个恒为 1 的特征吸收),因此只能划分线性可分的两类数据。这一点在仓库配套的下一节讲义 多层感知器(Multi-Layered Perceptron) 中得到了印证——该讲义明确指出单层感知器是"线性两类分类模型",并以此引出多类分类、回归问题与不可线性分开类别的解决方案。

感知器准则:误差函数的定义

训练感知器的目标是找到一个权重向量 w,使尽可能多的样本被正确分类,即使误差(error)最小。讲义用感知器准则来定义误差:

E(w)=iwTxitiE(w) = -\sum_i \, w^T x_i \, t_i

其中:

  • 求和仅针对那些被错误分类的训练样本 i;
  • xi 是输入数据,ti 对正例取 +1、对负例取 -1。

直觉上:对分类正确的样本,wTxi 与 ti 同号,乘积为正;对被分错的样本,乘积为负。前面的负号使得"分错的样本越多、错得越离谱",E(w) 就越大——因此最小化 E(w) 等价于消除所有误分类。

用梯度下降训练感知器

感知器准则是权重 w 的函数,需要将其最小化。讲义给出的方法是梯度下降(gradient descent):从某个初始权重 w(0) 出发,每步按下列公式更新权重:

w(t+1)=w(t)ηE(w)w^{(t+1)} = w^{(t)} - \eta \, \nabla E(w)

其中 η 是学习率(learning rate),∇E(w) 是 E 的梯度。对感知器准则求梯度后代入更新式,得到:

w(t+1)=w(t)+iηxitiw^{(t+1)} = w^{(t)} + \sum_i \eta \, x_i \, t_i

即:每当一个样本被分错,就把权重朝该样本的类别方向修正一个与 η 成正比的量。这一推导也完整呈现在 多层感知器讲义 的"梯度下降优化"小节中,并进一步推广为带参数 θ=⟨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*posweights - eta*neg(即按误分类样本本身更新,而非按权重的形状/规模更新)。复现时应以该修正版本为准。

小结

本讲义的核心知识点可以归纳为三点:

  1. 感知器是最早的神经网络实现之一(1957 年 Mark-1),400 个光敏输入、1 个二值输出、1 个阈值逻辑单元;
  2. 感知器是二值分类模型,输出 y(x) = f(wTx),f 为阶跃函数;
  3. 训练目标是最小化感知器准则 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 基于检索到的段落生成答案。换言之,本文讲解的经典算法,同时也是向量检索系统中被检索与引用的知识源之一。

适用前提说明:本文所有模型公式与代码均以仓库讲义为准。感知器只能处理线性可分的二分类问题;多类分类、回归与不可线性分开的数据,需要引入 多层感知器讲义 中介绍的隐藏层、偏置项与反向传播机制。

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

项目优选

收起
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