-
我正在尝试使用基于Penn树库(PTB)语料库的LSTM训练语言模型。
我在想,我应该简单地对语料库中的每一个双字进行训练,这样它就可以在给定前一个单词的情况下预测下一个单词,但之后它就无法基于多个前一个词来预测下一单词了。
那么,训练一个语言模型到底是什么呢?
-
在我目前的实现中,我的批量大小为20,词汇表大小为10000,因此我有20个10k条目的结果矩阵(参数?),并且通过与20个10k0条目的基本事实矩阵进行比较来计算损失,其中只有实际下一个单词的索引为1,其他条目为零。这是一个正确的实施吗?我对大约2感到困惑,它几乎不会随着迭代而改变,这肯定不在通常的范围内,比如说大约100。
那么,训练语言模型到底是什么呢?
我认为你不需要用语料库中的每一个bigram进行训练。只需使用序列到序列模型,当你预测前一个单词的下一个单词时,你只需选择概率最高的一个。
所以我有20个10k条目的结果矩阵(参数?)
是,每解码一步。
这是一个正确的实现吗?我对大约2感到困惑,它几乎不会随着迭代而改变,这肯定不在通常的范围内,比如说大约100。
您可以先阅读一些开源代码作为参考。例如:单词rnn-tensorflow和字符rnn-tensorflow。困惑很大-log(1/10000),大约是每个单词9(这意味着模型根本没有经过训练,完全随机选择单词,随着模型的调整,复杂性会降低,所以2是合理的)。我认为你的陈述中的100可能意味着每句话的复杂性。
例如,如果使用tf.contrb.seq2seq.sequence_loss来计算复杂度,如果将average_across_timesteps
和average_across_batch
都设置为True作为默认值,则结果将小于10,但如果将average_across_timesteps
设置为False,并且序列的平均长度约为10,则结果约为100。