2016-10-15 3 views
0

Я написал простую нейронную сеть, чтобы узнать логический элемент AND. Я пытаюсь понять, почему моя стоимость никогда не уменьшается, а предсказатели всегда 0,5:Theano learning AND gate

import numpy as np 
import theano 
import theano.tensor as T 

inputs = [[0,0], [1,1], [0,1], [1,0]] 
outputs = [[0], [1], [0], [0]] 

x = theano.shared(value=np.asarray(inputs), name='x') 
y = theano.shared(value=np.asarray(outputs), name='y') 

alpha = 0.1 

w_array = np.asarray(np.random.uniform(low=-1, high=1, size=(2, 1)), dtype=theano.config.floatX) 
w = theano.shared(value=w_array, name='w', borrow=True) 

output = T.nnet.sigmoid(T.dot(x, w)) 
cost = T.sum((y - output) ** 2) 
updates = [(w, w - alpha * T.grad(cost, w))] 

train = theano.function(inputs=[], outputs=[], updates=updates) 
test = theano.function(inputs=[], outputs=[output]) 
calc_cost = theano.function(inputs=[], outputs=[cost]) 

for i in range(60000): 
    if (i+1) % 10000 == 0: 
     print(i+1) 
     print(calc_cost()) 
    train()  

print(test()) 

Выход всегда одинаков:

10000 
[array(1.0)] 
20000 
[array(1.0)] 
30000 
[array(1.0)] 
40000 
[array(1.0)] 
50000 
[array(1.0)] 
60000 
[array(1.0)] 

[array([[ 0.5], 
     [ 0.5], 
     [ 0.5], 
     [ 0.5]])] 

Всегда кажется, предсказать 0,5 независимо от входа, потому что стоимость не отклоняясь от 1 при обучении

Если я переключить выходы [[0], [1], [1], [1]] для обучения схемы ИЛИ, я получить правильные предсказания, и правильно уменьшая стоимость

ответ

1

Ваша модель имеет форму

<w, x> 

, таким образом, он не может построить любое разделение, которое не пересекает происхождение. Такое уравнение может выражать только линии, проходящие через точку (0,0), и, очевидно, линия, отделяющая логический элемент И ((1, 1) от всего остального), не пересекает начало координат. Вы должны добавить смещения срок, так что ваша модель

<w, x> + b 
+0

так почему та же модель работы при смене метки для обучения в ворота ИЛИ? Я думаю, что также будет иметь отрицательно наклонный разделитель, который не пересекает начало координат? – Simon

+0

ИЛИ разделитель ворот может пересекать начало координат, если вы считаете, что находящееся на разделителе дает правильное «отрицательное» значение. Это не лучший, но достаточно приличный для использования. – lejlot