为什么偏差需要是神经网络中的向量?

人工智能 神经网络 深度学习 张量流 javascript
2021-11-05 16:46:25

我正在学习使用 tensorflow.js。我还使用 tfvis 库将有关神经网络的信息打印到 Web 浏览器。当我创建一个具有 5 个神经元的层和另一个具有 2 个神经元的层的密集神经网络时,每层分别具有长度为 5 和 2 的偏置向量。我检查了文档(https://js.tensorflow.org/api/0.6.1/#layers.dense),它说每个密集层确实有一个偏差向量。向量不是多余的吗?不是每一层都只需要一个数字来表示偏差吗?请看下面的代码:

//Create tensorflow neural net
this.model = tf.sequential();

this.model.add(tf.layers.dense({units: 5, inputShape: [1]}))
this.model.add(tf.layers.dense({units: 2}))

const surface = { name: 'Layer Summary', tab: 'Model Inspection'};
tfvis.show.layer(surface, this.model.getLayer(undefined, 0))
2个回答

在一个简单的前馈网络中,每个人工神经元都有一个单独的偏差值。与每个神经元必须使用单个全层偏差相比,这为输出层功能提供了更大的灵活性。虽然不是绝对要求,但如果没有这种安排,可能会很难逼近某些函数。从偏置向量到每层的单个标量偏置值在大多数情况下会降低神经网络的有效性,因为它失去了适应目标函数的灵活性。

一旦你有N导致需要的层中的输出神经元N偏差值,那么将这个偏差值集合建模为向量是相当简单的。

通常你会看到以这种形式或类似形式编写的神经网络层函数:

y=f(Wx+b)

在哪里f()是激活函数(按元素应用),W层的权重矩阵和b是偏见。用这种形式写,很容易看出y,Wxb必须都是相同大小的向量。

这种层设计已经变得如此标准,以至于可能会忘记其他设计和实现对于神经网络参数是可能的,并且有时可能是有用的。像 TensorFlow 这样的框架也使得采用标准方法变得更容易,这就是为什么你需要一个向量来对你正在使用的示例进行偏差。在您学习的同时,可能有 99% 的时间都在学习,最好还是按照框架在此执行的操作。

为了强调(这个答案中没有强调),在神经网络的情况下,偏差,或者更准确地说,偏差与其他神经元之间的连接(或权重)也是可学习的参数,因此反向传播算法计算损失函数的梯度,它也包含关于偏置和其他神经元之间连接的偏导数,并且在梯度下降步骤中,这些连接也可以更新。

每个神经元通常都有自己的偏差。例如,在 Keras 中就是这种情况,您可以轻松验证. 但是,原则上,您也可以有一个具有单个标量偏差的层,该层的所有神经元都共享该层,但这可能会产生不同的效果。网络上的多个地方讨论了偏见的作用。例如,在此 Stack Overflow 帖子此 Stats SE 帖子中。