【问题标题】:Good implementation of bias units in neural network神经网络中偏置单元的良好实现
【发布时间】:2017-08-02 13:10:42
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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 个偏差之一。

    总结一下

    您可以使用矩阵进行前馈通道,但您必须为每个连接添加偏差。您展示的第一个示例是最简单的方法。天气晴朗 如果你选择第二个,你就不能做 1xN 矩阵与 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]

    注意:白色“B”是我们想要 B 的权重; B=1。

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

    【讨论】:

    • 是的,明白了。但这意味着 bais 的维度应该与输入和权重相乘后的结果矩阵相同,但是许多文章指出权重矩阵是 MxN 那么偏差应该是 1xN 矩阵。
    • 您能否链接其中一些文章以进行澄清?
    • wildml.com/2015/09/implementing-a-neural-network-from-scratch 转到“我们的网络如何进行预测”部分并检查 b1 的维度
    • 还有一件事。为什么两者都不是比其他更好或更有效的实现?显然,在第一个实现中,我们需要在矩阵中插入一列 1,但在第二个实现中,我们只需要添加另一个矩阵。
    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2017-02-09
    相关资源
    最近更新 更多