2017-05-22 14 views
1

データセットの説明はLSTMネットワークとシャムモデルtensorflowに

データセットは、質問ペアのセットが含まれているとの質問が同じであれば伝えるラベルを使用して訓練するために失敗しました。例えば

は、「どのように私は読んで、私のYouTubeのコメントを見つけるのですか?」 「どのように私のすべて YouTubeのコメントを見ることができますか? "1"

このモデルの目標は、与えられた質問のペアが同じかどうかを識別することです。

アプローチ

私は2つの質問が同じであるかどうかを確認するためにSiamese networkを作成しました。され、次のモデル:私は上記のモデルを訓練してきた

with graph.as_default(): 
    saver = tf.train.Saver() 

with tf.Session(graph=graph) as sess: 
    sess.run(tf.global_variables_initializer(), feed_dict={embedding_placeholder: embedding_matrix}) 

    iteration = 1 
    for e in range(epochs): 
     summary_writer = tf.summary.FileWriter('/Users/mithun/projects/kaggle/quora_question_pairs/logs', sess.graph) 
     summary_writer.add_graph(sess.graph) 

     for ii, (x1, x2, y) in enumerate(get_batches(question1_train, question2_train, label_train, batch_size), 1): 
      feed = {question1_inputs: x1, 
        question2_inputs: x2, 
        labels: y[:, None], 
        keep_prob: 0.9 
        } 
      loss1 = sess.run([distance], feed_dict=feed) 

      if iteration%5==0: 
       print("Epoch: {}/{}".format(e, epochs), 
         "Iteration: {}".format(iteration), 
         "Train loss: {:.3f}".format(loss1)) 

      if iteration%50==0: 
       val_acc = [] 
       for x1, x2, y in get_batches(question1_val, question2_val, label_val, batch_size): 
        feed = {question1_inputs: x1, 
          question2_inputs: x2, 
          labels: y[:, None], 
          keep_prob: 1 
          } 
        batch_acc = sess.run([accuracy], feed_dict=feed) 
        val_acc.append(batch_acc) 
       print("Val acc: {:.3f}".format(np.mean(val_acc))) 
      iteration +=1 

    saver.save(sess, "checkpoints/quora_pairs.ckpt") 

:モデルを訓練するためのコードを、次の

with graph.as_default(): 
    diff = tf.sqrt(tf.reduce_sum(tf.square(tf.subtract(question1_outputs[:, -1, :], question2_outputs[:, -1, :])), reduction_indices=1)) 

    margin = tf.constant(1.) 
    labels = tf.to_float(labels) 
    match_loss = tf.expand_dims(tf.square(diff, 'match_term'), 0) 
    mismatch_loss = tf.expand_dims(tf.maximum(0., tf.subtract(margin, tf.square(diff)), 'mismatch_term'), 0) 

    loss = tf.add(tf.matmul(labels, match_loss), tf.matmul((1 - labels), mismatch_loss), 'loss_add') 
    distance = tf.reduce_mean(loss) 

    optimizer = tf.train.AdamOptimizer(learning_rate).minimize(distance) 

さ:

graph = tf.Graph() 

with graph.as_default(): 
    embedding_placeholder = tf.placeholder(tf.float32, shape=embedding_matrix.shape, name='embedding_placeholder') 
    with tf.variable_scope('siamese_network') as scope: 
     labels = tf.placeholder(tf.int32, [batch_size, None], name='labels') 
     keep_prob = tf.placeholder(tf.float32, name='question1_keep_prob') 

     with tf.name_scope('question1') as question1_scope: 
      question1_inputs = tf.placeholder(tf.int32, [batch_size, seq_len], name='question1_inputs') 

      question1_embedding = tf.get_variable(name='embedding', initializer=embedding_placeholder, trainable=False) 
      question1_embed = tf.nn.embedding_lookup(question1_embedding, question1_inputs) 

      question1_lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size) 
      question1_drop = tf.contrib.rnn.DropoutWrapper(question1_lstm, output_keep_prob=keep_prob) 
      question1_multi_lstm = tf.contrib.rnn.MultiRNNCell([question1_drop] * lstm_layers) 

      q1_initial_state = question1_multi_lstm.zero_state(batch_size, tf.float32) 

      question1_outputs, question1_final_state = tf.nn.dynamic_rnn(question1_multi_lstm, question1_embed, initial_state=q1_initial_state) 

     scope.reuse_variables() 

     with tf.name_scope('question2') as question2_scope: 
      question2_inputs = tf.placeholder(tf.int32, [batch_size, seq_len], name='question2_inputs') 

      question2_embedding = question1_embedding 
      question2_embed = tf.nn.embedding_lookup(question2_embedding, question2_inputs) 

      question2_lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size) 
      question2_drop = tf.contrib.rnn.DropoutWrapper(question2_lstm, output_keep_prob=keep_prob) 
      question2_multi_lstm = tf.contrib.rnn.MultiRNNCell([question2_drop] * lstm_layers) 

      q2_initial_state = question2_multi_lstm.zero_state(batch_size, tf.float32) 

      question2_outputs, question2_final_state = tf.nn.dynamic_rnn(question2_multi_lstm, question2_embed, initial_state=q2_initial_state) 

はRNNの出力を使用したコサイン距離を計算します約10,000のラベル付きデータである。しかし、精度は約0.630で停滞し、不思議なことに、検証精度はすべての反復で同じです。

lstm_size = 64 
lstm_layers = 1 
batch_size = 128 
learning_rate = 0.001 

モデルの作成方法に問題はありますか?

+0

デバッグのための最初の良いパス:ネットワークを完全に線形にし、それを1つか2つの簡単な例に適合させます。いったんそれに合うと(驚くほど頻繁にはそうではない)、ゆっくりと非線形性を再導入する。学習の作業は簡単なので、遅いまたは存在しない学習を死んだ/飽和した非線形性に帰することができます。精度(データセットまたはアーキテクチャに精通していないiI'm)で何を言うのは難しいが、物事のカップル –

+0

。必ずなぜあなたはあなたの埋め込みを勉強したくないだろうが、その後は効果がありません 'トレーニング可能= false'を、ではない'トレーニング可能= 'false''、言うべきではありません。また、それは傷つけるべきではありませんが、私はあなたが後でそれを2つの異なる場所を二乗している場合は、diff' ''ためscope.reuse_variables() '、または' tf.sqrt'を必要としないと思います。 – jdehesa

+0

私は、簡単なデータセットの説明とモデルの目標で質問を更新しました。 1)あらかじめ訓練された単語の埋め込みを使用しているので、私は 'trainable = False'を設定しました。 2)私はここでサイアムネットワークを使用しています。高レベルでは、同じ重みを使用して2つの同一のネットワークを持つことになり、2つのネットワークからの出力間の距離がわかります。距離が閾値よりも小さい場合、それらは同一ではない。したがって、私は 'scope.reuse_varables'を使用しました。 – Mithun

答えて

1

これは、あなたが使用している最近リリースQuoraのデータセットのようなアンバランスなデータセットに共通の問題です。 Quoraデータセットは不均衡なので(〜63%のマイナスおよび〜37%のプラスの例)、適切な初期化が必要です。体重の初期化がなければ、あなたの解答は極小値に固定され、負のクラスだけを予測するように訓練されます。したがって、それは63%の精度です。これは、検証データの「類似していない」質問の割合です。検証セットで得られた結果を確認すると、すべてのゼロが予測されます。 He等、http://arxiv.org/abs/1502.01852で提案されている切り捨て正規分布は、重みを初期化するための良い代替案です。

関連する問題