Podczas przechodzenia przez example maleńkiej 2-warstwowej sieci neuronowej zauważyłem wynik, którego nie potrafię wyjaśnić.Dlaczego prosta 2-warstwowa sieć neuronowa nie może nauczyć się sekwencji 0,0?
Wyobraź mamy następujący zestaw danych z odpowiednimi etykietami:
[0,1] -> [0]
[0,1] -> [0]
[1,0] -> [1]
[1,0] -> [1]
Stwórzmy mały 2-warstwowej NN, które nauczą się przewidzieć wyniku sekwencji dwóch liczb, gdzie każda liczba może wynosić 0 lub 1 Szkolimy ten NN, biorąc pod uwagę nasz zestaw danych, o którym mowa powyżej.
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)
Po przećwiczeniu tego numeru NN testujemy go.
INPUT PREDICTION
[0, 1] [ 0.00881315]
[1, 0] [ 0.99990851]
[1, 1] [ 0.5]
[0, 0] [ 0.5]
Ok, 0,1
i 1,0
jest to, czego oczekujemy. Przewidywania dla 0,0
i 1,1
są również wyjaśnić, nasza NN prostu nie ma danych szkoleniowych dla tych przypadków, więc dodajmy je do naszego szkolenia zbiorze:
[0,1] -> [0]
[0,1] -> [0]
[1,0] -> [1]
[1,0] -> [1]
[0,0] -> [0]
[1,1] -> [1]
Ponowne trenowanie sieci i przetestować go ponownie!
INPUT PREDICTION
[0, 1] [ 0.00881315]
[1, 0] [ 0.99990851]
[1, 1] [ 0.9898148]
[0, 0] [ 0.5]
- Czekaj, dlaczego [0,0] wciąż 0,5?
Oznacza to, że NN jest nadal niepewny 0,0
, tak samo, kiedy był niepewny 1,1
aż trenowaliśmy go.
Myślę, że ten model jest kluczowy. Sieć była w stanie oddzielić dane z powodzeniem. Możesz teraz dodać próg, aby sklasyfikować dane. –
Jeśli nie brakuje mi czegoś oczywistego, nie masz żadnych jednostek uprzedzających. Przeczucie, ale mam ochotę w tym przykładzie, karmienie w [0,0] bez jednostki stronniczości spowoduje problemy. Ponieważ jest to mała sieć, możesz to naprawić, dołączając 1 do końca każdego przykładu szkolenia i sprawdzając, czy to rozwiązuje problem. –