用python / numpy反向传播 - 计算神经网络中权重和偏置矩阵的导数

时间:2017-12-30 04:13:22

标签: numpy neural-network backpropagation derivative calculus

我在python中开发神经网络模型,使用各种资源将所有部分组合在一起。一切正常,但我对一些数学有疑问。该模型具有可变数量的隐藏层,对所有隐藏层使用relu激活,除了最后一个,使用sigmoid。

费用函数是:

def calc_cost(AL, Y):
  m = Y.shape[1]
  cost = (-1/m) * np.sum((Y * np.log(AL)) - ((1 - Y) * np.log(1 - AL)))
  return cost

其中AL是应用最后一次sigmoid激活后的概率预测。

在我实现反向传播的一部分中,我使用以下

def linear_backward_step(dZ, A_prev, W, b):
  m = A_prev.shape[1]

  dW = (1/m) * np.dot(dZ, A_prev.T)
  db = (1/m) * np.sum(dZ, axis=1, keepdims=True)
  dA_prev = np.dot(W.T, dZ)

  return dA_prev, dW, db

其中,给定dZ(相对于任何给定层的前向传播的线性步长的成本的导数),层的权重矩阵W的导数,偏差每个都计算向量b和前一层激活dA_prev的推导。

作为此步骤补充的前向部分是这个等式:Z = np.dot(W, A_prev) + b

我的问题是:在计算dWdb时,为什么有必要乘以1/m?我尝试使用微积分规则来区分它,但我不确定这个术语是如何适应的。

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

您的渐变计算似乎有误。你不要乘以1/m。此外,您对m的计算似乎也是错误的。它应该是

# note it's not A_prev.shape[1]
m = A_prev.shape[0]

此外,calc_cost函数中的定义

# should not be Y.shape[1]
m = Y.shape[0]

您可以参考以下示例以获取更多信息。

Neural Network Case Study

答案 1 :(得分:0)

这实际上取决于您的损失功能,如果您在每个样本后更新权重或者批量更新。看看以下旧式通用成本函数:

enter image description here

来源:MSE Cost Function for Training Neural Network

在这里,我们说y^_i是您的网络输出,y_i是您的目标价值。 y^_i是您网络的输出。

如果你将y^_i区分开来,那么你永远不会摆脱1/n或总和,因为和的导数是导数的总和。由于1/n是总和的一个因素,因此您也无法摆脱这种情况。现在,想想标准梯度下降实际上在做什么。在计算所有n样本的平均值后,它会更新您的权重。可以使用随机梯度下降在每个样本之后进行更新,因此您不必对其进行平均。批量更新计算每批的平均值。我猜你的情况是1/m,其中m是批量大小。