2017-10-20 11 views
0

私は機械学習の初心者であり、これは挑戦された最初の実世界のML課題の1つです。データセットが神経回路網を鍛えることができるかどうかを見つける方法?

一部の実験データには、512個の独立したブール関数とブール結果が含まれています。

提供されたデータセットには、約1e6の実際の実験記録があります。

古典的なXORの例では、NNを訓練するために4つの可能な状態のすべてが必要です。私の場合、その唯一の2^(10-512) = 2^-505はゼロに近いです。

私はデータの性質に関する情報はありません。ちょうどこれらの(512 + 1) * 1e6ビットです。

利用可能なデータに1つの隠れ層があるNNを試しました。トレーニングセットからのサンプルであっても、訓練されたNNの出力は、常に「1」に近い単一ではなく、0に近い。体重初期化、勾配降下学習率で遊んだ。

マイcodeがTen​​sorFlow 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}) 

私は2例疑う:

  1. 私のせい - 悪いNN実装、間違ったアーキテクチャを。
  2. 不良データ。 XORの例と比較して、不完全なトレーニングデータはNNに失敗することになります。しかし、訓練されたNNに訓練された訓練の例は正しい予測を与えるはずですが、そうではありませんか?それは、結果を予測するために提供されたデータにニューラルネットワーク(2層パーセプトロン)を訓練するために可能な限りである場合を評価する方法

?受け入れ可能なセットの場合は、XORの例です。ランダムなノイズに対抗します。

+0

ブール値の入力のみで構成されるデータに対してニューラルネットワークを使用する傾向はありません。 –

+0

@ GordonLinoffこの場合、より良いaproachは何ですか? – Serge

+2

私は意思決定ツリーから始め、素早くランダムなフォレストに切り替えるでしょう。データの性質によっては、(データの構造によっては)SVMに幸運を祈るかもしれませんが、ランダムなフォレストはより良い仕事をするでしょう。 –

答えて

1

データセットと異なるネットワークを持つ関数を学習できるかどうかを知るための特別な方法はありません。つまり、これらの特別な方法は通常動作します。例えば、ネットワークは、正規化なしでトレーニングセットを過大適合させることができなければならない。

これを測定する一般的な手法は、完全なデータセットのサブセットにのみネットワークを適合させることです。ネットワークがそれにぴったり合っていることを確認してから、サブセットのサイズを増やし、ネットワークのサイズを増やしてください。残念なことに、余分なレイヤーを追加するか、隠しレイヤーにユニットを追加するかを決めることは、あなたがしなければならない任意の決定です。

  1. は、あなたの出力はバランスがとれている:

    しかし、あなたのコードを見て、ここで間違って行くことができいくつかありますか?つまり、データセットのターゲットで0と同じ数の1を使用していますか?

  2. 最初のレイヤーでの初期化はすべてゼロですが、このグラデーションはゼロになるので、何も学ぶことはできません(実際の初期化はコメントアウトされています)。
  3. シグモイド非線形性は、ReLUsなどの単純な非線形性よりも最適化するのが難しいです。

私は(あなたがブールの目標のために、出力にシ​​グモイドが必要)初期化を心配しないようにTensorflowでbuilt-in definitions for layersを使用して、任意の隠れ層にReLUsへの切り替えをお勧めします。

最後に、深い学習は実際にはほとんどの "機能のバッグ"機械学習の問題では構造が欠けているのでそれほど良くありません。たとえば、機能の順序は関係ありません。他のメソッドはよく機能しますが、深い学習をしたいのであれば、this recent paperを見ると、非常に特殊な非線形性と重み付けの初期化(上のコードでは4行の変更)だけでパフォーマンスが向上します。

+0

1.出力はバランスがとれています。 2.ランダムな通常のinitでも試してみました。 ランダムフォレストにしようとすると、時間がかかります。 CPUが100%負荷され、ファンが大声で回転している間、最初の結果を待っています。 – Serge

+0

ブール値の入力とターゲットがある場合、Naive Bayesを試してみるとよいでしょう。これは、ランダムフォレストよりもはるかに速く([閉形式と線形時間](https://en.wikipedia.org/wiki/Naive_Bayes_classifier))実行され、条件付き独立仮定のもとで最適です。 –

+0

もう一度ありがとう!無作為な森林は最終的に〜1時間のCPU加熱の後に悲惨な0.5239の精度を与えました。 [Naive Bayesを試してみた](https://gist.github.com/sergiks/f3197087b53eeca153b9c4cad3e25a7e)も、0.47の精度を示した。どちらかが間違っているか、データがMLアルゴリズムのために十分ではありません。 – Serge

関連する問題