Huggingface 预训练模型的标记器和模型对象具有不同的最大输入长度

Huggingface pretrained model's tokenizer and model objects have different maximum input length

我正在使用来自 huggingface 的 symanto/sn-xlm-roberta-base-snli-mnli-anli-xnli 预训练模型。我的任务需要在相当大的文本上使用它,因此了解最大输入长度至关重要。

以下代码应该加载预训练模型及其分词器:

encoding_model_name = "symanto/sn-xlm-roberta-base-snli-mnli-anli-xnli"
encoding_tokenizer = AutoTokenizer.from_pretrained(encoding_model_name)
encoding_model = SentenceTransformer(encoding_model_name)

因此,当我打印有关它们的信息时:

encoding_tokenizer
encoding_model

我得到:

PreTrainedTokenizerFast(name_or_path='symanto/sn-xlm-roberta-base-snli-mnli-anli-xnli', vocab_size=250002, model_max_len=512, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'bos_token': '<s>', 'eos_token': '</s>', 'unk_token': '<unk>', 'sep_token': '</s>', 'pad_token': '<pad>', 'cls_token': '<s>', 'mask_token': AddedToken("<mask>", rstrip=False, lstrip=True, single_word=False, normalized=False)})
SentenceTransformer(
  (0): Transformer({'max_seq_length': 128, 'do_lower_case': False}) with Transformer model: XLMRobertaModel 
  (1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False})
)

如您所见,分词器中的 model_max_len=512 参数与 max_seq_length=128[=30= 不匹配] 模型中的参数

我怎样才能确定哪一个是真的?或者,如果它们以某种方式响应不同的功能,我如何检查我的模型的最大输入长度?

Model_max_length 是模型可以采用的位置嵌入的最大长度。要检查这个,做 print(model.config) 您会看到 "max_position_embeddings": 512 以及其他配置。

how I can check the maximum input length for my model?

在对文本序列进行编码时,您可以传递 max_length(只要您的模型可以接受): tokenizer.encode(txt, max_length=512)

由于您使用的是 SentenceTransformer 并将其加载到 SentenceTransformer class,它会将您的输入截断为 128 个标记,如 documentation (the relevant code is here 所述):

property max_seq_length
Property to get the maximal input sequence length for the model. Longer inputs will be truncated.

这个你也可以自己查:

fifty = model.encode(["This "*50], convert_to_tensor=True)
two_hundered = model.encode(["This "*200], convert_to_tensor=True)
four_hundered = model.encode(["This "*400], convert_to_tensor=True)

print(torch.allclose(fifty, two_hundered))
print(torch.allclose(two_hundered,four_hundered))

输出:

False
True

底层模型 (xlm-roberta-base) 能够处理最多 512 个标记的序列,但我假设 Symanto 将其限制为 128,因为他们在训练期间也使用了这个限制(即嵌入可能不适合超过 128 个标记的序列。