0

我用我自己的未标记数据对变形器进行预训练,如下所示:

python train_mlm.py sentence-transformers/LaBSE train.txt 基于https://github.com/UKPLab/sentence-transformers/tree/master/examples/unsupervised_learning/MLM

然后我想获得 setnences 的嵌入。代码:

model = AutoModelForMaskedLM.from_pretrained('output/sentence-transformers_LaBSE-2021-12-28_13-03-20')
tokenizer = AutoTokenizer.from_pretrained('output/sentence-transformers_LaBSE-2021-12-28_13-03-20')

model = model.eval()

english_sentences = [
    "dog",
    "Puppies are nice.",
    "I enjoy taking long walks along the beach with my dog.",
]
encoded_input = tokenizer(english_sentences, padding=True, truncation=True, max_length=64, return_tensors='pt')
with torch.no_grad():
    model_output = model(**encoded_input)

print(model_output[0].shape)

问题是我的输出形状类似于 (3, 14, 500 000)。如果没有对我的数据形状进行培训,则为 (3, 14, 768)。我做错了什么?训练后如何获得最终嵌入?

4

1 回答 1

0

您预先训练了一个使用掩码语言建模 (MLM) 的转换器。这并不意味着您必须在之后使用传销头AutoModelForMaskedLM.from_pretrained:因为您的下游任务实际上是在给定一些输入的情况下嵌入生成。这是通过仅使用微调模型的基本编码器来实现的,而不需要任何头部:AutoModel.from_pretrained(...). 这将返回您期望的输出形状。

有关您获得的输出形状的更多说明:

  • (B, L, 768) 是运行没有头的 Transformer 编码器的预期输出,即作为嵌入的生成器。这是因为 768 是 Transformer 编码器通常的隐藏层大小。这就是AutoModel提供的。
  • (B, L, 500000) 是运行带有 MLM 头的 Transformer 编码器的预期输出,即作为 MLM 任务中掩码标记的预测器。大约 500000 是词汇量大小,预测的 logits 表明哪个词汇标记更有可能填补空白。这就是AutoModelForMaskedLM提供的。

给定 B = 批量大小和 L = 批量序列长度。

于 2021-12-30T11:30:05.417 回答