我正在尝试解码 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 ▪'
在这种情况下,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(或概率分布),调用者可以从可能的下一个标记中进行采样。