¿Por qué la neural network simple de 2 capas no puede aprender la secuencia 0,0?

Al pasar por el ejemplo de una pequeña neural network de 2 capas, noté el resultado que no puedo explicar.

Imagina que tenemos el siguiente conjunto de datos con las tags correspondientes:

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

Vamos a crear una pequeña NN de 2 capas que aprenderá a predecir el resultado de una secuencia de dos números donde cada número puede ser 0 o 1. Deberemos entrenar a esta NN dado nuestro conjunto de datos mencionado anteriormente.

 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) 

Después de entrenar a esta NN, la probamos.

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

Ok, 0,1 y 1,0 es lo que cabría esperar. Las predicciones para 0,0 y 1,1 también se pueden explicar, nuestra NN simplemente no tenía los datos de entrenamiento para estos casos, así que agreguémoslos a nuestro conjunto de datos de entrenamiento:

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

¡Vuelva a entrenar la red y pruébelo de nuevo!

 INPUT PREDICTION [0, 1] [ 0.00881315] [1, 0] [ 0.99990851] [1, 1] [ 0.9898148] [0, 0] [ 0.5] 
  • Espera, ¿por qué [0,0] sigue siendo 0,5 ?

Esto significa que NN todavía no está seguro acerca de 0,0 , lo mismo cuando no estaba seguro acerca de 1,1 hasta que lo entrenamos.

La clasificación es correcta también. Debe comprender que la red pudo separar el conjunto de prueba.

Ahora debe usar una función de pasos para clasificar los datos entre 0 o 1 .

En tu caso el 0.5 parece ser un buen threshold

EDITAR:

Es necesario agregar el sesgo al código.

 # 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