使用 TensorFlow 的 RNN (LSTM) 语言模型获取给定序列的下一个单词的概率分布?
Get the probability distribution of next word given a sequence using TensorFlow's RNN (LSTM) language model?
我是 运行 TensorFlow 的 RNN (LSTM) 语言模型示例 here。
它运行并完美地报告了困惑。
不过我想要的是三样东西:
给定一个序列(例如 w1 w5 w2000 w750)给我下一个单词在词汇表中的概率分布。不知道怎么用教程里的模型做。
我希望模型return对最可能的序列(例如n-grams)进行排序,n可以作为输入。
和
- 给定一个序列,我想要它的概率。
我是 TensorFlow 和 RNN 的新手,所以如果您需要比我提供的更多的信息,请告诉我。
语言模型的代码是here。
我也是 tensorflow 和 RNN 的新手,所以这是我对你的问题的思考。
假设你有一个由 2000 个单词组成的语料库(太小),i-th
LSTM 单元的输出是一个包含 2000 个元素的向量,每个元素对应一个概率,这个向量是 (i+1)th
的预测概率分布单词。
回到你的问题。
你只需要将输入[w1,w5,w2000,w750]
喂给RNN,你会得到四个向量,每个向量有2000个元素(语料库中的词数),然后你拿起最后一个输出向量,这是 5th
单词的预测概率分布,您还可以对该向量执行 argmax 以找到 5th
位置最可能的单词。
我不知道这个问题,即使我可以为任何给定的序列分配概率。
同时考虑你的输入 [w1,w5,w2000,w750]
,在计算 RNN 之后你有四个输出向量表示为 [v1,v2,v3,v4]
,然后你只需要找到 [=18= 的概率] in v1
, w2000
in v2
, w750
in v3
并将这些概率相乘,这就是您输入的概率(未使用 v4,因为它是用于预测该序列的下一个单词,w1 也不会被使用,因为它通常是起始标记)。
编辑:
训练完模型后,您应该得到一个嵌入矩阵 embedding
、一个 RNN 单元 cell
和一个 softmax weights/biases 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
。
这是我编写的一个简单函数,应该让您大致了解如何在完成训练后生成输出。
我知道这可能来得有点晚,但我还是会回答的。
使用 TensorFlow 2,可以使用 model.predict_proba()
函数获得构成模型的 类 的概率分布。在语言模型的上下文中,这将根据您使用的词汇生成序列中下一个单词的概率分布。
关于你的第二个问题,不知道可不可以。根据我的理解,这意味着你需要以不同的方式训练你的语言模型。我假设之前,您使用序列的最后一个组件作为标签,但在这种情况下,您可以改用 n-gram 序列。
你问的最后一个问题也是我目前面临的问题。如果你能找到这个问题的答案,请告诉我。
我是 运行 TensorFlow 的 RNN (LSTM) 语言模型示例 here。 它运行并完美地报告了困惑。
不过我想要的是三样东西:
给定一个序列(例如 w1 w5 w2000 w750)给我下一个单词在词汇表中的概率分布。不知道怎么用教程里的模型做。
我希望模型return对最可能的序列(例如n-grams)进行排序,n可以作为输入。
和
- 给定一个序列,我想要它的概率。
我是 TensorFlow 和 RNN 的新手,所以如果您需要比我提供的更多的信息,请告诉我。
语言模型的代码是here。
我也是 tensorflow 和 RNN 的新手,所以这是我对你的问题的思考。
假设你有一个由 2000 个单词组成的语料库(太小),i-th
LSTM 单元的输出是一个包含 2000 个元素的向量,每个元素对应一个概率,这个向量是 (i+1)th
的预测概率分布单词。
回到你的问题。
你只需要将输入
[w1,w5,w2000,w750]
喂给RNN,你会得到四个向量,每个向量有2000个元素(语料库中的词数),然后你拿起最后一个输出向量,这是5th
单词的预测概率分布,您还可以对该向量执行 argmax 以找到5th
位置最可能的单词。我不知道这个问题,即使我可以为任何给定的序列分配概率。
同时考虑你的输入
[w1,w5,w2000,w750]
,在计算 RNN 之后你有四个输出向量表示为[v1,v2,v3,v4]
,然后你只需要找到 [=18= 的概率] inv1
,w2000
inv2
,w750
inv3
并将这些概率相乘,这就是您输入的概率(未使用 v4,因为它是用于预测该序列的下一个单词,w1 也不会被使用,因为它通常是起始标记)。
编辑:
训练完模型后,您应该得到一个嵌入矩阵 embedding
、一个 RNN 单元 cell
和一个 softmax weights/biases 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
。
这是我编写的一个简单函数,应该让您大致了解如何在完成训练后生成输出。
我知道这可能来得有点晚,但我还是会回答的。
使用 TensorFlow 2,可以使用 model.predict_proba()
函数获得构成模型的 类 的概率分布。在语言模型的上下文中,这将根据您使用的词汇生成序列中下一个单词的概率分布。
关于你的第二个问题,不知道可不可以。根据我的理解,这意味着你需要以不同的方式训练你的语言模型。我假设之前,您使用序列的最后一个组件作为标签,但在这种情况下,您可以改用 n-gram 序列。
你问的最后一个问题也是我目前面临的问题。如果你能找到这个问题的答案,请告诉我。