感知器:人工神经网络的构建块

源节点: 1216283

如果你是一名机器学习和人工智能爱好者,你一定听说过感知器这个词。许多深度学习课程的第一章都会讲授感知器。那么它到底是什么?其背后的灵感是什么?它到底是如何解决分类问题的呢?在本文中,我们将从感知器背后的生物学灵感开始,然后深入研究其数学技术细节,最后使用感知器单元从头开始构建二元分类器。

神经网络的生物学灵感

神经元(神经细胞)是神经系统的基本组成部分。人脑由数十亿个相互连接的神经元组成。它们负责接收和发送来自大脑的信号。如下图所示,典型的神经元由三个主要部分组成:树突、轴突和细胞体或胞体。树突是源自细胞体的树状分支。它们从其他神经元接收信息。体细胞是神经元的核心。它负责处理从树突接收到的信息。轴突就像一根电缆,神经元通过它发送信息。 接近尾声时,轴突分裂成许多分支,通过树突与其他神经元建立连接。这 轴突和其他神经元树突之间的连接称为突触。

1:生物神经元与人工神经网络

图片来源: 威廉姆斯,K.(2017 年,2 月 XNUMX 日)。 Keras 教程:Python 中的深度学习.

由于人工神经网络的灵感来自于大脑的功能,让我们看看大脑是如何工作的。大脑由数十亿个神经元组成的网络组成。它们通过突触以电信号和化学信号进行通信,其中来自一个神经元的信息被传输到其他神经元。传输过程涉及称为“动作电位”的电脉冲。对于要传输的信息,输入信号(脉冲)应该足够强以跨越一定的阈值障碍,然后只有神经元激活并进一步传输信号(输出)。

受神经元生物功能的启发,美国科学家弗兰克·罗森布拉特 (Franck Rosenblatt) 于 1957 年在康奈尔航空实验室提出了感知器的概念。

  • 神经元以不同强度的电脉冲形式从其他神经元接收信息。
  • 神经元整合从其他神经元接收到的所有脉冲。
  • 如果所得总和大于某个阈值,神经元就会“放电”,触发动作电位,并传输到其他连接的神经元。

感知器的主要组成部分

罗森布拉特的感知器基本上是一个二元分类器。感知器由 3 个主要部分组成:

  • 输入节点或输入层:输入层将初始数据输入系统进行进一步处理。每个输入节点都与一个数值相关联。它可以取任何实际值。
  • 权重和偏差:权重参数代表单元之间连接的强度。权重越高,相关输入神经元决定输出的影响就越强。偏差的作用与线性方程中的截距相同。
  • 激活函数:激活函数决定神经元是否会放电。最简单的激活函数是一个阶跃函数,但根据场景,可以使用不同的激活函数。

我们将在下一节中看到更多关于这些的内容。

感知器的工作原理

第一步,将所有输入值与其各自的权重相乘并相加。得到的结果称为加权和 Σwi*xi, 或者换句话说,  x1*w1 + x2*w2 +…wn*xn。该总和根据输入的重要性给出了输入的适当表示。另外,还有一个偏置项 b 添加到这个总和 Σwi*xi + b。偏差作为另一个模型参数(除了权重之外),可以通过调整来提高模型的性能。

第二步,激活函数 f 应用于上述总和 Σwi*xi + b 得到输出 Y = f(Σwi*xi + b)。根据场景和使用的激活函数, 输出 或者是 二进制 {1, 0} 或连续值。 

感知器的工作原理

(通常这两个步骤都表示为多层感知器中的单个步骤,为了更好地理解,这里我将它们显示为两个不同的步骤)

激活功能

生物神经元仅在超过特定阈值时才会放电。同样,人工神经元也只有在输入总和(加权和)超过某个阈值(假设为 0)时才会触发。直观地,我们可以想到这样的基于规则的方法 -

如果 Σwi*xi + b > 0:
输出=1
别的:
输出=0

它的图表将是这样的:

激活功能

这实际上是 Rosenblatt 最初使用的单位步长(阈值)激活函数。但正如您所看到的,该函数在 0 处不连续,因此会导致数学计算出现问题。上述函数的更平滑版本是 sigmoid 函数。它输出 0 到 1 之间的值。另一个是双曲正切(tanh) 函数,产生 -1 和 1 之间的输出。 sigmoid 和 tanh 函数都存在梯度消失问题。目前,ReLU 和 Leaky ReLU 是最常用的激活函数。它们在深度网络上相对稳定。

感知器作为二元分类器

到目前为止,我们已经看到了感知器的生物学灵感和数学原理。在本节中,我们将了解感知器如何解决线性分类问题。

导入一些库 –

从 sklearn.datasets 导入 make_blobs
将 matplotlib.pyplot 导入为 plt
将 numpy 导入为 np
%matplotlib 内联

使用生成虚拟数据集 make_blob scikit learn 提供的功能 –

# 生成数据集
X,Y = make_blobs(n_features = 2,中心= 2,n_samples = 1000,random_state = 12)
# 可视化数据集
plt.figure(图大小 = (6, 6))
plt.scatter(X[:, 0], X[:, 1], c = Y)
plt.title('基本事实', fontsize = 18)
plt.show()
感知器作为二元分类器

假设蓝点是 1,绿点是 0。使用感知器逻辑,我们可以创建一个决策边界(超平面) 用于分离图表上不同数据点的分类。

在我们继续之前,让我们向输入向量添加一个偏置项 -

# 为输入向量添加偏差
X_bias = np.ones([X.shape[0], 3])
X_偏差[:, 1:3] = X

数据集看起来像这样 – 

数据集

这里,上述数据集的每一行代表输入向量(一个数据点)。为了创建决策边界,我们需要找出适当的权重。权重是使用以下规则从训练中“学习”的 -

w = w + (预期 - 预测) * x

感知器

这意味着从真实值中减去估计结果,然后将其乘以当前输入向量,并添加旧的权重以获得新的权重值。如果我们的输出与实际类别相同,则权重不会改变。但如果我们的估计与真实情况不同,那么权重就会相应增加或减少。这就是每次迭代中权重逐渐调整的方式。

我们首先为权重向量分配任意值,然后使用手头的误差和数据在每次迭代中逐步调整它们 -

# 使用随机值初始化权重
w = np.random.rand(3, 1)
打印(w)

输出:

[[0.37547448]
[0.00239401] [0.18640939]]

定义感知器的激活函数 –

def activate_func(z): 如果 z >= 1: 返回 1 否则: 返回 0

接下来,我们应用感知器学习规则 -

for _ in range(100): for i in range(X_bias.shape[0]): y = activate_func(w.transpose().dot(X_bias[i, :])) # 更新权重 w = w + (( Y[i] - y) * X_bias[i, :]).reshape(w.shape[0], 1)

不能保证权重一次性收敛,因此我们将所有训练数据输入感知器算法 100 次,同时不断应用学习规则,以便最终获得最佳权重。

现在,我们已经获得了最优权重,我们 使用 Y = 预测每个数据点的类别 f(向量形式的 Σwi*xi + b) 或 Y = wT.x。

# 预测数据点的类别
result_class = [activation_func(w.transpose().dot(x)) for x in X_bias]

可视化决策边界和预测的类标签 –

# 转换为单位向量
w = w/np.sqrt(w.transpose().dot(w))
# 可视化结果
plt.figure(图大小 = (6, 6))
plt.scatter(X[:, 0], X[:, 1], c = result_class)
plt.plot([-10, -1], 超平面([-10, -1], w), lw = 3, c = '红色')
plt.title('带有决策边界的感知器分类')
plt.show()
具有决策边界的感知器分类

您可以将地面实况图像与预测结果图像进行比较,并查看一些错误分类的点。如果我们计算一下准确率,大约是98%(我把这个留给读者作为练习)。

如果你看到了,这里我们的原始数据是相当分离的,所以我们能够获得如此好的准确性。但现实世界的数据并非如此。使用单个感知器,我们只能构建线性决策边界,因此如果数据混合,感知器算法将表现不佳。这是单感知器模型的局限性之一。

尾注

我们首先了解罗森布拉特感知器背后的生物学灵感。然后我们继续学习感知器和激活函数的数学。最后,使用玩具数据集,我们了解了感知器如何通过构建线性决策边界来执行基本分类,该线性决策边界将属于不同类别的数据点分开。

关于作者

普拉提克·纳布里亚 是一位熟练的数据科学家,目前就职于诺伊达的一家分析与人工智能公司。他精通机器学习、深度学习、NLP、时间序列分析、数据操作、SQL、Python,并且熟悉在云环境中工作。在业余时间,他喜欢参加黑客马拉松比赛并撰写技术文章。

本文中显示的媒体不属于 Analytics Vidhya 所有,其使用由作者自行决定。

资料来源:https://www.analyticsvidhya.com/blog/2021/10/perceptron-building-block-of-artificial-neural-network/

时间戳记:

更多来自 分析维迪亚