为什么我在huggingface MT5模型中执行批量编码时得到不同的嵌入?

问题描述 投票:0回答:1

我正在尝试使用 HuggingFace 的 mt5 模型对一些文本进行编码。我使用的模型如下所示

from transformers import MT5EncoderModel, AutoTokenizer

model = MT5EncoderModel.from_pretrained("google/mt5-base")
tokenizer = AutoTokenizer.from_pretrained("google/mt5-base")

def get_t5_embeddings(texts):
    last_hidden_state = model(input_ids=tokenizer(texts, return_tensors="pt", padding=True).input_ids).last_hidden_state
    pooled_sentence = torch.max(last_hidden_state, dim=1)
    return pooled_sentence[0].detach().numpy()

我在做一些实验时发现相同的文本与其自身的余弦相似度得分较低。我做了一些挖掘,意识到如果我批量进行编码,模型会返回非常不同的嵌入。为了验证这一点,我进行了一个小实验,逐步生成

Hello
的嵌入和 10 个
Hello
的列表。并检查列表中
Hello
和第一个
Hello
的嵌入(两者应该相同)。

for i in range(1, 10):
    print(i, (get_t5_embeddings(["Hello"])[0] == get_t5_embeddings(["Hello"]*i)[0]).sum())

这将返回嵌入中相互匹配的值的数量。 结果是这样的:

1 768
2 768
3 768
4 768
5 768
6 768
7 768
8 27
9 27

每次运行它时,如果批量大小超过 768,就会出现不匹配情况。

为什么我会得到不同的嵌入以及如何解决这个问题?

python machine-learning pytorch nlp huggingface-transformers
1个回答
0
投票

您可以尝试通过调用

model.eval()
将模型设置为评估模式吗?通常模型在初始化时设置为训练模式,其中激活 dropout(随机)和归一化,我们需要在评估模式下停用它。

© www.soinside.com 2019 - 2024. All rights reserved.