从感知机到向量知识库:generative-ai-for-beginners 中的神经网络基础与 RAG 落地数据
感知机(Perceptron)是历史上最早的"类神经网络"模型之一,也是理解现代神经网络(多层感知机、深度学习乃至向量检索与 RAG)的起点。本文以本仓库 第 15 课「检索增强生成(RAG)与向量数据库」 的语料文档 data/perceptron.md 为主体,系统讲解感知机的模型定义、损失准则、梯度下降训练算法与 Python 实现;同时结合仓库内同目录的后续文档(多层感知机、神经网络框架)与 RAG Notebook 的源码证据,说明"感知机"这类领域知识文档为何能作为 RAG 应用中被切分、向量化并检索的知识底座。读完本文,你将掌握感知机二分类模型的完整数学形式与训练流程,并理解它是如何作为可被嵌入、检索和回答的自然语言语料出现在生成式 AI 应用中的。
1. 这份感知机文档在课程中的角色
在阅读模型公式之前,有必要先明确它在当前仓库中的位置。仓库目录 15-rag-and-vector-databases/ 下除了 README.md 和主 Notebook,还存在一个 data/ 子目录,其中包含三份课程讲义风格的 Markdown 文档:
- data/perceptron.md:本文主体,讲解单层感知机的二分类模型与训练;
- data/own_framework.md:由感知机扩展到多层感知机(MLP)与反向传播;
- data/frameworks.md:神经网络框架(TensorFlow / PyTorch)与过拟合问题。
这三份文档并不仅仅是"参考资料"。在 notebook-rag-vector-databases.ipynb 中,它们被显式地作为知识库数据源加载进 RAG 演示流程(Notebook 中可见 data_paths 列表同时引用 frameworks.md、own_framework.md、perceptron.md 三条路径),并经过切块、向量化、建立最近邻索引等步骤,最终供"what is a perceptron?"这类用户提问检索与增强生成。这正好呼应了 RAG 的核心思路:把一份讲解神经网络的领域文档"外挂"到大语言模型上,让回答不仅有通用预训练知识,还能引用到这份特定讲义的内容。
也就是说,下面讲解的感知机内容,既是神经网络的教学素材,也是生成式 AI 落地中"可检索知识文档"的一个最小实例。
2. 历史背景:1957 年的 Mark-1 感知机
感知机的最早实现由康奈尔航空实验室(Cornell Aeronautical Laboratory)的 Frank Rosenblatt 于 1957 年完成。这是一个名为 Mark-1 的硬件实现,其设计目标是识别三角形、正方形、圆形等基本几何形状。
这一早期实现的几个关键工程细节,直接影响后文模型抽象:
- 输入图像由 20×20 的光电池阵列表示,因此神经网络共有 400 个输入与 1 个二值输出;
- 网络内部只包含一个神经元,在文献中也称为阈值逻辑单元(threshold logic unit);
- 网络的权重在硬件上由"电位器"承担——训练阶段需要人工手动旋动电位器来调整电阻、从而调整权重。
电位器(potentiometer)是一种允许使用者在电路中调节电阻的器件。把它理解成"可手动拧动的权重旋钮"即可。
当时媒体对这项技术的报道相当乐观,《纽约时报》曾将其描述为"电子计算机的胚胎,海军期望它未来能够行走、说话、观看、书写、自我复制并意识到自身的存在"。无论后人如何评价这种夸大,Mark-1 的历史意义在于它第一次以可操作的物理装置演示了"通过学习权重来完成分类"这一思想——这正是本节将用数学重新表述的内容。
3. 感知机模型:线性加权与阶跃输出的二分类器
3.1 输入向量与输出符号约定
假设我们的模型共有 N 个特征,那么输入向量 x 就是一个大小为 N 的向量。感知机是**二分类(binary classification)**模型,只能区分两类输入数据。约定对于每个输入向量 x,感知机的输出根据其所属类别为 +1 或 -1。
输出由如下公式计算:
y(x) = f(w^T x)
其中:
- w 为权重向量(与输入同维度 N);
- w^T x 表示权重向量与输入向量的内积(加权求和);
- f 为阶跃激活函数(step activation function),负责把加权和映射到两个离散类别之一。
3.2 几何直觉
从几何上看,w^T x = 0 定义了一个穿过特征空间的超平面(决策边界),感知机就是根据样本落在超平面哪一侧来决定输出 +1 还是 -1。因此单层感知机天然只能处理线性可分的数据——这也是后续文档 data/own_framework.md 明确指出"单层网络只能分类线性可分的类别,需要叠加多层网络(MLP)来处理更丰富的数据"的原因。
4. 训练感知机:从误差准则到梯度下降
4.1 训练目标与感知机准则
训练感知机,就是要找到一组权重向量 w,使它能正确分类绝大多数样本,即让误差最小。误差由**感知机准则(perceptron criterion)**定义:
E(w) = -Σ w^T x_i · t_i
其中求和仅针对被错误分类的训练样本 i:
- x_i 为输入数据;
- t_i 为样本标签,负例取 -1,正例取 +1。
把 E(w) 看成关于权重 w 的函数后,训练就变成一个标准的函数最小化问题:寻找使 E(w) 最小的 w。
4.2 梯度下降与学习率
求解最小化问题常用梯度下降(gradient descent):先给定一组初始权重 w^(0),然后每步按梯度的反方向更新权重:
w^(t+1) = w^(t) - η·∇E(w)
其中:
- η(eta)为学习率(learning rate),控制每一步权重更新的步长;
- ∇E(w) 表示误差函数 E 关于 w 的梯度,指示误差上升最快的方向,取负号即朝误差下降方向移动。
对感知机准则计算出梯度后,更新公式具体化为:
w^(t+1) = w^(t) + Σ η·x_i·t_i
即:每当遇到一个误分类样本,就把它的输入向量乘以符号 t_i、再乘以学习率 η,叠加到当前权重上。正例被误判为负例时权重"加上"该样本的特征方向,负例被误判为正例时权重"减去",从而逐步把决策边界推向正确位置。这一"出错才更新"的机制,也正是 data/own_framework.md 中提到的 随机梯度下降(SGD) 思想的雏形:实际训练中我们往往不是一次性用全部样本计算梯度,而是随机选取一小批(minibatch)样本来近似梯度。
5. 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
关键设计逐点说明:
- 函数签名默认参数:
num_iterations = 100(最多迭代轮数)、eta = 1(学习率),二者都是课程默认值,可在调用时按需调整; - 权重初始化:
weights = [0,0,0]对应"输入特征维度 N=2、外加一个偏置项"的常见做法(向量长度为 3); - 每轮采样:
random.choice从正例、负例集合中各随机抽一个样本,体现在线随机梯度更新的思想——每轮只依据一个正例与一个负例调整权重; - 分类判定:用
np.dot计算加权和 z,正例应得到z >= 0、负例应得到z < 0; - 更新规则:误判正例则把权重向正样本方向移动(加),误判负例则反向移动(减)。
需要说明的是,这份代码是课程讲义中的示意性教学代码,重在表达"误分类即沿 η·x_i·t_i 方向修正权重"的核心思想;其中的 weights.shape 在严格意义上并不等于错误分类样本的特征向量。若要落地为可执行脚本,更新项应替换为该误分类样本对应的特征向量(正例加、负例减),例如把 eta*weights.shape 改为 eta*np.array(pos) 与 eta*np.array(neg)。这与第 4.2 节推导出的精确更新公式 w^(t+1) = w^(t) + Σ η·x_i·t_i 完全一致。
6. 感知机在课程中的教学定位与后续延伸
6.1 它如何被 RAG Notebook 使用
在 notebook-rag-vector-databases.ipynb 中,data/perceptron.md 连同另外两份讲义文档被一起读取、切块并向量化,随后被提问 "what is a perceptron?" 检索命中——Notebook 中的检索结果与模型回复明确把感知机解释为"一种人工神经网络模型、用于二分类任务的基本单元"。这说明:
- 感知机讲义在本课程中不仅承担"神经网络入门"的教学功能,还充当**RAG 的接地数据(grounding data)**实例;
- 学习者可以亲手验证:把 data/perceptron.md 这类结构化、主题单一的领域文档喂给向量数据库,正是搭建 RAG 知识库的标准素材形态。
6.2 从单层感知机到多层感知机与反向传播
单层感知机的能力边界(只能处理线性可分问题)决定了深度学习必须走向多层结构。同目录的 data/own_framework.md 就是本课的"下一章",它完成了三件事:
- 引入多分类与回归能力,不再局限于两类;
- 把模型推广为多层叠加,例如:
z1 = w1·x + b1→z2 = w2·α(z1) + b2→f = σ(z2),其中 α 为非线性激活函数、σ 为 softmax 输出层,模型参数 θ 扩展为⟨w1,b1,w2,b2⟩; - 在多层结构下用链式法则逐层回传损失梯度,即反向传播(backpropagation):损失对浅层参数的导数由"损失→输出层→中间层"逐级乘积得到,而每一级表达式最左端都共享同一因子,因此可以高效地从损失函数出发反向遍历计算图。
而 data/frameworks.md 则进一步指出:手写反向传播非常繁琐,工业实践中我们借助 TensorFlow / PyTorch 等框架(底层 API 负责张量运算与自动求导,高层 API 把网络视为"层序列"),并需警惕过拟合——模型参数过多而训练样本过少时,训练误差可降至 0 但验证误差会急剧上升。这条知识脉络(感知机 → MLP + 反向传播 → 框架与过拟合)正是本仓库把三份文档并列放在 data/ 目录、并在 RAG Notebook 中一并检索的深层原因。
7. 小结与后续练习
本课(data/perceptron.md)的核心收获可概括为:
- 模型形态:感知机是二分类模型,输出为 +1 / -1,形式为
y(x) = f(w^T x),f 是阶跃激活函数; - 训练目标:最小化感知机准则 E(w) = -Σ w^T x_i · t_i,求和覆盖所有误分类样本;
- 优化方法:梯度下降,权重迭代公式 w^(t+1) = w^(t) - η·∇E(w),展开后即 w^(t+1) = w^(t) + Σ η·x_i·t_i;
- Python 实现:通过在线随机采样正负例、误分类即修正权重的方式完成训练。
原文档给出的学习任务可以这样延续:
- 动手挑战(Challenge):原讲义推荐通过 Microsoft Learn 的在线实验构建自己的感知机,该在线实验不在本仓库范围内;仓库内可直接动手的替代路径是 data/own_framework.md 所配套的多层感知机框架练习,从中可以看到现代神经网络内部的完整工作机制。
- 课程作业(Assignment):本课实现的感知机解决的是"区分两个手写数字"的二分类任务;更进一步,可尝试用你自己搭建的框架解决完整 MNIST 手写数字识别(十类分类),这正是 data/own_framework.md 文末布置的实验。
- 与生成式 AI 的结合实验:打开 notebook-rag-vector-databases.ipynb,观察
data/perceptron.md是如何被切块、向量化、写入检索索引,并最终以检索增强的方式回答"what is a perceptron?"的——这让你同时掌握两类技能:神经网络的历史起点与 RAG 知识库的构建方式。
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