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

用python/numpy进行反向传播-计算神经网络中权重和偏差矩阵的导数,numpy,neural-network,backpropagation,derivative,calculus,Numpy,Neural Network,Backpropagation,Derivative,Calculus,我正在用python开发一个神经网络模型,使用各种资源将所有部分放在一起。一切正常,但我对一些数学问题有疑问。该模型具有可变数量的隐藏层,除最后一个使用sigmoid的隐藏层外,所有隐藏层都使用relu激活 成本函数为: 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是应用最后一次s

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

成本函数为:

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

我的问题是:在计算
dW
db
时,为什么需要乘以
1/m
?我试着用微积分规则来区分这一点,但我不确定这个术语是否合适


感谢您的帮助

这实际上取决于您的损失函数,以及您是否在每次采样后更新权重,或者是否按批次更新权重。请看以下老式通用成本函数:

资料来源:

这里,假设
y^\u i
是您的网络输出,
y\u i
是您的目标值
y^\u i
是网络的输出


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

您的梯度计算似乎有误。您不能将其乘以
1/m
。此外,您对
m
的计算似乎也有误。应该是

# note it's not A_prev.shape[1]
m = A_prev.shape[0]
另外,
计算成本
函数中的定义

# should not be Y.shape[1]
m = Y.shape[0]
有关更多信息,请参考以下示例