Просматривая пример крошечной двухслойной нейронной сети, я заметил результат, который я не могу объяснить.
Предположим, у нас есть следующий набор данных с соответствующими метками:
[0,1] -> [0]
[0,1] -> [0]
[1,0] -> [1]
[1,0] -> [1]
Позвольте создать крошечный 2-слойный NN, который научится предсказать результат двух числовой последовательности, где каждое число может быть 0 или 1. Мы будем обучать этот NN, учитывая наш набор данных, упомянутый выше.
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)
После того, как мы подготовили этот NN, мы протестируем его.
INPUT PREDICTION
[0, 1] [ 0.00881315]
[1, 0] [ 0.99990851]
[1, 1] [ 0.5]
[0, 0] [ 0.5]
Хорошо, 0,1
и 1,0
- это то, чего мы ожидаем. Прогнозы для 0,0
и 1,1
также объяснимы, наш NN просто не имел данных обучения для этих случаев, поэтому добавьте его в наш набор учебных материалов:
[0,1] -> [0]
[0,1] -> [0]
[1,0] -> [1]
[1,0] -> [1]
[0,0] -> [0]
[1,1] -> [1]
Переустановите сеть и проверьте ее снова!
INPUT PREDICTION
[0, 1] [ 0.00881315]
[1, 0] [ 0.99990851]
[1, 1] [ 0.9898148]
[0, 0] [ 0.5]
- Подождите, почему [0,0] по-прежнему 0,5?
Это означает, что NN является еще неопределенным относительно 0,0
, так же, когда он не знал о 1,1
, пока мы его не обучили.