1

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

我想要的是三件事:

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

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

  1. 给定一个序列,我想要它的概率。

我是 TensorFlow 和 RNN 的新手,所以请告诉我您是否需要比我提供的更多信息。

语言模型的代码在这里

4

2 回答 2

2

我也是 tensorflow 和 RNN 的新手,所以这是我对您的问题的看法。
假设你有一个包含 2000 个单词(太小)的语料库,i-thLSTM 单元的输出是一个向量,它有 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]表示为w1 用于预测该序列的下一个单词,也没有使用 w1,因为它通常是起始标记)。w5v1w2000v2w750v3

编辑:

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

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.array.
这是我编写的一个简单的函数,应该让您大致了解如何在完成训练后生成输出。

于 2016-08-31T13:07:50.037 回答
2

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

至于你的第二个问题,不知道有没有可能。根据我的理解,这意味着您需要稍微不同地训练您的语言模型。我假设之前,您使用序列的最后一个组件作为标签,但在这种情况下,您可以使用 n-gram 序列。

你问的最后一个问题也是我目前面临的一个问题。如果你能找到这个问题的答案,请告诉我。

于 2020-09-14T05:54:10.087 回答