从生物学到人工智能:感知机(Perceptron)_向量_权重
Python中的生物启示线性分类器
创造能够以与人类相似的办法行动和推理的机器一贯是一项我们长期努力并坚持的任务。虽然近年来人工智能(AI)和机器学习取得了很多进展,但60多年前已经有了一些根本事情。这些早期观点的灵感来源于人类大脑等生物神经网络的理论事理。 1943年,McCulloch和Pitts揭橥了一篇论文,描述了基于“all-or-none”活动特色的网络中(人造)神经元的关系。这种“all-or-none”特色是指生物神经元对刺激做出反应或保持沉默。例如,可以在形成人脑的微电极记录中看到对这种行为的直接不雅观察。在关于人工神经网络的最初论文产生之后,弗兰克罗森布拉特于1957年揭橥了一篇题为“感知机 - 感知和识别自动机”的论文。 Perceptron(感知机)是一个监督的线性分类器,利用可调节的权重分配一个输入向量类。类似于1943年McCulloch和Pitts的论文,它背后的想法是类似于生物神经元的打算,以创建一个可以学习的代理。不才文中,我们将理解Perceptron背后的想法以及如何在Python代码中实现它。
Perceptron的硬件实现(Mark I)
你的大脑包含数十亿个神经元,每个神经元都可以看作是一个处理单元,它集成输入并根据阈值标准创建二进制相应。在生物学术语中,输入是神经元的树突处的膜去极化,其向体细胞扩散。如果去极化足够强,神经元将通过产生将沿轴突行进的动作电位作出相应。在轴突末端,神经递质将开释到突触间隙中,这将使下贱神经元的树突膜去极化。可在此处找到有关此过程的更详细解释。(https://towardsdatascience.com/using-signal-processing-to-extract-neural-events-in-python-964437dc7c0)现在真正的线索是生物神经元网络可以学习如何相应其输入。此功能的术语是可塑性,正是这一特性使静态软件和能够适应其环境的智能代理之间产生差异。然而,1943年麦卡洛克和皮茨的论文没有办理这个问题,而是专注于神经元之间的关系。另一方面,Perceptron为塑性问题供应了一个优雅的办理方案:权重。 Perceptron的每个输入都乘以一个权重,然后进行结果总结。因此,通过改变输入的权重,我们可以改变Perceptrons相应。下图给出了Perceptron如何运行的示意图。
图1:Perceptron的示意图
在图1的左侧,输入表示为x1,x2,x3,... xn。每个输入乘以权重w0,w1,w2,... wn。在该乘法步骤之后,结果总结并通过激活函数。在感知器的情形下,激活功能类似于生物神经元通过重质阶梯功能的“all-or-none”特色。这意味着任何值≤0都将转换为0,而任何值> 0将变为1。我们也可以将上面的值写为:
个中w是权重向量,x是输入向量,b是偏差项。在图1中,我们已经将偏置包括在输入向量中作为1(赤色方块)并且将权重向量作为w0包括在内。以是在这种情形下,我们须要打算输入和权重向量的点积。但仍有一个问题:我们如何调度权重?毕竟这是Perceptron学习的办法。考虑这一点的一种方法如下。我们的Perceptron应根据其输入做出二元决策(0或1)。因此,假设我们有两个数据点,一个属于1类,另一个属于0类,Perceptron必须学习每个数据点的类。该任务不才面的图2中可视化。
图2:几何阐明
从图2中我们可以看到问题可以被视为找到决策边界,也称为超平面(赤色虚线),将两个组分开。赤色虚线上方的所有内容都是0级,超平面下方的所有内容都是1类。超平面由与其垂直的权重向量w'定义(赤色实心向量)。因此,利用权重向量打算输入向量的点积并将结果通过激活函数将给出输入的分类。因此,如果我们看一下数据点1,我们也可以将其绘制为矢量并垂直于它,我们可以绘制另一个超平面(纯黄色线)。接下来,不雅观察输入向量2,我们可以再次绘制垂直于它的超平面(实线蓝色)。由于分离两组的超平面须要垂直于我们正在探求的权重向量,从图2中可以明显看出w'必须位于黄色和蓝色超平面之间(标记为“x的范围”)。因此,按照上述方法,我们可以实现如下学习规则。
首先,我们将权重向量中的所有值设置为零,包括偏差项。在二维输入的情形下,如图2所示,这意味着:w = [0 0 0]。然后我们将偏差1加到我们的第一个输入向量上,它给出了X(1)= [1,x1,x2]。现在我们打算X1和w的点积。这个打算的结果是0。通过激活函数通报0然后将X1分类为0级,这是精确的。因此不须要更新w。对X(2)做同样的事情也给我们0级缺点,以是我们须要通过以下学习规则来更新w:
在这种情形下,它意味着从精确的类(1)中减去我们的结果(类0),将结果乘以当前输入向量并将其添加到w。这将导致:w = [1 x1,x2]。如果有更多的数据点,我们将连续对每个输入向量利用此过程,并且每次迭代时,我们将更靠近描述超平面的权重向量,该超平面线性地分离我们的两个组。为了测试这个,我们接下来将在Python代码中实现Perceptron。
实现
为了开拓我们的Perceptron算法,我们将利用用scikit-learn天生的toy data,所有其他功能将利用NumPy实现。可以在此处找到所有代码(http://www.numpy.org/)。下面的代码将创建并可视化我们的toy data。
图3:用于测试Perceptron算法的数据
图3显示了我们刚刚创建的两个集群,我们可以看到它们可以通过超平面线性分离,这是Perceptron事情的条件条件。接下来,我们须要将偏差项添加到输入向量并用零初始化权重向量。
好的,现在我们准备编码Perceptron算法。正如我们从下面的代码中可以看到的,它是一个非常大略和优雅的算法。由于无法担保Perceptron会在一次通过中收敛,我们将连续10次将所有演习数据输入Perceptron,同时不断运用学习规则以确保。
那么让我们来看当作果。下面的动画可视化Perceptron如何搜索分隔两个群集的超平面。正如我们所看到的,它终极提出了一种办理方案,个中1类数据点之一位于超平面上。就像我们之前在激活函数中指定的那样,该办理方案实际上是精确的:如果x> = 1则返回1,否则0,如果您感兴趣,可以利用以下激活函数重新运行上述代码,以查当作果如何变动:return 0如果x <= 0,则为1
结论
正如我们所看到的,Perceptron算法是实现有监督线性分类器的一种大略方法。然而,它也有缺点,例如,当组不可线性分离时,它不起浸染。它也是一种在线算法,这意味着我们一次只能将一个演习样例通报给它,如果我们有一个更大的数据集,演习过程就会变慢。
如果您想要这个项目的完全代码,可以在这里找到它。(https://github.com/akcarsten/Perceptron/blob/master/perceptron.ipynb)
本文系作者个人观点,不代表本站立场,转载请注明出处!