【问题标题】:Need clarity on "padding" parameter in Bert Tokenizer需要澄清 Bert Tokenizer 中的“填充”参数
【发布时间】:2022-12-14 17:07:18
【问题描述】:

我一直在微调一个伯特句子分类模型。在训练中,虽然标记化我已经传递了这些参数padding="max_length", truncation=True, max_length=150,但是在推断时它仍然在预测即使没有传递padding="max_length"参数。

令人惊讶的是,无论是否通过padding="max_length",两种情况下的预测都是相同的,但如果未通过padding="max_length",则推理速度要快得多。

因此,我需要澄清 Bert Tokenizer 中的参数“填充”。有人可以帮助我理解即使没有填充也能最好地预测,因为句子的长度会有所不同,如果在推理时未通过 padding="max_length",它会产生任何负面影响吗?任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: huggingface-transformers bert-language-model huggingface-tokenizers huggingface


    【解决方案1】:

    将句子列表传递给分词器时,每个句子的长度可能不同。因此,每个句子的分词器的输出将具有不同的长度。填充是一种通过向较短的句子添加特殊的填充标记来确保张量是矩形的策略。

    考虑以下示例,其中 padding="max_length", max_length=10。

    batch_sentences = ["Hello World", "Hugging Face Library"]
    encoded_input = tokenizer(batch_sentences, padding="max_length", max_length=10)
    print(encoded_input)
    
    {'input_ids': [[101, 8667, 1291, 102, 0, 0, 0, 0, 0, 0], [101, 20164, 10932, 10289, 3371, 102, 0, 0, 0, 0]], 'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], 'attention_mask': [[1, 1, 1, 1, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 0, 0, 0, 0]]}
    

    请注意,每个句子的分词器的输出都被一个特殊的填充标记“0”填充到 maximum_length,即 10。类似地,如果我们设置 padding=True,每个句子的分词器的输出将被填充到批次中最长序列的长度。

    回到您的问题,如果您将仅包含一个句子的列表传递给分词器,则填充无效。如果您在训练或推理期间设置了 batch_size = 1,您的模型将一次处理一个句子的数据。这可能是填充对您的情况没有影响的原因之一。

    填充对您的情况没有影响的另一个可能但不太可能的原因是您所有的句子都具有相同的长度。最后,如果您没有将分词器的输出转换为 PyTorch 或 TensorFlow 张量,那么具有不同的句子长度不会成为问题。鉴于您使用模型进行训练和测试,这在您的情况下也不太可能。

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 2012-07-18
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多