我正在尝试通过Bert模型进行推理。在训练期间,我使用padding参数对输入进行了标记,如下所示。
encoding = tokenizer.batch_encode_plus(data,padding="max_length", truncation=True, max_length=150, return_tensors="pt">
然而,在推理过程中,我在没有填充参数的情况下对输入进行了标记,它仍然适用于我。我注意到的唯一变化是推理所花费的时间减少了。
因此,我需要知道Bert如何能够在没有填充的情况下进行预测,因为所有数据点的输入长度都不一致。
这方面的任何信息都会很有帮助。
如果没有填充参数,我预计Bert会抛出错误,但它成功运行了。
我需要知道这是怎么发生的。
除了生成标记的填充矩阵外,标记器还提供具有相同形状的输入注意图(只有0和1)。所有填充的标记都没有得到任何关注,因此填充的嵌入被屏蔽(乘以零),因此它们对输出没有影响。
当你在一个批次中有不同长度的输入序列时,你需要填充。如果您可以使用批大小= 1运行,则不需要填充。
batch_size=2:
示例batch_sents = [
["[CLS]", "It", "rains", "[SEP]", "[PAD]"],
["[CLS]", "It", "is", "raining", "[SEP]"],
]
attentions = [
[1,1,1,1,0],
[1,1,1,1,1],
]