2017-09-24 4 views
2

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: Figure 1.

Ce qui ne va pas, car il est proche de ne pas 0.

Quand je change delta:

delta = error 

Il fonctionne en quelque sorte. Figure 2

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?

Répondre

1

je pense, il devrait être

delta_hidden = hidden_error * sigmoid(hidden, True) 
+0

Ouais, mon mauvais. Je ne l'ai pas remarqué du tout. Merci beaucoup! –