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

Matrix 神经网络中偏差单元的良好实现,matrix,machine-learning,neural-network,linear-algebra,matrix-multiplication,Matrix,Machine Learning,Neural Network,Linear Algebra,Matrix Multiplication,我正在学习神经网络,在此过程中,我实现了几个完全连接的网络。我通常添加一个列偏差单位(1s)在输入marix和权重矩阵中的一行额外的权重中,因为这就是我在参加在线课程后学习实现神经网络的方式,但在github上的许多实现中,我发现它也可以实现,而无需在矩阵中插入偏差单位,但可以单独添加:XW+b,其中b是偏置单位 我不明白它是怎么工作的。这似乎是一个更好、更高效的实现,但我不理解。例如,考虑下面的例子: 1 2 3 4 0.5 0.5 X = 1 4 5 6

我正在学习神经网络,在此过程中,我实现了几个完全连接的网络。我通常添加一个
列偏差单位
(1s)在输入marix和权重矩阵中的一行额外的权重中,因为这就是我在参加在线课程后学习实现神经网络的方式,但在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
X中的第一列是偏差单位,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,a
1x2矩阵
不能添加到
X*W
中,即
3x2矩阵

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

所示的方法是相同的。 最重要的是:

权重只能假定值介于-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|                  
如果问题在这里: 在下面的链接中使用公式:

它假设一个有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
或在此:

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

总结 你可以使用矩阵做前馈,但是你必须为每个连接增加偏差。您展示的第一个示例是最简单的方法。很清楚 如果你选择第二个,你就不能做1xN矩阵与3x2的乘积。但您可以在调用激活函数时添加偏差加法:

a1 = tanH(z1 + b[1]); 
这两种方法都不是比其他方法更好或更有效的实现


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

I*W :matix[3x4]     and    b:vector[3] = { 1, 1 , 1 }
在这种情况下,你也需要在每个隐藏的神经元上添加偏差。 在第一个示例中,您直接添加了偏差,其中:
矩阵[0][0]=1 x 0.5+2 x 2+3 x 5 ecc..

注:
矩阵[0][0]=sumH1

在第二个示例中,您在后面添加了偏差,其中:
matrix[0][0]=2x2+3x5 ecc..
sumH1=matrix[0][0]+B[0]

注:对于“B”,我们表示B的权重;B=1


也许在第二个示例中,代码会更加有序。没别的了。计算机性能或内存占用没有显著变化。

是的,我明白了。但这意味着BAI的维度应与输入和权重相乘后的结果矩阵相同,但许多文章称权重矩阵为MxN,则偏差应为1xN矩阵。请将其中一些文章链接以进行澄清?转到“我们的网络如何进行预测”部分,再检查一件事的维度。为什么这两种方法都不比其他方法更好或更有效?显然,在第一个实现中,我们需要在矩阵中插入一列1,但在第二个实现中,我们只需要添加另一个矩阵。