神经网络中偏置单元的良好实现

Good implementation of bias units in neural network

我正在学习神经网络,在此过程中,我实现了几个全连接网络。我通常在输入矩阵中添加一个 column bias units(1s),在权重矩阵中添加一个 extra row of weights,因为这就是我在参加在线课程后学习实现神经网络的方式,但在 github 上的许多实现中我发现它也可以在不在矩阵中插入偏置单元的情况下实现,而是可以单独添加:XW + b,其中 b 是偏置单元。

我不明白它是如何工作的。这似乎是一个更好、更有效的实现,但我不明白。例如,请考虑以下示例:

        1 2 3 4       0.5 0.5
   X =  1 4 5 6    W= 2   3     X*W = [4x2 matrix] 
        1 8 9 5       5   8
                      2   3

The first column in X is bias unit and so is the first row in W

但是如果不直接插入bias列而是单独添加就变成了:

       2 3 4       2 3
   X=  4 5 6    W= 5 8    b = 0.5 0.5    X*W = [3x2 matrix]
       8 9 5       2 3

从第二个表达式可以清楚地看出X*W+b不等于第一个表达式。此外b,1x2 matrix不能添加到X*W3x2 matrix.

那么,我如何使用第二种方法实现偏差?

图示方法相同

最重要的:

weights can only assume values between -1 and 1.


注意:第一个例子也会给出一个 3x2 矩阵。

      1 2 3 4           0.5 0.5          27.5  42.5
 X =  1 4 5 6        W= 2   3      X*W = 45.5  70.5
      1 8 9 5           5   8            71.5  111.5                                    
                        2   3

在最后一个矩阵中,每一行是一组输入,每一列是一个神经元。


图示方法相同:
稍后添加偏差不是问题。

以第二个例子为例:

       |27  42 |            |27 42 |   |0.5 0.5|
 X*W = |45  70 |    X*W+b = |45 70 | + |0.5 0.5| : Same Result.
       |71  111|            |71 111|   |0.5 0.5|                  

如果问题出在这里:

采用下面 link 处的公式: Feed_Forward formula

它假设一个神经网络有 1 个输入、1 个隐藏和 1 个输出神经元,并且它不涉及矩阵的乘积。这是前馈段落:

sumH1 = I x w1 + b x wb;

注:(b x wb = 1 x wb = wb).

这段文字编码在 "implementation" paragrafe:

z1 = x.dot(W1) + b1
a1 = np.tanh(z1)
z2 = a1.dot(W2) + b2

或在这里:

B belonging to R^500

他在这里做了一个假设的例子,有 2 个输入、500 个隐藏和 2 个输出神经元,其中 w1 是 I 和 H 之间的 2x500 个连接之一,b1 是 H 的 500 个偏置之一,w2 是一个H 和 O 之间的 2x500 个连接中的 b2 是 O 的 2 个偏置之一。

总结

您可以使用矩阵完成 feed_forward 段落,但您必须为每个连接添加偏差。您展示的第一个示例是最简单的方法。很明显 如果你选择第二个,你不能做 1xN 矩阵和 3x2 的乘积。但是可以在调用激活函数的时候加上bias加法:

a1 = tanH(z1 + b[1]); 

none of the two is a better or more efficient implementation than other.


在第二个示例中,您将该矩阵分成两部分:

I*W :matix[3x4]     and    b:vector[3] = { 1, 1 , 1 }

在这种情况下,您还需要在每个隐藏的神经元处添加偏差。 在您的第一个示例中,您直接添加了偏差,其中: matrix[0][0] = 1 x 0.5 + 2 x 2 + 3 x 5 ecc..

注:matrix[0][0] = sumH1;

在第二个中,您稍后添加偏差,其中:matrix[0][0] = 2 x 2 + 3 x 5 ecc..sumH1 = matrix[0][0] + B[0]

注意:whit "B" 我们打算使用 B 的权重; B=1.

也许第二个示例的代码会更有序一些。而已。计算机性能或内存占用无明显变化。