反向传播:当误差乘以sigmoid的导数时,为什么误差不接近零?

2024-04-25 09:33:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图实现反向传播到我的简单神经网络,它看起来像这样:2个输入,2个隐藏(sigmoid),1个输出(sigmoid)。但它似乎不能正常工作。你知道吗

import numpy as np

 # Set inputs and labels
 X = np.array([ [0, 1],
                [0, 1],
                [1, 0],
                [1, 0] ])

 Y = np.array([[0, 0, 1, 1]]).T

 # Make random always the same
 np.random.seed(1)
 # Initialize weights
 w_0 = 2 * np.random.rand(2, 2) - 1
 w_1 = 2 * np.random.rand(1, 2) - 1

 # Learning Rate
 lr = 0.1

 # Sigmoid Function/Derivative of Sigmoid Function
 def sigmoid(x, deriv=False):
     if(deriv==True):
         return x * (1 - x)
     return 1/(1 + np.exp(-x))

 # Neural network
 def network(x, y, w_0, w_1):
     inputs = np.array(x, ndmin=2).T
     label = np.array(y, ndmin=2).T

     # Forward Pass
     hidden = sigmoid(np.dot(w_0, inputs))
     output = sigmoid(np.dot(w_1, hidden))

     # Calculate error and delta
     error = label - output
     delta = error * sigmoid(output, True)

     hidden_error = np.dot(w_1.T, error)
     delta_hidden = error * sigmoid(hidden, True)

     # Update weight
     w_1 += np.dot(delta, hidden.T) * lr
     w_0 += np.dot(delta_hidden, record.T) * lr

     return error

 # Train
 for i in range(6000):
     for j in range(X.shape[0]):
         error = network(X[j], Y[j], w_0, w_1)

         if(i%1000==0):
             print(error)

当我打印出我的错误时,我得到: Figure 1。你知道吗

这是不对的,因为它不接近0。你知道吗

当我将delta改为:

delta = error

不知怎么的,它起作用了。 Figure 2

但为什么呢?在进一步传递之前,我们不应该把误差乘以sigmoid函数的导数吗?你知道吗


Tags: andtrueoutputreturnnprandomerrornetwork