J'essaye d'implémenter la rétropropagation à mon réseau de neurones simple qui ressemble à ceci: 2 entrées, 2 cachées (sigmoïde), 1 sortie (sigmoïde). Mais cela ne semble pas fonctionner correctement.Backpropagation: Pourquoi l'erreur n'atteint-elle pas zéro lorsqu'elle est multipliée par le dérivé de sigmoïde?
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)
Quand j'imprimer mon erreur que je reçois: .
Ce qui ne va pas, car il est proche de ne pas 0.
Quand je change delta:
delta = error
Il fonctionne en quelque sorte.
Mais pourquoi? Ne devrions-nous pas multiplier une erreur par la dérivée de la fonction sigmoïde avant de la passer plus loin?
Ouais, mon mauvais. Je ne l'ai pas remarqué du tout. Merci beaucoup! –