2017-03-05 75 views
0

下面是一個實現和功能單一的神經元使用tensorflow:反向傳播算法卡住培訓和功能

def tf_sigmoid(x): 
    return 1/(1 + tf.exp(-x)) 

data = [ 
    (0, 0), 
    (0, 1), 
    (1, 0), 
    (1, 1), 
] 

labels = [ 
    0, 
    0, 
    0, 
    1, 
] 

n_steps = 1000 
learning_rate = .1 

x = tf.placeholder(dtype=tf.float32, shape=[2]) 
y = tf.placeholder(dtype=tf.float32, shape=None) 

w = tf.get_variable('W', shape=[2], initializer=tf.random_normal_initializer(), dtype=tf.float32) 
b = tf.get_variable('b', shape=[], initializer=tf.random_normal_initializer(), dtype=tf.float32) 

h = tf.reduce_sum(x * w) + b 
output = tf_sigmoid(h) 

error = tf.abs(output - y) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(error) 
sess.run(tf.initialize_all_variables()) 


for step in range(n_steps): 
    for i in np.random.permutation(range(len(data))): 
     sess.run(optimizer, feed_dict={x: data[i], y: labels[i]}) 

有時它完美的作品,但在某些參數它卡住,不希望學習。例如,使用這些初始參數:

w = tf.Variable(initial_value=[-0.31199348, -0.46391705], dtype=tf.float32) 
b = tf.Variable(initial_value=-1.94877, dtype=tf.float32) 

在成本函數中幾乎沒有任何改進。我做錯了什麼,也許我應該以某種方式調整參數的初始化?

回答

1

是不是你缺少一個mean(error)

您的問題是sigmoid,成本函數和優化程序的特定組合。

不要難過,AFAIK這個確切的問題停滯了整整一個年頭的整個領域

當你遠離中間時,Sigmoid是平的,而你正在用相對較大的數字初始化它,嘗試/ 1000。

因此,您的絕對誤差(或平方誤差)也是平坦的,並且梯度下降優化器採取與斜率成正比的步驟。

這些要麼應該修復它:

使用cross-entropy的錯誤 - 它的凸。

使用更好的優化器,如Adam ,誰的步長對斜率的依賴性要小得多。更多關於斜坡的一致性。

獎勵:不要推出自己的乙狀結腸,使用tf.nn.sigmoid,那麼您的NaN就會少得多。

玩得開心!

+0

這是一個了不起的答案,謝謝! (我認爲我不會因爲我沒有使用批次而意味着(錯誤)'因此沒有什麼可以平均) –