2017-10-20 169 views
0

我是一個機器學習的新手,這是第一個真正的ML任務挑戰之一。如何查找數據集是否可以訓練神經網絡?

一些實驗數據包含512個獨立的布爾特徵和一個布爾結果。

在提供的數據集中有大約1e6個實驗實驗記錄。

在經典的XOR示例中,需要4種可能狀態中的4種來訓練NN。在我的情況下,它只有2^(10-512) = 2^-505接近零。

我沒有關於數據性質的更多信息,只是這些(512 + 1) * 1e6位。

在可用數據上嘗試了帶有1個隱藏層的NN。訓練集上的訓練神經網絡的輸出甚至從訓練集中輸出總是接近於0,而不是接近「1」的單個輸出。玩重量初始化,梯度下降學習率。

code利用TensorFlow 1.3,Python 3的型號摘錄:

with tf.name_scope("Layer1"): 
    #W1 = tf.Variable(tf.random_uniform([512, innerN], minval=-2/512, maxval=2/512), name="Weights_1") 
    W1 = tf.Variable(tf.zeros([512, innerN]), name="Weights_1") 
    b1 = tf.Variable(tf.zeros([1]), name="Bias_1") 

    Out1 = tf.sigmoid(tf.matmul(x, W1) + b1) 

with tf.name_scope("Layer2"): 
    W2 = tf.Variable(tf.random_uniform([innerN, 1], minval=-2/512, maxval=2/512), name="Weights_2") 
    #W2 = tf.Variable(tf.zeros([innerN, 1]), name="Weights_2") 
    b2 = tf.Variable(tf.zeros([1]), name="Bias_2") 

    y = tf.nn.sigmoid(tf.matmul(Out1, W2) + b2) 

with tf.name_scope("Training"): 
    y_ = tf.placeholder(tf.float32, [None,1]) 

    cross_entropy = tf.reduce_mean(
     tf.nn.softmax_cross_entropy_with_logits(
      labels = y_, logits = y) 
    ) 

    train_step = tf.train.GradientDescentOptimizer(0.005).minimize(cross_entropy) 

with tf.name_scope("Testing"): 
    # Test trained model 
    correct_prediction = tf.equal(tf.round(y), tf.round(y_)) 
# ... 
# Train 
for step in range(500): 
    batch_xs, batch_ys = Datasets.train.next_batch(300, shuffle=False) 
    _, my_y, summary = sess.run([train_step, y, merged_summaries], 
     feed_dict={x: batch_xs, y_: batch_ys}) 

我懷疑兩種情況:

  1. 我的錯 - 壞NN執行,錯誤的體系結構;
  2. 壞數據。與XOR示例相比,不完整的訓練數據會導致NN失敗。然而,訓練樣本餵給訓練好的神經網絡應該給出正確的預測,不是嗎?

如何評價如果有可能在所有所提供的數據訓練神經網絡(2層感知)來預測結果?一個可勝任的例子將是XOR例子。反對一些隨機噪音。

+0

我不會傾向於使用神經網絡來處理僅由布爾輸入組成的數據。 –

+0

@GordonLinoff在這種情況下什麼是更好的方法? – Serge

+2

我會從決策樹開始,然後迅速切換到隨機森林。根據數據的性質,您可能對SVM有好運(取決於數據結構),但我認爲隨機森林可能會做得更好。 –

回答

1

只有特別的方法才能知道是否可以從數據集中學習具有可微分網絡的函數。也就是說,這些特殊的方式通常是有效的。例如,網絡應該能夠在沒有任何正規化的情況下過度訓練集合。

衡量這一點的常用技術是僅將網絡適合整個數據集的一個子集。檢查網絡是否可以過度適應,然後增加子集的大小,並增加網絡的大小。不幸的是,決定是否添加額外的圖層或在隱藏層中添加更多單位是一個你必須做的任意決定。

然而,看着你的代碼,也有可能是錯這裏發生了幾件事情:

  1. 是你的產出平衡?我的意思是,你在數據集目標中的數目是否與0相同?
  2. 你在第一層的初始化全部爲零,這個梯度將爲零,所以它不能學習任何東西(儘管你有一個真正的初始化,它被註釋掉了)。
  3. Sigmoid非線性比簡單的非線性更難以優化,如ReLUs。

我建議使用Tensorflow的built-in definitions for layers不用擔心初始化,並且在任何隱藏層切換到ReLUs(你需要乙狀結腸在輸出爲您的布爾目標)。

最後,由於缺乏結構,深度學習在大多數「特徵」機器學習問題中並不是很好。例如,這些功能的順序無關緊要。其他方法往往效果更好,但如果你真的想深入學習,那麼你可以看看this recent paper,通過使用非常特定的非線性和權重初始化(在上面的代碼中更改4行)來顯示改進的性能。

+0

1.輸出是均衡的,驗證過的。 2.確定我已經嘗試了隨機正常的初始化以及; 嘗試隨機森林現在,它需要很長時間。等待第一批結果,而CPU百分百加載並且球迷大聲朗讀。 – Serge

+0

你可能想嘗試樸素貝葉斯,因爲你有布爾輸入和目標。與隨機森林相比,它的運行速度要快得多([封閉形式和線性時間](https://en.wikipedia.org/wiki/Naive_Bayes_classifier)),並且在條件獨立性假設下是最優的。 –

+0

再次感謝!大約1小時的CPU加熱後,隨機森林最終的精確度爲0.5239。 [嘗試樸素貝葉斯](https://gist.github.com/sergiks/f3197087b53eeca153b9c4cad3e25a7e),其中0.47的準確性。或者我做錯了什麼,或者數據對於ML算法來說是不可靠的。 – Serge