bert-language-model - 如何从罗伯塔变压器中获得正确的嵌入?
问题描述
我对应该使用哪个隐藏状态作为微调罗伯塔变压器模型的输出感到困惑。
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
:
返回一个元组:
- masked_lm_loss(可选)
- 预测分数
- hidden_states(可选)
- 注意事项(可选)
通过传递配置来启用 hidden_states 输出,output
是 ( prediction_scores
, hidden_states
)的元组
我的问题是:我应该使用output[-1][0]
还是output[-1][-1]
作为微调后的 Roberta 模型的最终输出嵌入?我的理解是,这output[-1][0]
是输入到 Roberta 模型的初始嵌入,output[-1][-1]
也是最终的嵌入输出。
解决方案
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
推荐阅读
- sql - 如何在练习中进行链接?
- ionic-framework - 如何在 Ionic v4 中将自定义大小设置为 FAB?
- database - EF6 - 基于哪个文件的数据库
- reactjs - ReactJs 中的函数 .filter()
- unity3d - Unity3D:如何将网格的颜色数组转换为纹理 2D
- angular - 请参阅使用 ngFor 循环动态生成的自动完成输入
- grafana - Grafana 时钟面板手动安装
- python-3.x - 如何向 Visual Studio 2019 添加虚拟环境?
- javascript - socket.emit() 在创建套接字对象后立即使用时不起作用但是当我在点击事件上调用它时起作用?
- python - 留一个交叉验证的过采样