繁体   English   中英

更新前馈神经网络的反向传播偏差的正确方法是什么?

[英]what is the correct way to update the bias in backpropagation for a feedforward neural network?

我目前正在研究如何从头开始实现神经网络以了解它是如何工作的,我看到了这篇文章: 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''' 似乎更正确,但我仍然不确定

任何人都可以启发我这部分吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM