如何学习语言模型?

how to learn language model?

  1. 我正在尝试使用基于 Penn Treebank (PTB) 语料库的 LSTM 训练语言模型。

    我在想,我应该简单地训练语料库中的每个二元组,这样它就可以根据前面的单词预测下一个单词,但是它不能根据多个前面的单词预测下一个单词。

    那么训练语言模型到底是什么?

  2. 在我当前的实现中,批量大小=20,词汇量大小为 10000,因此我有 20 个 10k 条目(参数?)的结果矩阵,损失是通过与20 个包含 10k 个条目的真值矩阵,其中只有实际下一个单词的索引为 1,其他条目为零。这是正确的实施吗?我得到大约 2 的困惑度,它在迭代过程中几乎没有变化,这绝对不在通常的正确范围内,比如 100 左右。

So what exactly is it to train a language model?

我认为您不需要对语料库中的每个二元词进行训练。只需使用一个序列到序列模型,当您根据之前的单词预测下一个单词时,您只需选择概率最高的那个。

so I have 20 resulting matrices of 10k entries (parameters?)

是的,每一步解码。

Is this a right implementation? I'm getting perplexity of around 2 that hardly changes over iterations, which is definitely not in a right range of what it usually is, say around 100.

你可以先阅读一些开源代码作为参考。例如:word-rnn-tensorflow and char-rnn-tensorflow。困惑度很大 -log(1/10000),大约是 9 per word(这意味着模型根本没有训练并且完全随机地选择单词,因为正在调整模型复杂度会降低,所以2是合理的)。我认为您陈述中的 100 可能表示每个句子的复杂性。

比如使用tf.contrib.seq2seq.sequence_loss来计算复杂度,如果默认average_across_timestepsaverage_across_batch都为True,结果会小于10,但是如果将 average_across_timesteps 设置为 False 并且序列的平均长度约为 10,则它将约为 100。