-
我正在尝试使用基于Penn Treebank (PTB)语料库的LSTM训练一个语言模型。
我原本以为只要用语料库中的每一个双词组合进行训练,就可以根据前面的词预测下一个词,但这样做就无法根据多个前置词来预测下一个词了。
那么,训练语言模型到底是什么意思呢?
-
在我的当前实现中,我设置了批量大小为20,词汇量为10000,因此我有20个结果矩阵,每个矩阵有10000个条目(参数?),损失是通过将20个真实矩阵与这些结果矩阵进行比较来计算的,真实矩阵中只有实际下一个词的索引为1,其他条目为零。这是否是正确的实现?我得到的困惑度大约为2,并且在迭代过程中几乎没有变化,这显然不在通常的范围内,通常应该是大约100左右。
回答:
那么,训练语言模型到底是什么意思呢?
我认为你不需要用语料库中的每一个双词组合进行训练。只要使用序列到序列模型,当你根据前面的词预测下一个词时,你只需选择概率最高的那个词即可。
因此我有20个结果矩阵,每个矩阵有10000个条目(参数?)
是的,每个解码步骤都是这样。
这是否是正确的实现?我得到的困惑度大约为2,并且在迭代过程中几乎没有变化,这显然不在通常的范围内,通常应该是大约100左右。
你可以先阅读一些开源代码作为参考。例如:word-rnn-tensorflow 和 char-rnn-tensorflow。困惑度通常是 -log(1/10000),大约是9 每个词(这意味着模型完全没有被训练,选择词完全是随机的,随着模型的调整,复杂度会降低,所以2是合理的)。我认为你提到的100可能指的是每个句子的复杂度。
例如,如果使用 tf.contrib.seq2seq.sequence_loss 来计算复杂度,如果你将 average_across_timesteps
和 average_across_batch
都设置为默认的True,结果将小于10,但如果你将 average_across_timesteps
设置为False,并且序列的平均长度大约为10,那么结果将大约为100。