神经网络的实际工作原理——Python 实现第 2 部分(简化)

在本文中,我们继续揭穿神经网络是一个我们不太了解它是如何工作的黑匣子的理论。我们的目标是以易于理解的方式实现神经网络。如果有些概念不能立即理解,请查看之前的文章……

神经网络的实际工作原理——Python 实现第 2 部分(简化)

在本文中,我们继续揭穿神经网络是一个我们不太了解它是如何工作的黑匣子的理论。我们的目标是以易于理解的方式实现神经网络。如果某些概念不能立即理解,请查看参考部分的先前文章。

在文章的最后,您应该能够在给定具有许多特征和训练示例的输入数据的情况下,通过网络实现数据的单次前向传递。

让我们从我们将使用的数据和神经网络架构开始。

数据和神经网络架构

我们将使用包含 3 个特征和 395 个训练示例的数据,如下图 1 所示。 NN 很浅——它在输入层有 3 个节点(因为我们有 3 个特征)、一个由 4 个神经元组成的隐藏层和 1 个输出神经元。

神经网络的实际工作原理——Python 实现第 2 部分(简化)

Parameter Initialization

为了执行前向传递,我们需要定义参数(权重和偏差)的初始值。我们将从标准正态分布中随机生成所需的权重,并将偏差设置为零。进行参数初始化时要掌握的最重要概念是确保权重和偏置矩阵具有所需的维度。在执行矩阵乘法时,错误的维度会让我们陷入困境。

重述权重和偏置矩阵的尺寸(请参阅链接)[0]

以下是初始化参数时要始终考虑的两条规则:

神经网络的实际工作原理——Python 实现第 2 部分(简化)
  • 第 l 层 (wˡ) 的权重矩阵的维数为 (nˡ, n^(l-1)),也就是说,wˡ 的行数等于当前层中的神经元数量 l,并且列数将等于前一层的神经元数,l-1 引文:previous post。[0]
  • 偏置矩阵将有 nˡ 行和 1 列。这只是一个矢量引用:以前的帖子。[0]
  • 例如,在我们的例子中,我们在隐藏层需要 4 x 3 的权重矩阵。请记住,我们在输入层不需要权重,因为那里没有进行计算——我们只是传递输入值。

注 1:输入数据的维度必须为 (n, m),其中 n 为特征数,m 为训练样例数。也就是说,每个训练样本将作为输入矩阵 x 中的一列出现。

符号:在本文中,dim(A)=(r, c) 表示矩阵 A 的维数为 r × c,其中 r 为行数,c 为列数。 nˡ 是第 l 层的神经元数量。在上面显示的架构中,n⁰=3、n¹=4 和 n²=1。

参数初始化之后,接下来要做的是执行实际计算。

Actual Computations

在任何给定的层 l,完成以下两个计算:

神经网络的实际工作原理——Python 实现第 2 部分(简化)

等式 2–1:权重矩阵与输入相乘,并添加偏置。请注意,此处的输入可以是实际输入值,也可以只是来自上一层(第 l-1 层)的值。这些方程的计算需要我们理解矩阵乘法和矩阵加法。如果 A 中的列数等于 B 中的行数,则两个矩阵 A 和 B 可以相乘为 A·B。请记住,A·B 与 B·A 不同(矩阵乘法不可交换)。此外,要添加的两个矩阵必须具有相同的维度。

公式 2-2:激活函数 gˡ 应用于公式 2-1 的结果,成为第 l 层的输出。请注意,对生成的矩阵/向量使用激活不会影响其维度。

现在让我们将所有这些都放入 Python 代码中

对于每一层,我们将初始化参数,然后执行所需的计算。输入层第 0 层没有计算发生,因此我们直接进入隐藏层第 1 层。

Computations at Layer 1

(参考公式 1 中的规则)对于隐藏层第 1 层,我们需要一个维度为 (n¹,n⁰) 的权重矩阵(即当前层中的神经元数量除以当前层中的神经元数量)上一层。这是 4 x 3。我们需要 (n¹, 1) 来表示偏差,即 4 x 1。为了方便打印数据,我们这里没有使用文章开头定义的数据点(我们将在本文后面这样做)。我们将改为使用以下子集。

神经网络的实际工作原理——Python 实现第 2 部分(简化)

Output:

X:  [[ 9 14 10 11  8]
[ 9 16 8 12 9]
[ 9 16 7 10 9]]
X shape: (3, 5)
w1: [[-0.14441 -0.05045 0.016 ]
[ 0.08762 0.03156 -0.20222]
[-0.03062 0.0828 0.02301]
[ 0.0762 -0.02223 -0.02008]]
w1 shape: (4, 3)
b1: [[0.]
[0.]
[0.]
[0.]]

第 1-5 行:导入所需的包,并定义输入数据。输入数据 X 的维度为 (3, 5)、3 个特征和 5 个训练示例。

回忆(特征的数量影响输入层的神经元数量):输入层的神经元数量总是等于特征的数量,因此,我们在输入层有 3 个神经元。

第 7-12 行:根据公式 1 中的两个规则初始化参数。dim(w¹) = (n¹, n⁰) = (4,3)。

Output:

f11 shape:  (4, 5)
w2: [[0.01866 0.04101 0.01983 0.0119 ]]
w2 weights: [[0.01866 0.04101 0.01983 0.0119 ]]
b2: [[0.]]
y0: [[0.03629 0.03134 0.04005 0.03704 0.03582]]
y0 shape: (1, 5)
y_hat: [[0.50907 0.50783 0.51001 0.50926 0.50895]]
y_hat shape: (1, 5)

第 1-2 行:w1 与输入矩阵 x 相乘。 dim(w1)=(4, 3) 和 dim(x)=(3, 5) 因此 dim(w1·x)=(4,5) 基于矩阵乘法的规则。

注2:最初,我们说(这是矩阵加法的规则)两个矩阵A和B只有在它们具有相同的维度时才能相加。但是 dim(w¹·x)=(4, 5) 但 dim(b¹)=(n¹, 1) =(4, 1) 但我们将它们添加到第 1 行。这是为什么呢? Numpy 包在这里拯救了我们。

“广播一词描述了 NumPy 在算术运算期间如何处理具有不同形状的数组。在某些限制条件下,较小的阵列在较大的阵列上“广播”,以便它们具有兼容的形状。” — 来源:Numpy 文档。[0]

数组广播后,dim(b¹) 变为 (4,5),因此 z11=w¹·x+b¹ 也变为 4 x 5 矩阵。

第 4 到 10 行:应用 Sigmoid 激活来获得第 1 层的输出 f11。这是该层中所有神经元的输出。

第 12–24 行:显示输出层的计算。正如预期的那样,dim(w²)=(n², n¹)=(1, 4) 和 dim(b²)=(n², 1)=(1, 1)。我们还需要在这里应用数组广播的概念。

注 3:输出为 1 x 5 矩阵。您是否期望您期望一个数字?请记住,此输出是我们数据中所有 5 个训练示例的预测向量。换句话说,使用 Numpy 可以让我们以如此高效的方式通过网络传递所有训练示例。不要担心输出向量上的值,因为这只是基于随机初始化权重通过网络的单次数据传递。

我们需要在训练期间优化参数值,以便模型学习。训练网络需要前向传播/传播(如本文所述)和反向传播。后者允许我们使用一些损失函数来评估模型,计算函数相对于参数的偏导数,并相应地调整参数值。这个过程是迭代的,整个数据集通过网络(前向传播)和反向(反向传播)的过程构成了一次完整的迭代。这称为一个时代。我们将在下一篇文章中讨论所有这些。

在结束之前,让我们在开头提到的数据集的完整前向传递上编写一些代码(我们将直接从 https://kipronokoech.github.io/assets/datasets/marks.csv 加载数据)。[0]

Output:

w1 shape:  (4, 3)
w2 shape: (1, 4)
X shape: (3, 395)
w1 shape: (4, 3)
b1 shape (4, 1)
w2 shape: (1, 4)
b2 shape (1, 1)
f1 shape (4, 395)
z2.shape (1, 395)
yhat shape (1, 395)

关于上面的代码有几点需要注意:

  • 我们需要传递带有维度的输入特征数据(# 个特征,# 个训练示例)。通常和在 pandas 数据帧 (df) 中一样,我们在行中有训练示例,在列中有特征,但我们需要输入矩阵中的数据,因此我们在第 107 行转置 X。
  • 前向传播的输出 yhat 是所有训练示例的预测向量。出于这个原因,我们有 yhat(1, 395) 用于数据上的 395 个训练示例。
  • 此时,我们没有使用目标变量 (y)。我们将在反向传播和模型评估期间使用它。

References:

  • 如何从头开始使用 Python 实现神经网络——单个神经元的前向传递。[0]

我们在上一节中讨论了单个神经元的计算。本文讨论了浅层 3-4-1 NN 的完整单次前向传递。接下来,我们的重点将是理解反向传播。[0]

请以每月 5 美元的价格注册媒体会员,以便能够阅读我在媒体上和其他作家的所有文章。[0]

当我发布时,您也可以订阅将我的文章放入您的电子邮件收件箱。[0]

感谢您的阅读,我们下期再见!!!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2022年6月14日
下一篇 2022年6月14日

相关推荐