如何解码 pytorch OpenAIGPTModel 的输出?

问题描述 投票:0回答:1

我正在尝试解码 pytorch OpenAIGPTModel 的输出,但我不知道如何进行,并且在网上找不到任何完整的示例。

我只找到这么多:

from transformers import OpenAIGPTTokenizer, OpenAIGPTModel
tokenizer = OpenAIGPTTokenizer.from_pretrained('openai-gpt')
model = OpenAIGPTModel.from_pretrained('openai-gpt')

inputs = tokenizer("How does a kite fly?", return_tensors="pt")
outputs = model(**inputs)

outputs
有一个属性
last_hidden_state
,它是形状为
torch.FloatTensor
(batch_size, sequence_length, hidden_size)
。我尝试抓取长度为
hidden_size
的第一个向量并调用
tokenizer.decode(vector.tolist())
,但我得到:

'<unk><unk><unk><unk>'

我还尝试将我的

last_hidden_state
解释为词典中每个标记的一系列概率
tokenizer.decode(torch.argmax(last_hidden_states, 2)[0].tolist())
,但这也输出无意义:

'¨ şore şhave ▪'
pytorch torch openai-api
1个回答
0
投票

在这种情况下,model返回的实际上并不是令牌的表示。

从大型语言模型返回结果的方法有很多:预测特定标记 ID 的 logits、每个可能标记的 softmaxed 百分比概率、表示单个标记嵌入的向量等。

假设你得到了batch x seq_len x hide_size,那么“隐藏大小”大小的向量可能是表示单个标记嵌入的向量。它是用于将令牌嵌入转换为令牌 ID 的“lm_head”。

检查我看到的模型的文档

裸露的 OpenAI GPT 变压器模型输出原始隐藏状态,顶部没有任何特定的头。

没有任何头,你就得不到令牌,只是得到可用于预测令牌的嵌入。您可能想要像 OpenAIGPTLMHeadModel 这样具有 LM Head 的东西。该模型的给定示例似乎输出 logits,因此您可能需要使用 argmax 来选择特定标记。然后,一旦您拥有令牌 ID,您就可以使用类似

tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(tokens))

的内容

您可能想知道为什么用户想要一个返回 logits 而不是 token 的模型。用户并不总是想要选择“最有可能”预测的下一个标记。通过返回 logits(或概率分布),调用者可以从可能的下一个标记中进行采样。

© www.soinside.com 2019 - 2024. All rights reserved.