ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从 Rosenblatt 感知机到十类数字识别:单层神经网络原理、Python 实现与 MNIST 实战(AI for Beginners)

从 Rosenblatt 感知机到十类数字识别:单层神经网络原理、Python 实现与 MNIST 实战(AI for Beginners) 教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载导读本篇文章围绕 AI for Beginners 课程第 3 章「03-Perceptron」展开系统讲解感知机Perceptron这一最基础的神经网络模型——从 1957 年 Frank Rosenblatt 的 Mark-1 硬件原型到二分类模型的数学定义、基于感知机准则与梯度下降的训练算法再到在 MNIST 手写数字识别上的真实应用最后给出 one-vs-all 多分类扩展的实验方案。读完本文你将掌握感知机的完整数学原理、可直接运行的 Python 实现以及如何用 10 个感知机组合解决十类数字识别问题。感知机的历史1957 年的 Mark-1感知机是历史上最早尝试实现现代神经网络的方案之一。1957 年康奈尔航空实验室Cornell Aeronautical Laboratory的Frank Rosenblatt完成了名为Mark-1的硬件实现其设计目标是识别三角形、正方形、圆形等基本几何图形。Mark-1 的结构在今天看来非常朴素一张输入图像被表示为 20x20 的光电池阵列因此网络有400 个输入和1 个二值输出。整个网络只包含一个神经元——这种结构也被称为阈值逻辑单元Threshold Logic Unit。更特别的是网络权重在当时扮演着类似**电位器potentiometer**的角色训练阶段需要人工转动电位器来手动调节电路电阻从而改变每个输入的权重。Frank RosenblattMark-1 感知机当时的《纽约时报》对感知机寄予厚望称其为一台电子计算机的胚胎[海军]期望它能够行走、说话、看见、书写、自我复制并意识到自身的存在。这段历史细节完整记录在课程文档 03-Perceptron/README.md 中它提醒我们感知机虽然简单却是整个神经网络发展史的逻辑起点。感知机模型二分类与阶跃激活模型定义假设模型中有 N 个特征输入向量即为一个 N 维向量。感知机是一个二分类模型——它只能在输入数据的两类之间做出判别。对每个输入向量 x感知机输出 1 或 -1取决于该样本属于哪一类。输出按如下公式计算y(x) f(wᵀx)其中 w 是权重向量f 是阶跃激活函数step activation functionf(x) 1, 当 x ≥ 0 f(x) -1, 当 x 0阶跃函数直观地体现了感知机的开关特性输入特征与权重的加权和大于等于 0 时输出正类小于 0 时输出负类。公式与函数图像对应关系如下偏差项的简化技巧在 Perceptron.ipynb 中课程作者进一步指出一个完整的线性模型理论上还应该包含偏置项 b即理想计算式为 y f(wᵀx b)。但为了让实现更简洁可以在输入特征中额外增加一维该维的值恒为 1从而把偏置吸收进权重向量。这样做之后原本的 (w₁, w₂) 权重向量就变成了 (w₁, w₂, b) 三个参数训练代码无需特殊处理偏置。pos_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])这一增广特征手法在后续神经网络与线性模型的实现中会反复出现值得重点掌握。训练感知机感知机准则与梯度下降感知机准则Perceptron Criterion训练感知机的目标是找到一个权重向量 w使其能正确分类大多数样本也就是使误差 E 最小。误差由感知机准则定义E(w) -Σ wᵀxᵢtᵢ其中求和针对被错误分类的训练数据点 ixᵢ 是输入数据tᵢ 对负例和正例分别取 -1 或 1。这个准则的巧妙之处在于对错误分类的样本wᵀxᵢ 与 tᵢ 符号相反乘积为负因此 −Σ 取正值——错误越多、错得越离谱误差 E 越大全部正确分类时 E 趋近于 0甚至为负。梯度下降更新规则由于 E 是权重 w 的函数我们需要对其求极小值。课程采用经典的**梯度下降Gradient Descent**方法从一个初始权重 w⁽⁰⁾ 出发每一步按梯度的反方向更新权重w⁽ᵗ⁺¹⁾ w⁽ᵗ⁾ - η∇E(w)其中η 称为学习率learning rate∇E(w) 表示 E 关于 w 的梯度。对感知机准则求梯度后更新公式化简为w⁽ᵗ⁺¹⁾ w⁽ᵗ⁾ Σ η·xᵢ·tᵢ也就是说每遇到一个被错误分类的样本就把权重向修正该样本的方向推进一步——正例被误判为负例时加上 η·x负例被误判为正例时减去 η·x。这正是感知机学习规则的直觉本质。Python 实现课程讲义README中给出了简化示意版而 Perceptron.ipynb 中的完整实现更严谨、可直接运行其核心逻辑如下def train(positive_examples, negative_examples, num_iterations 100, learning_rate 0.01): num_dims positive_examples.shape[1] # 初始化权重这里用全 0随机初始化也是好主意 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): # 每次随机挑一个正例和一个负例 pos random.choice(positive_examples) neg random.choice(negative_examples) z np.dot(pos, weights) if z 0: # 正例被误判为负例 weights weights learning_rate * pos.reshape(weights.shape) z np.dot(neg, weights) if z 0: # 负例被误判为正例 weights weights - learning_rate * neg.reshape(weights.shape) # 周期性打印当前分类正确率 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感知机学得更快但可能越过overshoot最优解导致权重在最优解附近震荡较小的学习率如 0.001收敛更慢但可能更精确地逼近最优解可以尝试train(pos_examples, neg_examples, learning_rate0.1)观察差异。在 notebook 的实验中作者对比了[0.001, 0.01, 0.1, 1.0]四档学习率下训练 100 轮后的决策边界并提供了 ipywidgets 交互式滑块允许拖动学习率实时观察决策边界与最终权重w₀、w₁、偏置的变化。这是理解学习率是影响收敛的关键超参数的最佳直观实验。玩具问题实战二维数据上的线性可分构造数据先用 SciKit Learn 的make_classification生成一个双特征玩具分类问题课程以医学中依据肿瘤大小和年龄判断良性/恶性作类比并将原始 0/1 标签转换为 -1/1按 8:2 划分训练集与测试集n 50 X, Y make_classification(n_samples n, n_features2, n_redundant0, n_informative2, flip_y0) Y Y*2-1 # 将初始 0/1 值转换为 -1/1 X X.astype(np.float32); Y Y.astype(np.int32) # 划分训练集与测试集 train_x, test_x np.split(X, [ n*8//10]) train_labels, test_labels np.split(Y, [n*8//10])训练过程观察在训练集上运行train(pos_examples, neg_examples)后每 10 轮打印一次正确率。从 notebook 的实际输出可以看到初始正确率约 50%随后很快提升到接近 90% 的水平——这直观地展示了感知机在线性可分数据上的快速收敛能力。决策边界感知机的分类依据是 wᵀx 的符号因此两类样本的分隔线就是wᵀx 0。在二维情形下记增广维 x₂1分隔线方程为 w₀x₀ w₁x₁ w₂ 0。将训练后的权重代入即可在散点图上画出绿色的决策边界正例蓝点与负例红点被一条直线清晰分开。测试集评估将测试集同样补上一维常数 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)这个accuracy函数与实验 notebook 中评估多分类模型时使用的口径一致可以作为通用的评估模板。感知机的局限XOR 问题与线性可分性感知机本质上是线性分类器只有当两类数据线性可分能被一条直线分开时训练过程才能收敛否则训练将一直无法稳定。最经典的失败案例是XOR异或问题。XOR 布尔函数的真值表为01001110把四个输入点按标签分为正负两类后运行训练pos_examples_xor np.array([[1,0,1],[0,1,1]]) neg_examples_xor np.array([[1,1,1],[0,0,1]]) snapshots_xor train_graph(pos_examples_xor,neg_examples_xor,1000)无论训练多少轮准确率始终无法超过 75%——因为在二维平面上不存在一条能同时正确分开这四点的直线。XOR 问题是感知机局限的经典例子1969 年 Marvin Minsky 与 Seymour Papert 在著作《Perceptrons》中正式指出了这一点并一度抑制了神经网络领域近十年的研究。而正如课程后续内容所示**多层感知机MLP**完全有能力解决这类非线性问题——这也为课程的后续章节埋下了伏笔。MNIST 实战手写数字的二分类尽管感知机无法解决 XOR它仍能胜任许多更复杂的任务例如手写字符识别。数据集MNISTModified National Institute of Standards and Technology是机器学习入门最常用的数据集包含60000 张训练手写数字图采集自该研究所约 250 名学生与员工和10000 张测试图来自不同个体所有图像均为28x28 像素的灰度图。仓库已内置数据文件 data/mnist.pkl.gznotebook 中通过以下方式加载with gzip.open(../../../data/mnist.pkl.gz, rb) as mnist_pickle: MNIST pickle.load(mnist_pickle, encodinglatin1)MNIST[Train][Features]为样本矩阵MNIST[Train][Labels]为对应数字标签。构造二分类数据由于感知机是二分类器先把它限制在识别两个数字的问题上。set_mnist_pos_neg函数从数据集中筛出指定两个数字的图像作为正负样本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 pos1, neg1 set_mnist_pos_neg(1, 0) # 数字 1 vs 数字 0 pos2, neg2 set_mnist_pos_neg(2, 5) # 数字 2 vs 数字 5训练结果与权重可视化对 1 vs 0 训练 1000 轮准确率很快逼近 100%。notebook 提供滑块控件让你穿越训练过程并可视化 28x28 的权重矩阵权重矩阵中间位置数值高对应数字 1 通常占据的像素两侧数值低/为负对应数字 0 的竖向笔画区域。因此当输入确实是 1 时中间像素乘以高权重产生正值输入是 0 时相应像素乘以负值。这个可视化是理解感知机到底学到了什么的最佳窗口——它学到的就是一张模板。值得注意的是这种判别方式依赖 MNIST 数字居中且位置规整的特性如果数字 1 水平偏移到 0 的竖向笔画位置感知机就可能给出错误结果。这一局限在后续课程中会通过更强大的网络结构来克服。而对 2 vs 5 的训练中尽管准确率可超过 85%但可以明显看到感知机在某一点后停止学习——因为这两类数字并不线性可分。用 PCA主成分分析把 784 维像素降维到 2 维后可以直观验证0 和 1 能被直线清晰分开而 2 和 5 找不到好的投影方向投影点相互交叠这正是误分类的来源。相关分析代码见 Perceptron.ipynb 的pca_analysis函数。实验从二分类走向十类数字识别one-vs-all课程配套的 lab/README.md 给出了一个完整的进阶实验将本课的二分类感知机扩展为能识别任意数字的多分类器并在训练集与测试集上计算分类准确率、打印混淆矩阵。任务要点如下构造 10 个 one-vs-all 数据集对每个数字 d0-9构造数字 d vs 其余所有数字的二分类数据集。实验起点 notebook PerceptronMultiClass.ipynb 中提供的set_mnist_pos_neg(positive_label, negative_label)只支持两两数字对比需要将其改造为 one-vs-all 版本训练 10 个感知机每个数字训练一个二分类感知机复用本课train函数的逻辑该 notebook 已内置了课程版的train代码定义分类函数对输入图像分别用 10 个感知机打分取得分最高的类别。实验还给出了一个关键优化提示如果把 10 个感知机的权重向量拼成一个矩阵就能通过一次矩阵乘法同时完成 10 个感知机的前向计算随后只需在输出上执行argmax即可得到最可能的数字。这个权重合并、一次矩阵乘法 argmax的技巧在本质上已经非常接近现代神经网络输出层的 softmax 分类思想——它是从感知机迈向真实深度学习框架的重要一步。小结本课要点通过本课可以总结出以下几点核心认知与 Perceptron.ipynb 的 Takeaway 一致感知机是最简单的神经网络架构——单层、单神经元感知机可以手工实现其训练过程基于梯度下降的朴素推导代码不过几十行尽管简单单层感知机能解决手写数字识别这类相当复杂的问题二分类场景下单层感知机是线性分类器其分类能力与 logistic 回归等价在样本空间中感知机用一个超平面分隔两类输入数据因此对线性不可分数据如 XOR、2 与 5 的判别无能为力这需要靠后续课程中的多层网络来解决。配套的 Perceptron.ipynb 与 PerceptronMultiClass.ipynb 是完整的可运行实验环境建议在 Jupyter 中逐单元执行并拖动交互滑块亲自体验训练过程。课程还配套了课前/课后在线测验用于自测以及基于 Azure ML 设计器的扩展挑战可在课程页面的 03-Perceptron/README.md 中找到入口。理解好感知机——包括它的模型、学习规则和线性可分边界——是继续学习反向传播、多层感知机与各类深度学习模型的必要基础。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐从感知机到现代神经网络AI-For-Beginners 单层感知机原理与 Python 实战指南从感知机到现代神经网络AI For Beginners 单层感知机原理与 Python 实战指南 本篇技术指南以 AI For Beginners 课程体系中教程人工智能机器学习深度学习AI-For-Beginners 感知机实战指南从单层神经元的数学原理到 MNIST 手写数字分类AI For Beginners 感知机实战指南从单层神经元的数学原理到 MNIST 手写数字分类 本指南以 AI For Beginners 课程中第 03教程人工智能机器学习深度学习AI for Beginners 感知机多类分类实战从 MNIST 二分类到 One-vs-All 十类数字识别AI for Beginners 感知机多类分类实战从 MNIST 二分类到 One vs All 十类数字识别 本指南围绕《AI for Beginners教程人工智能机器学习深度学习上一篇AWS MCP Servers云市场在AWS Marketplace中部署MCP的快速通道下一篇5个实用技巧用Taste-Skill打造独具品味的AI设计作品创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表