我正在使用TensorFlow RNN教程来训练具有NCE丢失或采样softmax的语言模型,但我仍然想报告困惑。然而,我得到的困惑是非常奇怪的:对于NCE我得到几百万(太可怕了!)而对于采样softmax,我在一个纪元后获得了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)
我在这里没有做任何异国情调,改变损失功能应该非常简单。那么为什么它不起作用?
谢谢, 里斯
答案 0 :(得分:0)
使用基线模型(Softmax),在一个时代中你应该比700更好。通过改变损失你可能需要重新调整一些超参数 - 特别是学习率。
此外,您的评估模型应该使用Softmax来报告真正的困惑 - 你这样做吗?