用python/numpy进行反向传播-计算神经网络中权重和偏差矩阵的导数
我正在用python开发一个神经网络模型,使用各种资源将所有部分放在一起。一切正常,但我对一些数学问题有疑问。该模型具有可变数量的隐藏层,除最后一个使用sigmoid的隐藏层外,所有隐藏层都使用relu激活 成本函数为:用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
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]
有关更多信息,请参考以下示例