反向传播 - 神经网络 - 导数

Posted

技术标签:

【中文标题】反向传播 - 神经网络 - 导数【英文标题】:backpropagation - neural network - derivate 【发布时间】:2021-10-25 20:07:35 【问题描述】:

我正在研究反向传播,但我不明白为什么我们需要划分 'dW_curr' 'm'。我看到的每个代码都这样做,但是为什么呢?如果我们使用交叉熵作为我们的损失函数或每个单独的损失函数,我们是否只需要进行这种划分?

下一个代码来自https://towardsdatascience.com/lets-code-a-neural-network-in-plain-numpy-ae7e74410795。

def single_layer_backward_propagation(dA_curr, W_curr, b_curr, Z_curr, A_prev, activation="relu"):
    m = A_prev.shape[1]
    
    if activation is "relu":
        backward_activation_func = relu_backward
    elif activation is "sigmoid":
        backward_activation_func = sigmoid_backward
    else:
        raise Exception('Non-supported activation function')
    
    dZ_curr = backward_activation_func(dA_curr, Z_curr)
    dW_curr = np.dot(dZ_curr, A_prev.T) / m
    db_curr = np.sum(dZ_curr, axis=1, keepdims=True) / m
    dA_prev = np.dot(W_curr.T, dZ_curr)

    return dA_prev, dW_curr, db_curr

【问题讨论】:

【参考方案1】:

我强烈建议,如果您的目标是理解,那么不要遵循工程教程,而是遵循数学推导,例如Simon Haykin 的《神经网络和学习机器》一书中的那个。

对于您的具体问题,损失被定义为对您的样本的期望。这种期望的经验估计只是一个平均值。导数是线性算子,意味着一个均值的导数是导数的均值。您的“除以 m”是什么,只不过是相应导数的平均值。

无论你的损失是交叉熵还是 L2 都没有关系,重要的是聚合是什么,如果你试图最小化期望值,你几乎肯定会在任何地方取平均值(即除以样本数) (除非您没有使用 Monte Carlo 估计器,但这种情况相当罕见)。

【讨论】:

这本书我会开始看的,谢谢推荐。但是关于平均值,如果我使用平方和误差损失函数,而不是均方误差损失函数,那么我不需要除以'm',对吗?再次感谢您的推荐

以上是关于反向传播 - 神经网络 - 导数的主要内容,如果未能解决你的问题,请参考以下文章

反向传播中的 ReLU 导数

神经网络的反向传播(BP)是什么?sigmoid函数的导数是什么,有什么形式优势优缺点?

第 2 部分弹性反向传播神经网络

深度学习梯度下降和反向传播原理

链式法则玩转反向传播

中英字幕Andrej Karpathy | 详解神经网络和反向传播(基于micrograd)- 知识点目录