【问题标题】:how to learn language model? [closed]如何学习语言模型? [关闭]
【发布时间】:2018-04-28 01:59:05
【问题描述】:
-
我正在尝试使用基于 Penn Treebank (PTB) 语料库的 LSTM 训练语言模型。
我在想我应该简单地用语料库中的每个二元组进行训练,以便它可以根据前面的单词预测下一个单词,但是它无法根据多个前面的单词预测下一个单词。
那么训练语言模型到底是什么?
在我当前的实现中,批量大小=20,词汇量大小为 10000,所以我有 20 个结果矩阵,包含 10k 个条目(参数?),损失是通过与 20 个基本事实进行比较来计算的10k 个条目的矩阵,其中只有实际下一个单词的索引为 1,其他条目为零。这是一个正确的实现吗?我感到困惑 2 几乎不会随着迭代而改变,这绝对不在通常的正确范围内,比如 100 左右。
【问题讨论】:
标签:
machine-learning
nlp
lstm
language-model
penn-treebank
【解决方案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 都设置为默认值,则结果将小于10,但如果将average_across_timesteps 设置为为False,序列的平均长度约为10,它将约为100。