【问题标题】:what is the correct way to update the bias in backpropagation for a feedforward neural network?更新前馈神经网络的反向传播偏差的正确方法是什么?
【发布时间】:2021-09-23 23:52:58
【问题描述】:

我目前正在研究如何从头开始实现神经网络以了解其工作原理,我偶然发现了这篇文章:https://www.samsonzhang.com/2020/11/24/understanding-the-math-behind-neural-networks-by-building-one-from-scratch-no-tf-keras-just-numpy.html,他在其中使用 MNIST 数据集实现了一个工作数字分类器,准确率几乎达到 83% 以上每次我运行他的实现...

我在他的实现中没有遇到任何问题,但是当我自己实现时,我对这部分代码感到好奇。

下面是他在获取将用于更新权重和偏差的导数的实现...

def backward_prop(Z1, A1, Z2, A2, W1, W2, X, Y):
    one_hot_Y = one_hot(Y)
    dZ2 = A2 - one_hot_Y
    dW2 = 1 / m * dZ2.dot(A1.T)
    db2 = 1 / m * np.sum(dZ2)  # <-- my question is about this lines
    dZ1 = W2.T.dot(dZ2) * ReLU_deriv(Z1)
    dW1 = 1 / m * dZ1.dot(X.T)
    db1 = 1 / m * np.sum(dZ1)  # <-- my question is about this lines
    return dW1, db1, dW2, db2

他在这里所做的是他将得到的偏置矩阵的所有总和作为一个标量值,所以我很好奇更新偏置项的正确方法是什么?只为一层中的偏置矩阵的所有元素减去一个标量值?

我问这个问题的原因是因为当我将代码行设置为 db1 = 1 / m * np.sum(dZ1,axis=0)db2 = 1 / m * np.sum(dZ2,axis=0) 时,它不是返回一个标量值而是返回一个矩阵,此时当我运行模型时它仍然是工作并且仍然有83%+的相当高的准确度,所以我现在真的不知道哪个是正确的......

编辑:使用 '''axis=1,keepdims=True''' 而不是 '''axis=0''' 似乎更正确,但我仍然不确定

谁能告诉我这部分?

【问题讨论】:

    标签: python numpy machine-learning neural-network


    【解决方案1】:

    我会说原始代码中可能存在错误。每个偏差值都应该使用相应的损失 dL/db_i 进行更新,而不是使用所有偏差项的平均值。因此,您的解决方案db1 = 1 / m * np.sum(dZ1,axis=0) 似乎是正确的。

    为了更好地理解,如果您用每个变量形状注释您的函数/行会有所帮助:)

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 2018-05-20
      • 2011-04-16
      • 2015-04-08
      • 2017-08-19
      • 2011-12-11
      • 2013-12-23
      • 1970-01-01
      • 2018-05-08
      相关资源
      最近更新 更多