2016-07-07 3 views
11

Während ich durch die example eines winzigen 2-schichtigen neuralen Netzwerks ging, bemerkte ich das Ergebnis, das ich nicht erklären kann.Warum kann einfache 2-Schicht Neural Network nicht lernen, Sequenz?

Stellen wir folgende Datensatz mit den entsprechenden Etiketten:

[0,1] -> [0] 
[0,1] -> [0] 
[1,0] -> [1] 
[1,0] -> [1] 

Lassen Sie uns einen kleinen 2-Schicht NN schaffen, die das Ergebnis einer zwei Zahlenfolge vorherzusagen, lernen, wo jede Zahl kann 0 oder 1 sein Wir werden diese NN anhand unseres oben genannten Datensatzes trainieren.

import numpy as np 

# compute sigmoid nonlinearity 
def sigmoid(x): 
    output = 1/(1 + np.exp(-x)) 
    return output 

# convert output of sigmoid function to its derivative 
def sigmoid_to_deriv(output): 
    return output * (1 - output) 

def predict(inp, weigths): 
    print inp, sigmoid(np.dot(inp, weigths)) 

# input dataset 
X = np.array([ [0,1], 
       [0,1], 
       [1,0], 
       [1,0]]) 
# output dataset 
Y = np.array([[0,0,1,1]]).T 

np.random.seed(1) 

# init weights randomly with mean 0 
weights0 = 2 * np.random.random((2,1)) - 1 

for i in xrange(10000): 
    # forward propagation 
    layer0 = X 
    layer1 = sigmoid(np.dot(layer0, weights0)) 
    # compute the error 
    layer1_error = layer1 - Y 

    # gradient descent 
    # calculate the slope at current x position 
    layer1_delta = layer1_error * sigmoid_to_deriv(layer1) 
    weights0_deriv = np.dot(layer0.T, layer1_delta) 
    # change x by the negative of the slope (x = x - slope) 
    weights0 -= weights0_deriv 

print 'INPUT PREDICTION' 
predict([0,1], weights0) 
predict([1,0], weights0) 
# test prediction of the unknown data 
predict([1,1], weights0) 
predict([0,0], weights0) 

Nachdem wir diese NN trainiert haben, testen wir es.

INPUT PREDICTION 
[0, 1] [ 0.00881315] 
[1, 0] [ 0.99990851] 
[1, 1] [ 0.5] 
[0, 0] [ 0.5] 

Ok, 0,1 und 1,0 ist das, was wir erwarten würden. Die Prognosen für 0,0 und 1,1 sind auch erklärbar, unsere NN hatte einfach nicht die Trainingsdaten für diese Fälle, so wollen wir es in unserem Trainingsdatenmenge hinzu:

[0,1] -> [0] 
[0,1] -> [0] 
[1,0] -> [1] 
[1,0] -> [1] 
[0,0] -> [0] 
[1,1] -> [1] 

umschulen das Netzwerk und es erneut testen!

INPUT PREDICTION 
[0, 1] [ 0.00881315] 
[1, 0] [ 0.99990851] 
[1, 1] [ 0.9898148] 
[0, 0] [ 0.5] 
  • Warten, warum [0,0] ist noch 0,5?

Das bedeutet, dass NN noch unsicher über 0,0, gleich ist, wenn es um 1,1 unsicher war, bis wir es trainiert.

+0

Ich denke, dieses Modell corect ist. Das Netz konnte die Daten erfolgreich unterscheiden. Sie können jetzt einfach einen Schwellenwert hinzufügen, um die Daten zu klassifizieren. –

+2

Wenn ich nicht etwas Offensichtliches vermisse, haben Sie keine Bias-Einheiten. Eine Ahnung, aber ich habe das Gefühl, dass in diesem Beispiel die Zufuhr von [0,0] ohne eine Bias-Einheit zu Problemen führt. Da es sich um ein kleines Netzwerk handelt, können Sie dies beheben, indem Sie 1 an das Ende eines jeden Trainingsbeispiels anhängen und sehen, ob das das Problem behebt. –

Antwort

9

Die Klassifizierung stimmt auch. Sie müssen verstehen, dass das Netz den Testsatz trennen konnte.

Jetzt müssen Sie einen Schritt Funktion verwenden, um die Daten zwischen 0 oder 1 zu klassifizieren.

In Ihrem Fall die 0.5 scheint eine gute threshold

EDIT zu sein:

Sie müssen die Vorspannung an den Code hinzuzufügen.

# input dataset 
X = np.array([ [0,0,1], 
       [0,0,1], 
       [0,1,0], 
       [0,1,0]]) 

# init weights randomly with mean 0 
weights0 = 2 * np.random.random((3,1)) - 1 
+6

Ja, füge einen Bias hinzu, wenn du eine Erklärung dafür willst, was passiert mit einem Input von [0,0] in einem neuronalen Netzwerk ohne Bias-Einheiten. Da ein neuronales Netzwerk eine Multiplikation zwischen jeder Schicht durchführt, haben die Gewichtungen keine Auswirkung, da jede Anzahl mal 0 noch 0 ist. In der letzten Schicht ist die Aktivierung jedes Knotens also 0, und wenn eine Null an das Sigmoid weitergegeben wird Funktion, es gibt aus.5, das ist, was dein Netz ausgab. –

Verwandte Themen