【发布时间】:2018-02-17 21:13:20
【问题描述】:
我一直在尝试用https://www.tensorflow.org/tutorials/recurrent 理解示例代码 你可以在https://github.com/tensorflow/models/blob/master/tutorials/rnn/ptb/ptb_word_lm.py找到它
(使用张量流 1.3.0。)
我总结了(我认为是)我的问题的关键部分,如下:
size = 200
vocab_size = 10000
layers = 2
# input_.input_data is a 2D tensor [batch_size, num_steps] of
# word ids, from 1 to 10000
cell = tf.contrib.rnn.MultiRNNCell(
[tf.contrib.rnn.BasicLSTMCell(size) for _ in range(2)]
)
embedding = tf.get_variable(
"embedding", [vocab_size, size], dtype=tf.float32)
inputs = tf.nn.embedding_lookup(embedding, input_.input_data)
inputs = tf.unstack(inputs, num=num_steps, axis=1)
outputs, state = tf.contrib.rnn.static_rnn(
cell, inputs, initial_state=self._initial_state)
output = tf.reshape(tf.stack(axis=1, values=outputs), [-1, size])
softmax_w = tf.get_variable(
"softmax_w", [size, vocab_size], dtype=data_type())
softmax_b = tf.get_variable("softmax_b", [vocab_size], dtype=data_type())
logits = tf.matmul(output, softmax_w) + softmax_b
# Then calculate loss, do gradient descent, etc.
我最大的问题是在给定句子的前几个单词的情况下,如何使用生成的模型实际生成下一个单词建议?具体来说,我想流程是这样的,但我无法理解注释行的代码是什么:
prefix = ["What", "is", "your"]
state = #Zeroes
# Call static_rnn(cell) once for each word in prefix to initialize state
# Use final output to set a string, next_word
print(next_word)
我的子问题是:
- 为什么要使用随机(未初始化、未经训练)的词嵌入?
- 为什么要使用 softmax?
- 隐藏层是否必须与输入的维度相匹配(即 word2vec 嵌入的维度)
- 我如何/可以引入预训练的 word2vec 模型,而不是未初始化的模型?
(我把它们都当作一个问题来问,因为我怀疑它们都是相互关联的,并且与我的理解中的一些差距有关。)
我期望在这里看到的是加载现有的 word2vec 词嵌入集(例如,使用 gensim 的 KeyedVectors.load_word2vec_format()),在加载每个句子时将输入语料库中的每个词转换为该表示,然后 LSTM 会吐出一个相同维度的向量,我们会尝试找到最相似的单词(例如使用 gensim 的similar_by_vector(y, topn=1))。
使用 softmax 是否可以让我们免于相对较慢的 similar_by_vector(y, topn=1) 调用?
顺便说一句,对于我的问题Using pre-trained word2vec with LSTM for word generation 的预先存在的 word2vec 部分是相似的。然而,目前那里的答案并不是我想要的。我所希望的是一个简单的英语解释,它为我打开了灯,并填补了我理解中的任何空白。 Use pre-trained word2vec in lstm language model? 是另一个类似的问题。
更新: Predicting next word using the language model tensorflow example 和 Predicting the next word using the LSTM ptb model tensorflow example 是类似的问题。但是,两者都没有显示代码来实际获取句子的前几个单词,并打印出对下一个单词的预测。我尝试从第二个问题和https://stackoverflow.com/a/39282697/841830(带有 github 分支)粘贴代码,但都无法在没有错误的情况下运行。我认为它们可能适用于早期版本的 TensorFlow?
另一个更新:另一个问题基本相同:Predicting Next Word of LSTM Model from Tensorflow Example 它链接到 Predicting next word using the language model tensorflow example(同样,那里的答案并不是我想要的)。
如果仍然不清楚,我正在尝试编写一个名为 getNextWord(model, sentencePrefix) 的高级函数,其中 model 是我从磁盘加载的先前构建的 LSTM,sentencePrefix 是一个字符串,例如“Open the”,它可能返回“pod”。然后我可能会用“Open the pod”来调用它,它会返回“bay”,等等。
一个示例(使用字符 RNN,并使用 mxnet)是https://github.com/zackchase/mxnet-the-straight-dope/blob/master/chapter05_recurrent-neural-networks/simple-rnn.ipynb 末尾附近显示的 sample() 函数
您可以在训练期间调用sample(),但您也可以在训练后调用它,并使用您想要的任何句子。
【问题讨论】:
-
不幸的是,截至我需要提供赏金时,没有一个答案对我有用;这就是为什么我暂时不勾选它的原因。我为似乎最接近回答我的关键问题的答案提供了赏金。
-
答案对您不起作用,因为所有语言模型实现都没有通用答案,每个实现都有点不同。我觉得这个问题应该选择问的层次,要么是直观理解,要么是具体的代码实现。并不是说我反对这个问题,但我确实投了赞成票。其实如果你对模型有一定的了解,并且熟练使用 Python,实现起来并不难。不过这需要时间,所以如果您在实现此特定语言模型后在此处发布您的解决方案,它对其他人将非常有用。
-
@THN 比这更客观一点。 “不起作用”是指我试图从每个建议的答案中实现
getNextWord(model, sentencePrefix),但它们要么以抛出异常而告终,要么在解释中存在差距,而这正是问题的重点。如果/当我得到这个工作,我会自我回答。 (顺便说一句,感谢您第一个回答 - 它确实帮助我澄清了我的问题,从而找到了更多相关问题。) -
你设法让它工作了吗?我正在解决同样的问题!
-
@Caterpilaraoz 不,还没有。所以如果你掌握了它,请发布一些代码!
标签: python tensorflow lstm word2vec word-embedding