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

时间:2017-08-02 13:10:42

标签: matrix machine-learning neural-network linear-algebra matrix-multiplication

我正在学习神经网络,在这个过程中,我已经实现了很少的完全连接的网络。我通常在输入marix中添加一个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

但是如果在没有直接插入偏置列的情况下编写相同的内容,但是通过单独添加它就会变为:

       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*W 3x2 matrix

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

1 个答案:

答案 0 :(得分:1)

图示的方法是相同的。

最重要的是:

  

权重只能假设-1到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|                  

如果问题在于:

在下面的链接中采用公式: Feed_Forward formula

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

sumH1 = I x w1 + b x wb;

注意:(b x wb = 1 x wb = wb)。

这段经文不是在“实施”段落编码:

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 matrice 3x2的产品。但是,当您调用激活函数时,可以添加偏差添加:

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

这两者中没有一个是比其他更好或更有效的实现。

在第二个示例中,您将该matix分为两部分:

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。

也许在第二个例子中,代码会产生更多的有序。而已。计算机性能或内存占用没有显着变化。