【问题标题】:Intuition for back propagation反向传播的直觉
【发布时间】:2018-06-16 02:22:45
【问题描述】:

下面是神经网络反向传播的前向传播和部分实现的反向传播:

import numpy as np

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

X_train = np.asarray([[1,1], [0,0]]).T
Y_train = np.asarray([[1], [0]]).T

hidden_size = 2
output_size = 1
learning_rate = 0.1

    forward propagation

w1 = np.random.randn(hidden_size, 2) * 0.1
b1 = np.zeros((hidden_size, 1))
w2 = np.random.randn(output_size, hidden_size) * 0.1
b2 = np.zeros((output_size, 1))

Z1 = np.dot(w1, X_train) + b1
A1 = sigmoid(Z1)

Z2 = np.dot(w2, A1) + b2
A2 = sigmoid(Z2)

derivativeA2 = A2 * (1 - A2)
derivativeA1 = A1 * (1 - A1)

    first steps of back propagation

error = (A2 - Y_train)
dA2 = error / derivativeA2
dZ2 = np.multiply(dA2, derivativeA2)

背后的直觉是什么:

error = (A2 - Y_train)
dA2 = error / derivativeA2
dZ2 = np.multiply(dA2, derivativeA2)

我理解错误是当前预测 A2 和实际值 Y_train 之间的差异。

但是为什么要将此误差除以 A2 的导数,然后将 error / derivativeA2 的结果乘以 derivativeA2 呢?这背后的直觉是什么?

【问题讨论】:

    标签: numpy machine-learning neural-network logistic-regression backpropagation


    【解决方案1】:

    这些表达确实令人困惑:

    derivativeA2 = A2 * (1 - A2)
    error = (A2 - Y_train)
    dA2 = error / derivativeA2
    

    ...因为error 本身没有意义。此时,目标是计算交叉熵损失的导数,其公式如下:

    dA2 = (A2 - Y_train) / (A2 * (1 - A2))
    

    推导参见these lecture notes(公式6)。恰好前面的操作是sigmoid,它的导数是A2 * (1 - A2)。这就是为什么再次使用这个表达式来计算dZ2(公式7)。

    但如果您有不同的损失函数(例如 L2)或不同的挤压层,那么 A2 * (1 - A2) 不会被重用。这些是计算图中的不同节点。

    【讨论】:

      猜你喜欢
      • 2018-05-05
      • 2019-03-18
      • 1970-01-01
      • 2020-11-23
      • 2017-05-29
      • 1970-01-01
      • 2014-09-25
      • 2011-08-25
      • 2017-05-24
      相关资源
      最近更新 更多