资讯详情

AI-For-Beginners 感知机实战指南:从 Mark-1 硬件到 MNIST 手写数字识别

📅 2026/10/1 1:54:05 | 华诺云谱 👁 阅读
AI-For-Beginners 感知机实战指南:从 Mark-1 硬件到 MNIST 手写数字识别
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载感知机Perceptron是 AI-For-Beginners 课程「神经网络入门」章节的第一个模型也是理解现代深度学习的一把钥匙。本指南以课程第 03 课《Introduction to Neural Networks: Perceptron》为核心结合仓库中的 Perceptron.ipynb 完整实现与多分类实验系统讲解感知机的数学模型、梯度下降训练过程、XOR 局限以及 MNIST 手写数字识别实战。读完本文你将能够独立实现一个可运行的感知机分类器并理解它与后续多层神经网络之间的联系。原始课程文档为 translations/ar/lessons/3-NeuralNetworks/03-Perceptron/README.md阿拉伯语版对应英文原版见 lessons/3-NeuralNetworks/03-Perceptron/README.md全套学习材料见课程总览 lessons/3-NeuralNetworks/README.md。历史背景1957 年的 Mark-1 硬件感知机感知机是第一个接近现代神经网络形态的尝试由康奈尔航空实验室Cornell Aeronautical Laboratory的 Frank Rosenblatt 于 1957 年提出。它的第一版并非软件程序而是一台名为Mark-1的实体硬件设备被设计用来识别三角形、正方形、圆形等原始几何图形。输入图像由 20×20 的光电池阵列表示因此网络共有400 个输入和1 个二值输出。整个网络只包含一个神经元也被称为阈值逻辑单元threshold logic unit。训练阶段网络权重由类似**电位器potentiometer**的可调电阻承担——电位器是一种允许用户调节电路电阻的器件训练过程本质上就是手工旋转这些电位器来改变权重取值。当时媒体对这项技术寄予了不切实际的厚望纽约时报曾写道电子计算机的胚胎海军期望它终将能够行走、说话、观看、书写、自我复制并拥有自我意识。这段历史提醒我们任何新技术在诞生初期都容易伴随过度乐观而感知机此后遇到的数学限制见下文 XOR 问题也正是对这一点的最好注脚。感知机模型线性二分类器假设模型有 N 个特征则输入向量 x 的维度为 N。感知机是一个二分类模型即只能区分两类输入数据。对每个输入向量 x感知机输出 1 或 -1取决于它属于哪一类。输出由如下公式计算y(x) f(wᵀx)其中 f 是阶跃激活函数step activation function从数学上看wᵀx 0定义了一个分类边界超平面对于两类线性可分的数据感知机就是在样本空间中寻找一个能把正负两类分开的超平面。这一点在 Perceptron.ipynb 中通过plot_boundary函数将分类线可视化当只有两个维度 x₀、x₁ 时分类线方程是w₀x₀ w₁x₁ w₂ 0注意代码中显式增加了一个恒等于 1 的第三维作为偏置项。消除偏置项的小技巧一个通用的线性模型本应写作 y f(wᵀx b)即包含偏置项 b。为简化模型笔记本中采用了一个经典技巧给输入特征额外增加一维该维度恒等于 1。这样偏置 b 就被吸收进了权重向量 w 的最后一个分量中权重初始化时一并学习即可。对应代码见 Perceptron.ipynbpos_examples np.array([ [t[0], t[1], 1] for i,t in enumerate(train_x) if train_labels[i]0]) neg_examples np.array([ [t[0], t[1], 1] for i,t in enumerate(train_x) if train_labels[i]0])训练感知机感知机准则与梯度下降训练感知机的目标是找到权重向量 w使它能正确分类大多数样本即让误差最小。误差 E 由**感知机准则perceptron criterion**定义E(w) -Σ wᵀxᵢtᵢ其中求和遍历所有被错误分类的训练数据点 ixᵢ 是输入数据tᵢ 为标签正例取 1、负例取 -1。E 被看作权重 w 的函数我们的任务是最小化它。常用方法是梯度下降gradient descent从一组初始权重 w⁽⁰⁾ 出发每一步按公式更新权重w⁽ᵗ⁺¹⁾ w⁽ᵗ⁾ - η∇E(w)这里 η 是学习率learning rate∇E(w) 是 E 的梯度。代入 E 的表达式计算梯度后可化简为w⁽ᵗ⁺¹⁾ w⁽ᵗ⁾ Σηxᵢtᵢ课程 README 中给出了简化的 Python 伪代码默认eta 1、迭代 100 次、权重初始化为[0, 0, 0]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可运行版本的训练实现来自课程笔记本真正可运行、带学习率与准确率监控的版本见 Perceptron.ipynb。它与 README 伪代码的核心逻辑一致——每轮随机抽取一个正例和一个负例检查感知机输出符号若分类错误则沿梯度方向调整权重def train(positive_examples, negative_examples, num_iterations 100, learning_rate 0.01): num_dims positive_examples.shape[1] # Initialize weights. # We initialize with 0 for simplicity, but random initialization is also a good idea weights np.zeros((num_dims,1)) pos_count positive_examples.shape[0] neg_count negative_examples.shape[0] report_frequency 10 for i in range(num_iterations): # Pick one positive and one negative example pos random.choice(positive_examples) neg random.choice(negative_examples) z np.dot(pos, weights) if z 0: # positive example was classified as negative weights weights learning_rate * pos.reshape(weights.shape) z np.dot(neg, weights) if z 0: # negative example was classified as positive weights weights - learning_rate * neg.reshape(weights.shape) # Periodically, print out the current accuracy on all examples if i % report_frequency 0: pos_out np.dot(positive_examples, weights) neg_out np.dot(negative_examples, weights) pos_correct (pos_out 0).sum() / float(pos_count) neg_correct (neg_out 0).sum() / float(neg_count) print(Iteration{}, pos correct{}, neg correct{}.format(i,pos_correct,neg_correct)) return weights学习率 η 的作用与调参经验learning_rate默认0.01控制每一步训练中权重调整的幅度对应梯度下降更新公式 w⁽ᵗ⁺¹⁾ w⁽ᵗ⁾ ηxₙtₙ。课程笔记本专门给出了一组实验建议较大的学习率如 1.0感知机学得更快但可能越过最优解导致震荡较小的学习率如 0.001收敛更慢但可能更精确地逼近最优解可以调用train(pos_examples, neg_examples, learning_rate0.1)自行对比效果。笔记本中还提供了两种可视化实验方式一是用 2×2 子图一次性对比[0.001, 0.01, 0.1, 1.0]四个学习率下的决策边界二是用ipywidgets的FloatSlider范围 0.0011.0构造交互式滑块实时观察决策边界与最终权重柱状图的变化。从玩具问题出发完整训练流程源码拆解Perceptron.ipynb 以一个医疗类比引入玩具问题根据肿瘤的大小和年龄两个特征判断肿瘤是良性还是恶性。实现步骤如下生成数据用sklearn.datasets.make_classification生成 50 个样本、2 个特征的数据集并将标签从 0/1 转换为 -1/1Y Y*2-1划分数据np.split按 8:2 划分训练集与测试集构造正负样本按标签拆分出pos_examples与neg_examples并追加恒为 1 的偏置维度训练调用train函数输出每次迭代的正/负样本准确率可视化plot_boundary绘制决策边界与两类散点蓝色正例、红色负例、绿色分类线。笔记本中的实际训练输出显示初始准确率约为 50%经过约 1020 次迭代迅速提升到接近 90%——这正是感知机学习的典型收敛曲线。在测试集上评估准确率训练完成后用独立测试集评估模型泛化能力。测试样本同样需要补一维恒 1 的偏置特征与权重矩阵相乘后检查符号是否与标签1/-1一致def accuracy(weights, test_x, test_labels): res np.dot(np.c_[test_x,np.ones(len(test_x))],weights) return (res.reshape(test_labels.shape)*test_labels0).sum()/float(len(test_labels)) accuracy(wts, test_x, test_labels)在课程示例中这个玩具问题的测试准确率达到了1.0100%因为该数据集恰好是线性可分的。感知机的局限无法学习的 XOR 问题感知机是一个线性分类器。只有当两类数据线性可分能被一条直线/超平面分开时它才能表现良好否则训练过程无法收敛。最经典的失败案例是XOR异或问题。XOR 布尔函数的真值表如下输入01001110课程笔记本手工构造了 XOR 的训练样本并调用同样的train_graph函数训练 1000 轮pos_examples_xor np.array([[1,0,1],[0,1,1]]) neg_examples_xor np.array([[1,1,1],[0,0,1]])结果准确率始终无法超过 75%——因为在二维平面上不存在一条能同时把四个点全部正确分开的直线。这个现象最早由 Marvin Minsky 和 Seymour Papert 在 1969 年的著作《Perceptrons》中明确指出直接导致神经网络研究陷入近 10 年的低谷。需要强调的是这一局限仅针对单层感知机课程后续的多层网络章节将展示多层感知机可以完美解决 XOR 这类非线性问题。实战进阶MNIST 手写数字识别尽管单层感知机解决不了 XOR却能处理远比它复杂的现实问题——例如手写字符识别。MNIST 数据集概览MNISTModified National Institute of Standards and Technology是机器学习入门最经典的数据集由美国国家标准与技术研究院整理训练集含 60000 张手写数字图像采集自约 250 名该机构的学生与员工测试集含 10000 张来自不同的书写者。所有图像均为28×28 像素的灰度图即展平后每个样本有 784 个输入特征。仓库中已内置压缩好的数据集文件 data/mnist.pkl.gz课程笔记本通过如下方式加载with gzip.open(../../../data/mnist.pkl.gz, rb) as mnist_pickle: MNIST pickle.load(mnist_pickle, encodinglatin1)加载后可按需对特征做归一化features MNIST[Train][Features].astype(np.float32) / 256.0。二分类实验0 vs 1 与 2 vs 5由于感知机是二分类器课程先将问题限定为区分两个数字。set_mnist_pos_neg(positive_label, negative_label)函数按标签索引分别取出正负样本图像def set_mnist_pos_neg(positive_label, negative_label): positive_indices [i for i, j in enumerate(MNIST[Train][Labels]) if j positive_label] negative_indices [i for i, j in enumerate(MNIST[Train][Labels]) if j negative_label] positive_images MNIST[Train][Features][positive_indices] negative_images MNIST[Train][Features][negative_indices] return positive_images, negative_images实验结果很有启发性0 vs 1准确率极快地逼近 100%。把训练得到的 784 维权重矩阵reshape(28, 28)画出来可以看到权重场中央是高的正值对应数字 1 的笔画位置两侧是低的负值对应数字 0 的圆环位置。这正是感知机工作原理的直观体现输入是 1 时中间像素乘以大正数产生正输出输入是 0 时相应像素乘以负数。2 vs 5准确率也能达到 85% 以上但感知机在某一点后明显停止学习两类并不完全线性可分。注意如果给感知机一个稍微水平偏移的数字 1使其像素落入数字 0 的竖线区域结果就可能出错。因为 MNIST 的所有数字都已居中对齐感知机的判断恰恰依赖这种对齐性质。用 PCA 解释分类困境为什么 2 和 5 难分而 0 和 1 好分课程用**主成分分析PCA**给出了可视化解释。PCA 是一种降维技术笔记本将其用于把 784 维输入压缩到 2 维并绘图可以把这一过程理解为旋转原始的 784 维空间找到能最好地区分类别的二维投影。结果清晰明了0 与 1在二维投影中能被一条直线明确分开说明它们在原始 784 维空间中线性可分2 与 5找不到能清晰分离两类点的投影因此必然存在误分类样本。课程预告后续将学习用神经网络构建非线性分类器并解决数字未对齐的问题——届时 MNIST 十类分类准确率将轻松超过 99%。延伸作业从二分类走向十类分类课程配套实验 lab/README.md 将二分类感知机扩展为完整的多类数字识别利用本课已实现的 MNIST 二分类代码构建一个能识别全部 10 个数字的多类分类器计算训练集与测试集的分类准确率并输出混淆矩阵confusion matrix。作业的要点对应 lab/PerceptronMultiClass.ipynb为每个数字创建一个该数字 vs 其他所有数字的one-vs-all二分类数据集训练10 个二分类感知机每个数字一个定义一个classify函数完成输入数字的分类评测分类准确率并打印混淆矩阵可选将 10 个感知机的权重合并成一个权重矩阵用一次矩阵乘法同时完成全部 10 个感知机的前向计算再对输出执行argmax得到最可能的数字。其中第 5 步是一个非常优雅的向量化技巧权重矩阵的每一行对应一个数字的感知机输入向量与整个矩阵相乘后得到 10 个得分argmax直接给出预测类别。这个思路正是后来神经网络输出层得分 argmax的雏形。小结单层感知机的本质通过本课的学习与动手实验可以总结出关于感知机的几个核心结论与课程笔记本的 Takeaway 一致感知机是最简单的神经网络架构——单层、单神经元模型我们手写实现了基于梯度下降的简单训练流程没有依赖任何深度学习框架尽管结构简单单层感知机足以解决 MNIST 手写数字识别这类较复杂的问题单层感知机是线性分类器其分类能力与逻辑回归logistic regression等价在样本空间中感知机用超平面分离两类输入数据。更进一步感知机的数学形态y f(wᵀx)、损失定义与梯度下降更新规则构成了理解后续所有神经网络内容多层网络、反向传播、现代框架的共同底座。继续学习可前往课程下一课《多层网络与自建框架》以及配套的框架实践PyTorch 入门与 Keras/TensorFlow 入门。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐electerm widgets打开本地服务与批量操作面板的完整路径electerm widgets打开本地服务与批量操作面板的完整路径 第一次想把本地文件给手机打开 连着公司内网的一台机器想用手机看磁盘里的一份报表又不教程人工智能机器学习深度学习AI for Beginners从 1957 年的 Mark-1 到手写数字识别的感知机Perceptron完整入门AI for Beginners从 1957 年的 Mark 1 到手写数字识别的感知机Perceptron完整入门 本课 lessons/3 Neur教程人工智能机器学习深度学习感知机多分类实战基于 One-vs-All 与 argmax 的 MNIST 手写数字识别AI-For-Beginners 课程实验解析感知机多分类实战基于 One vs All 与 argmax 的 MNIST 手写数字识别AI For Beginners 课程实验解析 本文围绕 AI教程人工智能机器学习深度学习上一篇Loop免费开源的macOS窗口管理终极方案让桌面从此高效有序下一篇F_Record3步掌握Photoshop绘画过程录制轻松创作专业级教学视频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑