我有一个像这样的句子:"I like sitting in my new chair and _____ about life"
我有一组特定的标记,比如["watch", "run", "think", "apple", "light"]
我想计算每个标记作为下一个单词出现在不完整句子中的概率。希望我能得到"think"
的概率高于"apple"
的概率
我正在使用pytorch transformers(特别是GPT2LMHeadModel),一个可能的解决方案是使用每个标记评估完整句子的分数,但当要评估的标记数大约为100或1000时,计算时间开始过长
必须能够只处理一次句子,并以某种方式使用隐藏状态来计算标记集的概率,但我不知道如何做到这一点
有什么想法吗?提前谢谢
编辑:
实际代码如下所示(每次估计完整句子的概率)。对于每一个句子,运行score()
方法大约需要0.1秒,如果我想计算数千个单词,它会变成数小时
from pytorch_transformers import GPT2Tokenizer, GPT2LMHeadModel
import pandas as pd
model = GPT2LMHeadModel.from_pretrained("gpt2")
model.eval()
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
def score(sentence):
tokenize_input = tokenizer.tokenize(sentence)
tensor_input = torch.tensor([tokenizer.convert_tokens_to_ids(tokenize_input)])
loss = model(tensor_input, labels=tensor_input)
return -loss[0].item()
candidates = ["watch", "run", "think", "apple", "light"]
sent_template = "I like sitting in my new chair and {} about life"
print({candidate: score(sent_template.format(candidate)) for candidate in candidates})
您的示例生成了以下输出,并在我的环境中用了大约48.5秒完成了282个糖果(我只运行了3次):
如评论中所述,我认为您可以使用past参数和fast tokenizer进行一些计算,如下面评论的示例所示:
输出:
这里的运行时间是40.5秒,有282个候选者(又是3个循环)。你也看到我失去了一些精确性
非常感谢patrickvonplaten对过去的实现给了我一个很好的explanation
相关问题 更多 >
编程相关推荐