pytorch 如何在GPT中获取令牌的向量嵌入?

eufgjt7s  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(96)

我有一个GPT模型

model = BioGptForCausalLM.from_pretrained("microsoft/biogpt").to(device)

字符串
当我把我的批处理发送给它时,我可以得到logits和隐藏状态:

out = model(batch["input_ids"].to(device), output_hidden_states=True, return_dict=True)
print(out.keys())
>>> odict_keys(['logits', 'past_key_values', 'hidden_states'])


Logits的形状为

torch.Size([2, 1024, 42386])


对应于(batch, seq_length, vocab_length)
如何在最后一层(即在全连接层之后)获得第一个(即dim=0)令牌的向量嵌入?我想应该是[2, 1024, 1024]大小
here看,它应该在last_hidden_state下,但我似乎无法生成它。out.hidden_states似乎是一个长度为25的元组,其中每个元组的维度为[2, 1024, 1024]。我想知道最后一个是不是我要找的,但我不确定。

ozxc1zmp

ozxc1zmp1#

你对output_hidden_state=True和观看out.hidden_states是正确的。这个元素是一个长度为25的元组。根据BioGPT paper和HuggingFace文档,您的模型包含24个Transformer层,元组中的25个元素是第一个嵌入层输出和24个层中每个层的输出。
每个Tensor的形状是[B, L, E],其中B是批量大小,L是输入的长度,E是嵌入的维数。看起来你正在将你的输入填充到1024关于你所指示的形状。因此,第一个标记的表示(在第一个批处理句子中)将是out.hidden_states[k][0,0,:],其形状为[1024]。在这里,k表示您想要使用的层,由您决定您想要使用哪个层,具体取决于您将如何使用它。

相关问题