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)
ここでは特別なことはしていません。損失関数の変更は非常に簡単です。では、なぜうまくいかないのでしょうか。
ありがとう、ヨリス