Python中的感知器学习算法2025 年 1 月 5 日 | 23 分钟阅读 感知器算法由 Frank Rosenblatt 创建,其灵感来源于我们大脑的基本单元(即神经元)如何处理信息。该算法以 McCulloch-Pitts 神经元概念和 Hebb 的研究为基础。现在,尽管感知器算法拥有有趣的历史,并帮助我们理解单层神经网络的基础知识,但它并非当今实际应用中常用的算法。我们主要研究它的历史意义及其作为最简单的单层神经网络的作用。 感知器,简称 Perceptron,是 Rosenblatt 这位学者于 1958 年提出的一个概念。它堪比人工智能神经网络 (ANN) 的鼻祖,ANN 是旨在模拟人脑功能的软件应用程序。由于这个概念非常新颖,当时的神经网络社区对此兴趣盎然。这篇题为《感知器:大脑知识保留与组织的一个条件模型》的出版物对现代神经网络作为一项技术的接受度和实用性产生了重大影响。它堪比许多从根本上改变历史进程的科学突破之一。 早在 1969 年,机器学习领域发生了一件被称为“AI 冬天”的事情。对于神经网络(一种人工智能)来说,那是一个艰难的时期。两位科学家 Minsky 和 Papert 写了一本书,名为《感知器:计算几何学导论》。这本书使神经网络的研究放缓了大约十年。有些人对这本书争论不休,但它确实表明,一种称为“感知器”的基本神经网络无法处理非直线且复杂的非线性数据。由于大多数真实世界的数据都不是简单直线的,所以感知器和神经网络研究似乎可能失败。从 Minsky 和 Papert 写书到人们认为神经网络可以改变行业但未能实现之间,人们对神经网络失去了兴趣。直到 20 世纪 70 年代,学者们才开始尝试更高级的网络(也称为多层感知器)和一种名为反向传播的全新方法,神经网络才再次开始流行。然而,鉴于感知器是更大网络的基础,理解它至关重要。在本节中,我们将解释感知器的工作原理和学习过程(使用 delta 规则)。我们还将探讨感知器是否应该停止接收新信息。最后,我们将演示如何仅使用 Python 构建感知器,然后将其应用于证明它无法处理复杂的非线性数据。 感知器过程是一个简单的机器学习设备,用于将对象分为两组之一。将其视为神经网络或人造器官领域的基本模型。 想象它是一个脑细胞(神经元),它读取一些数据并响应:“嘿,我倾向于认为这属于 A 类或 B 类。”为了做出这个决定,它计算一个特殊数字,称为“激活”。这个激活是通过对信息和另一个称为“偏差”的数字进行一些数学运算来找到的。 如果激活最终是一个正数(大于 0.0),它会说:“这是 A 类!”如果激活为零或负数,它会说:“不,这是 B 类。” 因此,简单来说,它的工作方式类似于一个神经网络,它使用它分析的数字来确定某物是属于一个组还是另一个组。如果证据表明它可能属于一个类别,它会表示“是”;否则,它会表示“否”。 例如,当我们使用逻辑回归、逻辑回归和线性回归等系统时,它们通过使用某些数字(称为系数)来生成估计值。以特定方式组织信息以方便它们工作是一个很好的概念。 感知器是一种工具,可以帮助我们在这两种不同的事物之间做出决定,例如将电子邮件分类为垃圾邮件或非垃圾邮件。这就像在图表中在两者之间画一条线。我们称这条线为“超平面”。当事物可以用直线整齐地划分时,感知器非常有效。 在感知器中,它使用的数字称为“输入权重”。这些数字需要设置得恰到好处,才能使感知器正常工作。我们通过使用一种称为“随机梯度下降”的特定方法来训练感知器。这就像教感知器做出更好的决定。 修正这些权重以减少错误的过程就像微调乐器以演奏出正确的旋律一样。在机器学习中,我们有一个规则,称为感知器更新规则。其思想是根据所犯的错误,朝着正确的方向稍微调整权重。 这并非只发生一次。我们不会只给模型一个例子就完事。相反,我们会一遍又一遍地重复这个过程,处理许多例子。每次我们遍历所有例子,就像完成了一轮,我们称之为“时期”。这有助于模型看到许多不同的场景,并通过练习变得更好。 但这里有一个小小的变化。我们不能一下子将所有错误都加载到模型上。那就像对一个初学者音乐家施加过多的乐器调整一样。所以,我们一次只调整一点权重,分成小块。每次调整权重的多少取决于一个叫做“学习率”的东西。这就像控制模型学习的速度。如果学习率太高,模型可能会学得太快,但却无法真正理解音乐(数据)。相反,如果学习率太低,学习过程可能会变慢。 一言以蔽之,最后(权重 (t + 1) = 权重 (t) + 学习率 * (预期_i - 预测_i) * 输入_i)的方程式在数学上等同于说,“让我们开始吧!”根据它们的偏差程度和我们选择的学习速度,逐步改变这些值。” 因此,关键在于逐渐训练系统生成更好预测的能力,类似于音乐家通过单独练习每个和弦来学习旋律的方式。 何时停止训练:在教育计算机程序时,我们必须知道何时停止。当软件出色地完成其工作或无法进一步完成时,我们就可以停止。我们也可以选择停止。
因此,我们旨在每次训练程序时都提高其性能。为了更快地进行教育,我们从随机信息开始,重新排列片段,并确保我们多次测试它以达到良好的整体结果。我们还调整它所采取的步骤大小以及它应该有多少轮练习。 AND 或 AND XOR 数据集“在我们深入理解感知器之前,先谈谈‘按位运算’。这些运算包括 AND、OR 和 XOR(异或),如果你上过基础计算机科学课程,可能已经遇到过。 这些按位计算现在用来做什么?它们对仅为 0 和 1 的二进制数字对进行操作;因此,它们生成一个任意数字。所以,假设您希望将一对开关与 0 或 1 的值配对。有四种方法可以实现,下表列出了 AND、OR 和 XOR 的结果:让我们看一些处理值对的基本函数。考虑我们正在处理一对开关,一个标记为“x0”,另一个标记为“x1”,每个开关都可以打开 (1) 或关闭 (0)。 ![]()
现在,我们究竟为什么关心这些程序?它们可能看起来很简单,但它们具有很大的影响力。它们经常被用作评估和增强预测系统的基础组件。 如果我们用红线表示零结果,用蓝星表示一个结果来显示这些程序的结果,我们就会不可避免地在图 1 中看到一个引人入胜的设计。 ![]() 在机器学习领域,我们经常面临各种各样的知识。有些数据可以很容易地分离或划分,就像把东西放进两个盒子一样。任何人都可以通过画一条直线来区分这种类型的数据——“线性可分”数据。 想象一下你拿着两个包裹,一个上面写着“0”,另一个上面写着“1”。为了使你放入每个容器中的物品不同,你可以划一条线。 然而,某些信息可以归结到那个级别。XOR 示例是一个例外。使用 XOR 将对象分成相应的“0”和“1”组并使用一条漂亮的平行线是困难的。XOR 示例说明了“非线性可恢复”数据,这证明更加困难。 在现实世界中,我们经常遇到像 XOR 这样的线性独立数据。为了管理这种复杂的数据,我们使用的机器学习算法需要具备这种能力。 我们采用一种特殊的设置来评估我们的算法在这方面的效果。我们使用相同的材料来训练和测试我们的算法,而不是将其分成不同的训练集和测试集。这使我们能够评估我们的算法如何识别现有信息中可识别的趋势。 重要的是,线性可分的 AND 和 OR 过程可以被感知器方法正确分类;然而,该方法不能分类线性可分的 XOR 数据。这表明了该算法在管理日益复杂的数据方面的局限性。 感知器架构1958 年,Rosenblatt 引入了一种称为感知器的东西。把它想象成一个学习系统,它使用带标签的例子,就像一位老师指导你一样。它接收被称为“特征向量”或原始像素数据的东西,并找出它们的类别。 把感知器想象成一个简单的盒子,有 N 个输入按钮,每个要分类的项目一个。它只有一层,末端只有一个按钮。所以,你通过这些按钮输入数据。 这个盒子有连接和分配给每个输入按钮的权重。这些权重决定了每个按钮的重要性。将所有关键值相加后,滑块选择最终响应是 0 还是 1。它充当决策者,如果值为 0 则声明“类别 #1”,如果值为 1 则声明“课程 #2”。然而,感知器只能以最基本的方式将项目分为两组,使其类似于一个自动设备。 ![]() 步骤 1: 首先为我们的权重向量设置一堆小的随机值,就像一组我们将用来进行预测的旋钮。 步骤 2: 让我们通过继续执行以下步骤来开始,直到发生某个事件(我们稍后会讲到)。
现在,关于“直到感知器收敛”的部分:我们不断重复这些步骤(1、2a、2b 和 2c),直到我们擅长进行预测。当我们对预测的准确性感到满意后,我们就称感知器“收敛”了。 因此,简单来说,这项技术类似于试图从数据中获取知识。我们从一些任意的假设(权重)开始,利用这些假设进行预测,然后逐步修改我们的估计以变得更好,直到我们非常擅长。我们不断这样做,直到我们对预测的准确性感到满意。 感知器训练过程和 Delta 规则训练感知器就像教一个简单的计算机程序做决策。假设有一些数据对于计算机来说,需要正确地解释和分类。为此,您需要修改应用程序代码中的一组值(权重)。 事情是这样的
因此,简单来说,我们通过逐步修改某些量(权重)来训练计算机程序识别和正确分类数据,直到它变得熟练。程序要精通此任务需要一些时间和多次尝试(epoch)。 我们再来讨论一下改进机器学习的方法。思考我们的软件如何利用大量数据来做出判断。它们被称为我们的“权重向量”。为了提高我们软件的决策能力,我们希望修改这些数字。 在这种情况下,我们采用“delta 规则”。它类似于一组方向。为了确定我们程序的判断是否正确,我们首先通过减去另外两个整数来计算数量。如果正确,这个数字应该是 0。如果错误,结果值是一个正数或负数,这表明我们的权重向量需要向哪个方向调整才能正确。 我们继续将这个量乘以一个不同的整数,以帮助我们进行较小的调整。这个不同的数字被称为“alpha”。获得正确的 alpha 值的重要性再怎么强调也不为过。如果它足够大,我们可能会把事情搞砸,因为我们改变的数字太多了。如果它足够小,我们就有可能没有充分改变它,我们的程序就不会改进。因此,找到理想的平衡至关重要。 考虑学习一项不熟悉的技能,例如如何骑自行车。考虑“ ”是教育旅程阶段的大小,只要我们从事“ ”。当“ ”很小时,您将缓慢而谨慎地移动以防止绕道。但是,学习可能需要相当长的时间,因为您进展缓慢。 我们再来讨论一下如何运用我们已经获得的知识。这类似于你每次练习骑自行车时都会进步一点。为了反映我们随着时间获得的知识,我们使用一个“权重向量”。这有助于我们保持前进。乍一看可能很难理解,所以如果这听起来很复杂,请不要担心。 感知器训练终止当我们训练一个计算机程序,比如感知器时,我们会不断向它展示示例,直到它全部正确,或者直到我们决定它已经尝试了足够多次。如果我们使用一个非常小的“α”值,并且我们的示例可以整齐地分为两组,那么我们就知道它已经完成。 但是,如果我们的示例不能整齐地分成两组,或者我们选择了错误的 α 值怎么办?训练会永远进行下去吗?不。当软件反复犯完全相同的错误时,这表明材料对它来说太复杂而无法理解,我们通常会在特定次数的试验后停止,或者如果软件完全停止学习。 在 Python 中实现感知器感知器技术已经介绍完毕,现在是时候使用 Python 来实现它了。我们将在“pyimagesearch.nn”模块中添加一个名为“perceptron.py”的目录。这个文件将包含我们真正的感知器实现。 ![]() 创建文档时,请访问它并插入以下代码 ![]() 我们声明在第 5 行中它类中的一个“构造函数”。这个构造函数接受两个参数 N:这是我们输入特征向量中的列数。在我们的例子中,由于我们处理的是位运算数据集,我们将 N 设置为 2,因为有两个输入。 alpha:这是一个数字,它决定了我们感知器的学习速度。我们将其默认值设置为 0.1。通常,人们会为 alpha 选择 0.1、0.01 或 0.001 等值。 第 7 行是我们用随机数填充权重矩阵 W 的地方。这些随机数来自所谓的“正态”(高斯)分布。这个分布的平均值(均值)为零,标准差为一。我们的权重矩阵将有 N + 1 个值,这包括特征向量中 N 个输入中的每一个,以及一个额外的“偏差”值。我们还在这里做了一些小计算,将 W 除以输入数量的平方根。这有助于我们缩放权重矩阵并更快地收敛(学习)。我们将在本章后面详细讨论权重初始化技术。 现在,让我们来谈谈“阶跃函数”。 ![]() 当然,让我们用更简单的语言来解释你提到的概念 模拟阶跃方程:这个函数的作用类似于阶跃方程。如果你给它一个数字“x”,如果“x”是正整数,它将返回一个值“1”。如果“x”不好(例如,0 或负数),我们将收到 0。 感知器的课程:我们使用一种称为“fit”的机制来训练我们的感知器,这是一种机器学习形式。Fit 是一个常用术语,表示使用信息训练模型的功能。如果您熟悉人工智能、Python 案例和 scikit-learn 包,您可能已经知道这一点。 ![]() “fit”函数的输入如下:这些是“fit”操作的一些要求 'X':这是我们实际的训练数据。它就像我们用来教 AI 的信息。 'y':这表示我们的 AI 应该预测的正确答案或标签。 'epochs':这个数字告诉我们的感知器应该从数据中学习多少次。 添加偏差技巧:在代码的第 18 行,应用了一个名为“偏差技巧”的东西。这意味着我们在训练数据中添加了一列一。这个巧妙的技巧帮助我们将偏差(一种调整)视为我们的 AI 可以直接学习的东西,以及其他诸如权重之类的东西。 训练过程:组装完所有这些元素后,我们开始进行指令。在这里,我们的 AI 利用信息来获取知识,并努力在预测未来方面变得更加熟练。 当然,让我们简化你提供的文本中的技术语言 ![]() 这是程序通俗易懂的运行方式
在使用感知器进行预测时,我们遵循几个涉及简单数学运算的步骤。让我用通俗易懂的语言为你分解一下 步骤 1:进行预测
步骤 2:训练感知器
步骤 3:训练后进行预测
现在我们已经设置了感知器类,让我们在位数据集上测试它,看看我们的神经网络能表现得如何。 评估感知器位数据集让我们从创建一个名为“perceptron_or.py”的文件开始。在这个文件中,我们将致力于将感知器模型拟合到一个与“OR”操作相关的特殊数据集上。 ![]() 在代码的第 2 行和第 3 行,我们引入了所需的 Python 工具和包。具体来说,我们将使用我们自己实现的感知器模型。 接下来,在第 6 行和第 7 行,我们描述并创建 OR 数据集,它是一组遵循表 1 中所示规则的数据点。 现在,在第 11 行和第 12 行,我们进入训练部分。我们将使用这个数据集来训练我们的感知器,并且我们将以 α = 0.1 的学习率进行。这个训练过程将进行 20 次,或者我们称之为“20 个 epoch”。 最后,在我们的感知器从数据中学习后,我们将对其进行测试。我们将用它来检查它是否能够在新数据上正确执行 OR 函数。这样,我们就能知道我们的模型是否正确地学会了这项任务。 ![]() 在我们程序的这部分中,想象它就像一个食谱,在第 18 行,我们遍历 OR 数据集中的所有信息。对于其中的每一部分,我们将其输入到我们的计算机程序中,就像将配料输入到机器中一样,然后我们从机器中得到一个猜测(在第 21 行,就像机器告诉我们它在想什么一样)。 完成所有这些之后,在第 22 行和第 23 行,我们会在计算机屏幕上显示我们输入到机器中的内容、我们知道的正确答案以及机器的猜测。 要检查我们的感知器算法是否能学会执行 OR 函数,只需点击或输入一个按钮,上面写着 [在此处插入命令]。把它想象成按微波炉的“启动”按钮,看看它是否正确烹饪食物。 ![]() 当 x0 和 x1 都设置为零时,OR 运算结果为零;而所有其他组合都产生一的结果,我们的神经网络在预测方面表现准确。 接下来我们将探讨合取特征。为此,您必须创建一个名为“perceptron_and.py”的全新文件,并添加以下代码 只有第 6 行和第 7 行与程序的其余部分有所不同。我们现在处理的是 AND 数据集,而不是定义 OR 数据集。 现在,当我们运行以下命令时,我们可以看到感知器应用于 AND 函数时的表现 ![]() 我们的感知器再次成功地表示了该函数。当 x0 和 x1 恰好等于 1 时,AND 算法只在这种情况下返回“真”。对于任何其他参数组合,结果为零。 现在,让我们在“perceptron_xor.py”文件中深入探讨更复杂的 XOR 函数。 再次,我们只修改了第 6 行和第 7 行代码,其中我们定义了 XOR 数据。让我们首先了解 XOR:只有当一个“x”值为 1 而不是两者都为 1 时,它才为真。 ![]() 当我们运行以下命令时,我们可以看到感知器难以学习这种非直观的关系。换句话说,它无法理解 XOR。 无论你用不同的学习率或初始权重设置尝试多少次这个实验,单层感知器都无法正确理解 XOR 函数。我们需要一种更复杂的方法——我们需要具有非线性激活函数的多个层。这标志着深度学习的开始。 Python 中感知器算法的优点尽管感知器方法不如某些更复杂的学习技术复杂,但它比其他方法具有优势,尤其是在特定情况下。以下是一些考虑使用 Python 感知器算法的原因
然而,感知器方法也有几个缺点,就像生活中的任何事物一样。例如,与神经网络等复杂模型不同,它无法处理无法轻易分成两个独立组的数据。它的适应性也较差。 因此,它最适合数据分离简单的问题。对于更复杂的任务,您可能需要探索其他机器学习方法。 Python 中感知器算法的缺点感知器算法就像计算机世界中的一个简单工具,用于在两件事之间做出决定。它在某些情况下非常方便,但也有其怪癖。以下是当我们与 Python 一起使用感知器工具时,它不太好的地方
在现实世界中,感知器更像一本历史书。学习它很有趣,也适合教学,但当我们进行严肃的计算机工作时,我们通常会转向更智能、更通用的工具。 下一主题Python 中的断言相等 |
我们请求您订阅我们的新闻通讯以获取最新更新。