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.
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. –
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. –