首页 > 解决方案 > 如何使用 GPT2 模型获得立即下一个单词的概率?

问题描述

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

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

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

如何使用拥抱脸变压器来做到这一点?如果不能抱脸,有没有其他的变形金刚模型可以做到这一点?

标签: transformerhuggingface-transformers

解决方案


您可以查看生成脚本如何处理概率。

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

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

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

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

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


推荐阅读