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

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

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

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

最佳答案

图示方法相同。

最重要的是:

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|                  

如果问题出在这里:

采用以下链接中的公式: 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 个偏置之一。

总结

您可以使用矩阵进行前馈 channel ,但必须为每个连接添加偏差。您展示的第一个示例是最简单的方法。天气晴朗 如果您选择第二个,则无法计算 1xN 矩阵与 3x2 矩阵的乘积。但是您可以在调用激活函数时添加偏差加法:

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 }

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

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

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

注意:“B”是指 B 的权重; B=1。

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

关于matrix - 神经网络中偏置单元的良好实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45461827/

相关文章:

c - 将所有非空元素向左移动

python - 使用 2D 矩阵作为 numpy 中 3D 矩阵的索引?

r - 如何从 2 个或更多矩阵的所有可能组合创建矩阵?

python - 当我有高度不平衡的数据时,我应该平衡测试集吗?

python - Q-Learning Table收敛到-inf

machine-learning - 递归神经网络(Elman 网络)。上下文到隐藏层/隐藏到上下文层的权重需要更新吗?

python - MNIST 数据集的 Keras 准确度没有变化

c - 来自文本文件c代码的邻接矩阵

python - 正确的数据加载器设置可训练 fastrcnn-resnet50 以使用 pytorch 进行对象检测

python - sklearn.neural_network.MLPClassifier 中属性 n_layers_ 的含义