Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy 反向传播直觉_Numpy_Machine Learning_Neural Network_Logistic Regression_Backpropagation - Fatal编程技术网

Numpy 反向传播直觉

Numpy 反向传播直觉,numpy,machine-learning,neural-network,logistic-regression,backpropagation,Numpy,Machine Learning,Neural Network,Logistic Regression,Backpropagation,下面是神经网络反向传播的正向传递和部分实现的反向传递: 将numpy导入为np def乙状结肠(z): 返回1/(1+np.exp(-z)) X_train=np.asarray([[1,1],[0,0]]).T Y_train=np.asarray([1],[0]]).T 隐藏大小=2 输出大小=1 学习率=0.1 正向传播 w1=np.随机.随机数N(隐藏大小,2)*0.1 b1=np.零((隐藏大小,1)) w2=np.random.randn(输出大小、隐藏大小)*0.1 b2=np.零

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

将numpy导入为np
def乙状结肠(z):
返回1/(1+np.exp(-z))
X_train=np.asarray([[1,1],[0,0]]).T
Y_train=np.asarray([1],[0]]).T
隐藏大小=2
输出大小=1
学习率=0.1
正向传播
w1=np.随机.随机数N(隐藏大小,2)*0.1
b1=np.零((隐藏大小,1))
w2=np.random.randn(输出大小、隐藏大小)*0.1
b2=np.零((输出大小,1))
Z1=np.dot(w1,X_列)+b1
A1=乙状结肠(Z1)
Z2=np.dot(w2,A1)+b2
A2=乙状结肠(Z2)
导数A2=A2*(1-A2)
导数A1=A1*(1-A1)
反向传播的第一步
错误=(A2-Y_列)
dA2=错误/衍生性EA2
dZ2=np.乘法(dA2,导数EA2)
背后的直觉是什么:

error = (A2 - Y_train)
dA2 = error / derivativeA2
dZ2 = np.multiply(dA2, derivativeA2)
我理解错误是当前预测值
A2
和实际值
Y\u列
之间的差异


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

这些表达确实令人困惑:

derivativeA2 = A2 * (1 - A2)
error = (A2 - Y_train)
dA2 = error / derivativeA2
。。。因为
error
本身没有意义。此时,目标是计算交叉熵损失的导数,其公式如下:

dA2 = (A2 - Y_train) / (A2 * (1 - A2))
有关推导,请参见(公式6)。恰好前面的操作是
sigmoid
,它的导数是
A2*(1-A2)
。这就是为什么再次使用此表达式来计算
dZ2
(公式7)

但是如果你有一个不同的损耗函数(比如L2)或者一个不同的挤压层,那么
A2*(1-A2)
就不会被重用。这些是计算图中的不同节点