问题标签 [language-model]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - RNN 语言模型 (TensorFlow) 的输入是什么?
我想在 TensorFlow 中构建一个循环神经网络 (RNN),以预测单词序列中的下一个单词。我看过几个教程,例如TensorFlow之一。我知道训练文本中的每个单词都映射到一个整数索引。但是,我仍然没有得到关于输入的一些内容:
网络是批量训练的,例如同时使用 128 个示例。假设我们的词汇表中有 10.000 个单词。网络的输入是大小为(128,sequence_length)的矩阵还是单热编码张量(128,sequence_length,10.000)?
第二维,即序列长度有多大?我是否在批次的每一行中使用一个句子,用零填充比其他句子短的句子?
或者一行可以对应多个句子?例如,一行可以代表“这是一个测试句。怎么样”?如果是这样,第二句话在哪里继续?在同一批次的下一行?还是在下一批的同一行?如何保证 TensorFlow 正确地继续句子?
即使这些问题很简单,我也无法找到答案。我希望有人能帮帮忙!
nlp - 使用 ARPA LM 数据计算概率的正确方法
我正在编写一个用于计算 ngram 概率的小型库。
我有一个由 arpa 文件描述的 LM(它的格式非常简单:probability ngram backoff_weight):
但是我该如何P(we|Hello Bob how are)
正确计算呢?
或者这是正确的方法:
如果我没有 4-gram 的回退权重怎么办(Hello Bob how are)
?
请指出一些用于计算概率的通用公式,或者我在哪里可以阅读它,我真的找不到任何好的东西......
python - 断言 `THIndexTensor_(size)(target, 0) == batch_size' 失败
它发生在我用 PyTorch 编写 Python 代码时。我正在尝试使用 CrossEntropyLoss 构建一个简单的语言模型,但是出现了这个错误。其实我就是按照这个来写这段代码的。这是我的代码。
这是错误:
我现在真的被困在这里,所以任何回复将不胜感激。
language-model - 语言模型评估如何处理未知单词?
因此,为了构建语言模型,将超出词汇量的频率较低的单词替换为“UNK”。
我的问题是,如何评估这种基于“UNK”评估概率的语言模型?假设我们想在测试集上评估这种语言模型的困惑度,对于模型未知的单词,我们得到的概率是基于未知单词的“包”来评估的。
这似乎有问题,因为如果我们将词汇量设置为 1,即所有单词都是未知的,那么这个无所事事的语言模型的 perplexity 将是 1。
python - word2vec - 什么是最好的?添加、连接或平均词向量?
我正在研究一个循环语言模型。为了学习可用于初始化我的语言模型的词嵌入,我使用了 gensim 的 word2vec 模型。训练后,word2vec 模型为词汇表中的每个单词保存两个向量:单词嵌入(输入/隐藏矩阵的行)和上下文嵌入(隐藏/输出矩阵的列)。
如本文所述,至少有三种常用方法可以组合这两个嵌入向量:
- 对每个单词的上下文和单词向量求和
- 求和平均
- 连接上下文和词向量
但是,我找不到有关最佳策略的适当论文或报告。所以我的问题是:
- 是否存在对向量求和、平均或连接的通用解决方案?
- 还是最好的方法完全取决于所讨论的任务?如果是这样,什么策略最适合单词级语言模型?
- 为什么要结合向量呢?为什么不对每个词使用“原始”词嵌入,即包含在输入和隐藏神经元之间的权重矩阵中的那些。
相关(但未回答)的问题:
python - 语言建模 - 模型损失和准确性没有提高,模型拟合不足
我正在尝试在 TensorFlow 中构建单词级语言模型。我的输入是带有单词 id 形状的批次(batch_size, seq_length)
,我的目标是向左移动一个时间步长的输入(因此对于每个单词,目标是序列中的下一个单词)。
该模型接收词嵌入作为输入(词嵌入使用 gensim word2vec 进行预训练)。我手动检查了词嵌入是否正确读入,并且它们对应于正确的词 id。
尽管我已经尝试了很多东西,但我的模型并没有改进。即使在整个训练集上训练 100 个 epoch,准确度仍然保持不变。
我尝试过的(没有任何成功):
- 去除辍学。我的第一个目标是摆脱欠拟合
- 不同的词汇量(100、1000、10000)
- 使用渐变剪裁/不使用渐变剪裁
- 改变权重的初始化
- 数据洗牌
- 不同的优化器(RSMProp、Adam 和梯度下降)
- 更大/更小的模型(2-4 个隐藏层,128-256 个隐藏单元)
- 不同的批量大小(10、20、128)
- 不同的学习率 (0.01, 0.001, 0.1)
- 不同的损失函数(sparse_softmax_cross_entropy_with_logits 或 tf.contrib.seq2seq.sequence_loss)
- 在训练期间补给/不补给 LSTM 的最终状态*
一开始,损失和准确性都在提高。此外,该模型正在调整其预测。但是,在整个训练集上经过一些 epoch 之后,损失和准确率保持不变。此外,模型预测不再改变并且卡住了。这是一个示例,显示了相同输入序列的损失和准确性的发展。在 epoch 30 之后,一切都不再改变:
我已经为此工作了一个星期,我不知道我可以再尝试什么了。我将非常感谢任何提示或想法。
代码的重要部分在这里:
machine-learning - 如何学习语言模型?
我正在尝试使用基于 Penn Treebank (PTB) 语料库的 LSTM 训练语言模型。
我在想我应该简单地训练语料库中的每个二元组,这样它就可以在给定先前单词的情况下预测下一个单词,但是它无法根据多个前面的单词预测下一个单词。
那么训练语言模型到底是什么?
在我当前的实现中,我的批量大小=20,词汇量为 10000,所以我有 20 个 10k 条目(参数?)的结果矩阵,并且通过与 20 个 10k 条目的真实矩阵进行比较来计算损失,其中只有实际下一个单词的索引为 1,其他条目为零。这是一个正确的实现吗?我感到困惑 2 几乎不会随着迭代而改变,这绝对不在通常的正确范围内,比如 100 左右。
tensorflow - tensorflow 中的语言建模 - 如何绑定嵌入和 softmax 权重
正如最近的语言建模论文所建议的那样,我想在我的 RNN 语言模型中使用权重绑定。也就是说,我想在嵌入层和 softmax 层之间共享权重。但是,我不确定如何在 TensorFlow 中做到这一点。
我的网络接收 shape 的输入(batch_size, sequence_length)
。嵌入矩阵具有形状(vocab_size, embedding_size)
并按如下方式创建(我使用的是预训练的 word2vec 嵌入):
对数的计算如下:
我的问题是:
- 必须更改为使用嵌入权重的矩阵是
softmax_w
,对吗? softmax_w
有形状(n_hidden, vocab_size)
。这如何适合嵌入矩阵的大小?还是我必须确保 n_hidden = embedding_size?- 如何在 TensorFlow 中重用嵌入权重?我知道我必须
reuse=True
在 variable_scope 中使用。
python - 从 lm_1b 训练模型中提取单词/句子概率
我已经成功下载了使用 CNN-LSTM 训练的 1B 单词语言模型(https://github.com/tensorflow/models/tree/master/research/lm_1b),我希望能够输入句子或部分句子得到句子中每个后续单词的概率。
例如,如果我有一个句子,如“会说的动物”,我想知道下一个词是“woof”与“meow”的概率。
我知道运行以下命令会产生 LSTM 嵌入:
这将生成文件lstm_emb_step_*.npy
,其中每个文件是句子中每个单词的 LSTM 嵌入。如何将这些转换为经过训练的模型的概率,以便能够与 进行P(woof|An animal that says)
比较P(meow|An animal that says)
?
提前致谢。
tensorflow - nce_loss() 的 Tensorflow num_classes 参数
我对噪声对比估计的理解是,我们从词嵌入(负样本)中采样一些向量,然后计算每个向量的对数似然。然后我们想要最大化目标词的概率和每个负样本词的对数似然之间的差异(所以如果我对此是正确的,我们想要优化损失函数,使其尽可能接近1 尽可能)。
我的问题是这样的:
num_classes
函数参数的目的是什么nce_loss
?我最好的猜测是传入类的数量,以便 Tensorflow 知道我们从中抽取负样本的分布的大小,但这可能没有意义,因为我们只能从变量本身推断分布的大小. 否则,我想不出为什么我们需要知道可能的类总数的原因,特别是如果语言模型只输出 k + 1 个预测(目标词的负样本大小 + 1)。