transformer - 如何使用 GPT2 模型获得立即下一个单词的概率?
问题描述
我正在尝试拥抱脸 gpt2 模型。我看过run_generation.py
脚本,它会根据提示生成一系列标记。我知道我们可以将 GPT2 用于 NLG。
在我的用例中,我希望(仅)确定给定提示之后的下一个单词的概率分布。理想情况下,这种分布将覆盖整个词汇。
例如,给定提示:“How are”,它应该给出一个概率分布,其中“you”或“they”具有一些高浮点值,而其他词汇单词具有非常低的浮点值。
如何使用拥抱脸变压器来做到这一点?如果不能抱脸,有没有其他的变形金刚模型可以做到这一点?
解决方案
您可以查看生成脚本如何处理概率。
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。
推荐阅读
- javascript - Figma 插件:文件更新回调
- r - 如何对数据集中列的元素进行排序和合并
- ajax - 使用 wordpress 进行 ajax 调用中的禁止错误
- spring-boot - 未设置 Mockito 内容类型
- git - 为什么我不能将我的 Azure DevOps 存储库导入到新的 Azure DevOps 存储库?
- swift - 引用协议元类型时关联类型的问题
- reactjs - 无法将 create-react-app 部署到 github-pages
- hyperledger-fabric - Hyperledger Fabric:链码升级和实例化
- rust - 通过函数参数传入和使用类型?
- c# - 如何禁用无边框表单c#的调整大小