如何使用 GPT2 模型获得立即下一个词的概率?

How to get immediate next word probability using GPT2 model?

我正在尝试拥抱面 gpt2 模型。我见过 run_generation.py script,它会根据提示生成一系列标记。我知道我们可以将 GPT2 用于 NLG。

在我的用例中,我希望(仅)确定给定提示后紧接的下一个单词的概率分布。理想情况下,这种分布会覆盖整个词汇。

例如,给定提示:“How are”,它应该给出一个概率分布,其中“you”或“they”具有一些高浮点值,而其他词汇词具有非常低的浮点值。

如何使用拥抱面变压器来做到这一点?如果不能抱脸,有没有其他transformer型号可以做到?

你可以看看 generation script works 的概率如何。

GPT2LMHeadModel(以及其他“MLHead”模型)returns 一个张量,其中包含每个输入的下一个标记可能是什么的非标准化概率。即,模型的最后输出是下一个标记的归一化概率(假设 input_ids 是一个带有来自标记器的标记索引的张量):

outputs = model(input_ids)
next_token_logits = outputs[0][:, -1, :]

您可以通过使用 softmax 对 logits 进行归一化来获得分布。 next_token_logits 第一维中的索引对应于从分词器对象中获取的词汇表中的索引。

当您使用大于 1 的批处理大小和不同长度的序列时,选择最后的 logits 变得很棘手。在这种情况下,您需要在模型调用中指定 attention_mask 以屏蔽填充标记,然后 select 使用 torch.index_select 最后的登录。使用批大小 1 或等长序列批要容易得多。

您可以在变形金刚中使用任何自回归模型:有 distilGPT-2(GPT-2 的精简版)、CTRL(基本上是用一些额外的“命令”训练的 GPT-2)、原始 GPT(在名称 openai-gpt 下),XLNet(专为上下文嵌入而设计,但可用于以任意顺序生成)。应该还有更多,可以Hugging Face Model Hub.