将偏置节点纳入您的神经网络
本文将向您展示如何向使用 Python 等高级编程语言实现的多层感知器添加偏差值。
欢迎阅读由工程总监罗伯特·凯姆 (Robert Keim) 创建的关于神经网络的“关于电路”系列。在继续学习有关偏置节点的课程之前,请考虑学习以下系列的其余部分:
- 如何使用神经网络进行分类:什么是感知器?
- 如何使用简单的感知器神经网络示例对数据进行分类
- 如何训练基本的感知器神经网络
- 了解简单的神经网络训练
- 神经网络训练理论简介
- 了解神经网络中的学习率
- 使用多层感知器进行高级机器学习
- Sigmoid 激活函数:多层感知器神经网络中的激活
- 如何训练多层感知器神经网络
- 了解多层感知器的训练公式和反向传播
- Python 实现的神经网络架构
- 如何在 Python 中创建多层感知器神经网络
- 使用神经网络进行信号处理:神经网络设计中的验证
- 训练神经网络数据集:如何训练和验证 Python 神经网络
- 神经网络需要多少隐藏层和隐藏节点?
- 如何提高隐藏层神经网络的准确性
- 将偏置节点纳入您的神经网络
偏置节点可以添加到感知器的输入层或隐藏层,产生一个由设计者选择的常数值。
我们在第 11 部分讨论了偏差值,如果您不清楚偏差节点是什么或它们如何修改和潜在地增强神经网络的功能,我鼓励您阅读(或重新阅读)该文章的相关部分。
在本文中,我将首先解释将偏差值纳入您的网络架构的两种方法,然后我们将进行一个实验,看看偏差值是否可以提高我们在上一篇文章(第 16 部分)中获得的准确度性能。>
通过电子表格合并偏差
下图描述了一个在输入层有一个偏置节点但在隐藏层没有的网络。
如果这是您正在寻找的配置,您可以使用包含您的训练或验证数据的电子表格添加偏差值。
这种方法的优点是不需要大量的代码修改。第一步是在电子表格中插入一列并用您的偏差值填充它:
现在,您需要做的就是将输入层维度增加一:
将偏差集成到代码中
如果您想要隐藏层中的偏置节点,或者您不喜欢使用电子表格,则需要不同的解决方案。
假设我们要向输入层和隐藏层添加一个偏置节点。首先,我们需要增加 I_dim 和 H_dim ,因为我们的目标是整合偏置节点,使它们的功能类似于普通节点,但具有由设计者选择且永不改变的预加权值。
我将按如下方式完成此操作:
创建输入层偏置节点
您可能还记得,我们使用以下代码组装训练数据集,分离目标输出值,并提取训练样本数。
在这些语句之后,二维数组中的列数training_data 将等于电子表格中的输入列数。我们需要将列数增加一以说明输入层中的偏置节点,在此期间我们可以用所需的偏置值填充这个额外的列。
下面的代码展示了如何做到这一点。
np.ones() 函数创建一个单列数组,其行数等于 training_count ,并为该数组中的每个元素分配一个 +1 的值。然后我们使用 np.hstack() 将一列数组添加到原始training_data右侧的函数 数组。
请注意,我对训练数据和验证数据都执行了此过程。重要的是要记住,目标实际上并不是修改训练或验证数据;相反,我们修改数据是为了实现所需的网络配置。
当我们查看感知器的框图时,偏置节点显示为网络本身的元素;因此,网络处理的任何样本都必须经过此修改。
创建隐藏层偏置节点
我们可以通过修改计算隐藏层激活后值的 for 循环,然后手动插入最后一个隐藏节点(实际上是一个偏差节点)的偏差值,在前馈处理中添加偏差。
第一次修改如下所示:
如果网络配置为没有隐藏层偏置节点,hidden_bias 等于0,for循环的执行不变。
另一方面,如果我们决定包含一个隐藏层偏置节点,for 循环将不会计算该层中最后一个节点(即偏置节点)的激活后值。
下一步是增加节点变量,以便它访问postActivation_H 中的偏置节点 数组,然后分配偏置值。
请注意,这些修改也必须应用于代码的验证部分。
+1 以外的偏差值
根据我的经验,+1 是标准偏差值,我不知道使用其他数字是否有任何可靠的理由。偏差由权重修改,因此选择 +1 不会对偏差如何与网络的整体功能相互作用施加严格的限制。
但是,如果您想尝试其他偏差值,则可以轻松实现。对于隐藏偏差,您只需更改分配给 postActivation_H[node] 的数字 .对于输入偏差,您可以乘以 new_column 数组(最初每个元素都有 +1)按所需的偏差值。
测试偏差的影响
如果你读过第 16 部分,你就会知道我的感知器在对实验 3 中的样本进行分类时遇到了一些困难,这就是“高复杂度”问题。
让我们看看添加一个或多个偏置节点是否提供了一致且显着的改进。
我的假设是分类准确度的差异相当微妙,因此对于这个实验,我平均运行 10 次而不是 5 次。训练和验证数据集使用相同的输入和输出之间的高复杂度关系生成,隐藏层维数为7。
结果如下:
结论
如您所见,偏差节点并未导致分类性能发生任何显着变化。
这实际上并不让我感到惊讶——我认为偏置节点有时有点过分强调,鉴于我在本实验中使用的输入数据的性质,我认为偏置节点没有任何帮助。
尽管如此,偏置在某些应用中是一项重要的技术。编写支持偏置节点功能的代码是个好主意,这样您就可以在需要时使用它。
工业机器人