我正在开发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
?我尝试使用微积分规则来区分它,但我不确定这个术语是如何适应的。
任何帮助表示赞赏!
您的渐变计算似乎错了。你不要将它乘以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]
您可以参考以下示例以获取更多信息。
这实际上取决于您的损失功能,如果您在每个样本后更新权重或者批量更新。看看以下老式通用成本函数:
资料来源:MSE Cost Function for Training Neural Network
在这里,让我们说y^_i
是你的网络输出,y_i
是你的目标值。 y^_i
是你网络的输出。
如果你为y^_i
区分它,你永远不会摆脱1/n
或总和,因为和的导数是导数的总和。由于1/n
是总和的一个因素,你也不会也无法摆脱这一点。现在,想想标准梯度下降实际上在做什么。在计算所有n
样本的平均值后,它会更新您的权重。每个样本后可以使用随机梯度下降进行更新,因此您无需对其进行平均。批量更新计算每批的平均值。我猜你的情况是1/m
,其中m
是批量大小。