首页 > 解决方案 > 如何从罗伯塔变压器中获得正确的嵌入?

问题描述

我对应该使用哪个隐藏状态作为微调罗伯塔变压器模型的输出感到困惑。

from transformers import AutoConfig, AutoModelForMaskedLM, AutoTokenizer
config = AutoConfig.from_pretrained("roberta-base")
config.output_hidden_states = True

tok = AutoTokenizer.from_pretrained("roberta-base")
model = AutoModelForMaskedLM.from_pretrained("roberta-base", config=config)

inp = "alright let s do this  "

sentence = tok.encode(inp, padding='max_length', max_length=512, truncation=True, return_tensors='pt')

output = model(sentence)

根据 Huggingface 文档RobertaForMaskedLM

返回一个元组:

  1. masked_lm_loss(可选)
  2. 预测分数
  3. hidden_​​states(可选)
  4. 注意事项(可选)

通过传递配置来启用 hidden_​​states 输出,output是 ( prediction_scores, hidden_states)的元组

我的问题是:我应该使用output[-1][0]还是output[-1][-1]作为微调后的 Roberta 模型的最终输出嵌入?我的理解是,这output[-1][0]是输入到 Roberta 模型的初始嵌入,output[-1][-1]也是最终的嵌入输出。

标签: bert-language-modelhuggingface-transformers

解决方案


output[-1][-1]如果您正在寻找最后一个编码层的输出是正确的。您可以通过查看源代码并通过比较输出来验证它:

import torch

print(len(output[-1]))

outputEmbeddings = model.roberta.embeddings(sentence)

#the first tensor is the output of the embedding layer
print(torch.equal(output[1][0],  outputEmbeddings))

#the second tensor is the output of the first encoding layer
print(torch.equal(output[1][1], model.roberta.encoder.layer[0](outputEmbeddings)[0]))

previousLayer = outputEmbeddings
for x in range(12):
    #it is now the current layer
    previousLayer = model.roberta.encoder.layer[x](previousLayer)[0]
    print(torch.equal(output[1][1+x], previousLayer))

输出:

13
True
True
True
True
True
True
True
True
True
True
True
True
True
True

推荐阅读