2016-07-07 13 views
11

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.

+0

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

+2

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

Odpowiedz

9

Klasyfikacja jest również w porządku. Musisz zrozumieć, że sieć była w stanie oddzielić zestaw testowy.

Teraz musisz użyć funkcji krokowej, aby sklasyfikować dane między 0 lub 1.

W twoim przypadku 0.5 wydaje się być dobrym threshold

EDIT:

Trzeba dodać nastawienie do kodu.

# 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

Tak, dodaj odchylenie, jeśli chcesz wyjaśnić, dlaczego, pomyśl o tym, co dzieje się z wejściem [0,0] w sieci neuronowej bez jednostek odchylenia. Ponieważ sieć neuronowa wykonuje pomnożenie między każdą warstwą, waga nie ma żadnego wpływu, ponieważ dowolna liczba razy 0 wciąż wynosi 0. Zatem w ostatniej warstwie aktywacja każdego węzła wynosi 0, a gdy zero zostaje przekazane do sigmoidu funkcja, wyprowadza.5, co jest wynikiem twojej sieci. –

Powiązane problemy