私は機械学習の初心者であり、これは挑戦された最初の実世界のML課題の1つです。データセットが神経回路網を鍛えることができるかどうかを見つける方法?
一部の実験データには、512個の独立したブール関数とブール結果が含まれています。
提供されたデータセットには、約1e6の実際の実験記録があります。
古典的なXORの例では、NNを訓練するために4つの可能な状態のすべてが必要です。私の場合、その唯一の2^(10-512) = 2^-505
はゼロに近いです。
私はデータの性質に関する情報はありません。ちょうどこれらの(512 + 1) * 1e6
ビットです。
利用可能なデータに1つの隠れ層があるNNを試しました。トレーニングセットからのサンプルであっても、訓練されたNNの出力は、常に「1」に近い単一ではなく、0に近い。体重初期化、勾配降下学習率で遊んだ。
マイ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})
私は2例疑う:
- 私のせい - 悪いNN実装、間違ったアーキテクチャを。
- 不良データ。 XORの例と比較して、不完全なトレーニングデータはNNに失敗することになります。しかし、訓練されたNNに訓練された訓練の例は正しい予測を与えるはずですが、そうではありませんか?それは、結果を予測するために提供されたデータにニューラルネットワーク(2層パーセプトロン)を訓練するために可能な限りである場合を評価する方法
?受け入れ可能なセットの場合は、XORの例です。ランダムなノイズに対抗します。
ブール値の入力のみで構成されるデータに対してニューラルネットワークを使用する傾向はありません。 –
@ GordonLinoffこの場合、より良いaproachは何ですか? – Serge
私は意思決定ツリーから始め、素早くランダムなフォレストに切り替えるでしょう。データの性質によっては、(データの構造によっては)SVMに幸運を祈るかもしれませんが、ランダムなフォレストはより良い仕事をするでしょう。 –