使用TensorFlow的RNN(LSTM)语言模型获得给定序列的下一个单词的概率分布?

时间:2016-08-31 06:47:54

标签: tensorflow lstm language-model

我正在运行TensorFlow的RNN(LSTM)语言模型示例here。 它运行并完美地报告困惑。

我想要的只有三件事:

  1. 给定一个序列(例如w1 w5 w2000 w750),给出词汇表中下一个词的概率分布。我不知道如何使用教程中的模型。

  2. 我希望模型返回最可能序列的排名(例如n-gram),n可以作为输入。

    1. 给定一个序列,我想要它的概率。
    2. 我是TensorFlow和RNN的新手,所以请告诉我您是否需要比我提供的更多信息。

      语言模型的代码是here

2 个答案:

答案 0 :(得分:2)

我也是张力流和RNN的新手,所以这是我对你的问题的看法 假设你有一个包含2000个单词(太小)的语料库,i-th LSTM单元格的输出是一个含有2000个元素的向量,每个元素对应一个概率,这个向量是(i+1)th的预测概率分布字。
回到你的问题。

  1. 你只需要将输入[w1,w5,w2000,w750]提供给RNN,然后你得到四个向量,每个向量有2000个元素(语料库中的单词数),然后你拿起最后一个输出向量,那就是5th单词的预测概率分布,你也可以在这个向量上做一个argmax来找到5th位置最可能的单词。

  2. 即使我可以为任何给定的序列分配概率,我也不知道这个问题。

  3. 同时考虑您的输入[w1,w5,w2000,w750],在计算RNN后,您有四个输出向量表示为[v1,v2,v3,v4],然后您只需要找到w5的概率v1 1}},w2000 v2w750 v3中的embedding并乘以这些概率,这就是输入的概率(v4未被使用,因为它用于预测这个序列的下一个词,w1也没有被使用,因为它通常是起始令牌。

  4. 编辑:

    训练完模型后,你应该得到一个嵌入矩阵cell,一个RNN单元softmax_w / softmanx_b和一个softmax权重/偏差python,你可以用这三样东西生成输出

    def inference(inputs): """ inputs: a list containing a sequence word ids """ outputs = [] state = cell.zero_state(1,tf.float32) # 1 means only one sequence embed = tf.embedding_lookup(embedding,inputs) sequence_length = len(inputs) for i in range(sequence_length): cell_output,state = cell(embed[:,i,:],state) logits = tf.nn.xw_plus_b(cell_output,softmax_w,softmax_b) probability = tf.nn.softmax(logits) outputs.append(probability) return outputs

    len(inputs)

    最终输出是包含sess.run(tensor)向量/张量的列表,您可以使用numpy.arraysys.path的形式获取张量值。
    这是我编写的一个非常简单的函数,应该让您对完成培训后如何生成输出有一个大概的了解。

答案 1 :(得分:1)

我知道这可能会晚一点,但是我还是会回答。 使用TensorFlow 2,可以使用model.predict_proba()函数在组成模型的类上获得概率分布。在语言模型的上下文中,这将根据您使用的词汇表来产生序列中下一个单词的概率分布。

关于第二个问题,我不知道是否可能。根据我的理解,这意味着您需要对语言模型进行一些不同的训练。我假设以前使用序列的最后一个成分作为标签,但是在这种情况下,可以使用n-gram序列。

您提出的最后一个问题是我目前也面临的一个问题。如果您能够找到此问题的答案,请告诉我。