У меня есть такое предложение: "I like sitting in my new chair and _____ about life"
.
И у меня есть КОНКРЕТНЫЙ набор токенов, например ["watch", "run", "think", "apple", "light"]
Я хотел бы рассчитать вероятность того, что каждый из этих токенов появится следующим словом в этом неполном предложении. Надеюсь, я пойму, что вероятность "think"
выше, чем, например, "apple"
.
Я работаю с pytorch-преобразователями (в частности, GPT2LMHeadModel), и возможное решение - оценить оценку полного предложения с каждым из токенов, но когда количество токенов для оценки составляет порядка 100 или 1000, тогда время вычисления начинает быть слишком длинным.
Должна быть возможность обработать предложение только один раз и каким-то образом использовать скрытые состояния для вычисления вероятностей набора токенов, но я не знаю, как это сделать.
Любые идеи? заранее спасибо
РЕДАКТИРОВАТЬ:
Фактический код выглядит так, как показано ниже (каждый раз оценивается вероятность полного предложения). Для каждого предложения требуется около 0,1 секунды для запуска метода score()
, который превращается в часы, если я хочу оценить несколько тысяч слов.
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})