5

TensorFlow RNN チュートリアルを適応させて、NCE 損失またはサンプリングされたソフトマックスを使用して言語モデルをトレーニングしていますが、それでも問題を報告したいと考えています。しかし、私が得る困惑は非常に奇妙です: NCE の場合、数百万 (ひどい!) を取得しますが、サンプルされたソフトマックスの場合、1 エポック後に 700 の PPL を取得します (本当であるにはあまりにも良い?!)。私は何が間違っているのだろうか。

PTBModel への私の適応は次のとおりです。

class PTBModel(object):
  """The PTB model."""

  def __init__(self, is_training, config, loss_function="softmax"):
    ...
    w = tf.get_variable("proj_w", [size, vocab_size])
    w_t = tf.transpose(w)
    b = tf.get_variable("proj_b", [vocab_size])

    if loss_function == "softmax":
      logits = tf.matmul(output, w) + b
      loss = tf.nn.seq2seq.sequence_loss_by_example(
          [logits],
          [tf.reshape(self._targets, [-1])],
          [tf.ones([batch_size * num_steps])])
      self._cost = cost = tf.reduce_sum(loss) / batch_size
    elif loss_function == "nce":
      num_samples = 10
      labels = tf.reshape(self._targets, [-1,1])
      hidden = output
      loss = tf.nn.nce_loss(w_t, b,                           
                            hidden,
                            labels,
                            num_samples, 
                            vocab_size)
    elif loss_function == "sampled_softmax":
      num_samples = 10
      labels = tf.reshape(self._targets, [-1,1])
      hidden = output
      loss = tf.nn.sampled_softmax_loss(w_t, b,
                                        hidden, 
                                        labels, 
                                        num_samples,
                                        vocab_size)

    self._cost = cost = tf.reduce_sum(loss) / batch_size
    self._final_state = state

このモデルへの呼び出しは次のようになります。

mtrain = PTBModel(is_training=True, config=config, loss_function="nce")
mvalid = PTBModel(is_training=True, config=config)

ここでは特別なことはしていません。損失関数の変更は非常に簡単です。では、なぜうまくいかないのでしょうか。

ありがとう、ヨリス

4

1 に答える 1

0

ベースライン モデル (Softmax) を使用すると、あるエポックで 700 をはるかに上回るはずです。損失を変更することで、ハイパー パラメーターの一部 (特に学習率) を再調整する必要がある場合があります。

また、評価モデルは、Softmax を使用して真の問題を報告する必要があります。そうしていますか?

于 2016-07-14T19:23:23.220 に答える