变压器模型预测的意外结果

Posted

技术标签:

【中文标题】变压器模型预测的意外结果【英文标题】:Unexpected result from transformer model prediction 【发布时间】:2021-12-31 10:47:47 【问题描述】:

为 Masked Language Task 使用 huggingface 转换器我预计预测将返回相同的输入字符串以及掩码的标记:

from transformers import BertConfig, BertTokenizer, BertForMaskedLM

model1 = BertForMaskedLM.from_pretrained("bert-base-uncased")
tokenizer1 = BertTokenizer.from_pretrained("bert-base-uncased")

# Read the rest of this [MASK] to understand things in more detail
text = ["Read the rest of this [MASK] to understand things in more detail"]
encoding1 = tokenizer1(text, return_tensors="pt")

# forward pass
outputs1 = model1(**encoding1)
outputs1.logits.argmax(-1)

输出是:

tensor([[1012, 3191, 1996, 2717, 1997, 2023, 2338, 2000, 3305, 2477, 1999, 2062,
         1012, 1012]])

但是当我解码输出时,我没有找到最后一个输入标记 detail

tokenizer1.convert_ids_to_tokens([1012, 3191, 1996, 2717, 1997, 2023, 2338, 2000, 3305, 2477, 1999, 2062, 1012, 1012])


['.',
 'read',
 'the',
 'rest',
 'of',
 'this',
 'book',
 'to',
 'understand',
 'things',
 'in',
 'more',
 '.',
 '.']

也许我使用的模型不正确?还有其他原因吗?

【问题讨论】:

【参考方案1】:

我将这简单地归因于神经网络的错误。虽然 BERT 非常擅长预测大多数样本,但仍可能发生个别标记被错误预测的情况。 此外,需要注意的是,BERT 无法添加/删除标记,即输出必须始终与输入的长度相同(就 BPE 单元而言)。

有趣的是,我尝试在您的例句末尾添加一个句点,即

# Adding period
text = ["Read the rest of this [MASK] to understand things in more detail."]

现在输出“更正确”了:

'. read the rest of this book to understand things in more detail..'

因此,BERT 似乎知道句子 always 必须以句号结尾,这取代了 detail 的正确预测。请注意,[CLS][SEP] 标记(在开头和结尾)也会转换为句点,但这可能是由于类似的解释。

【讨论】:

以上是关于变压器模型预测的意外结果的主要内容,如果未能解决你的问题,请参考以下文章

如何获得 T5 变压器模型的可重现结果

matlab变压器温度仿真

如何将您安装的变压器保存到 blob 中,以便您的预测管道可以在 AML 服务中使用它?

带有变压器的分类模型的 keras 模型中的错误

无法保存变压器模型

预训练变压器模型的配置更改