首页 文章

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

提问于
浏览
1

我正在开发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

我的问题是:在计算 dWdb 时,为什么有必要乘以 1/m ?我不确定这个术语是如何适用的 .

任何帮助表示赞赏!

2 回答

  • 0

    您的渐变计算似乎错了 . 你没有乘以 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

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

    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 是批量大小 .

相关问题