我尝试使用基于Penn Treebank(PTB)语料库的LSTM训练语言模型。
我在想我应该简单地训练语料库中的每个二元组,以便它可以预测下一个单词给出的前一个单词,但是之后它就不能根据前面的多个单词预测下一个单词。
那么究竟是什么训练语言模型呢?
在我目前的实现中,我的批量大小= 20,词汇量大小为10000,所以我有20个10k条目(参数?)的结果矩阵,并且通过与20个真相进行比较来计算损失10k条目的矩阵,其中只有实际下一个字的索引是1而其他条目是零。这是正确的实施吗?我对2左右的困惑几乎没有改变迭代,这绝对不是通常的正常范围,比如100左右。
答案 0 :(得分:1)
那么究竟是什么训练语言模型?
我认为你不需要训练语料库中的每个二元组。只需使用序列来对模型进行排序,当您预测给定前一个单词的下一个单词时,您只需选择具有最高概率的单词。
所以我有20个10k条目的结果矩阵(参数?)
是的,每步解码。
这是正确的实施吗?我对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.