我试图使用BERTforMaskedLM来获取文本中特定标记的概率。
from transformers import BertTokenizerFast, BertForMaskedLM
text = "George came home late last night"
spans = [(0,6), (27,33)]
model = BertForMaskedLM.from_pretrained('bert-base-uncased')
tokeniser = BertTokenizerFast.from_pretrained('bert-base-uncased')
tokens = tokeniser(text, return_offsets_mapping=True)
input_ids = tokens["input_ids"]
attention_mask = tokens["attention_mask"]然后,对于跨度列表中的每一个跨度,我掩盖了我想要预测的标记。我将他们的attention_mask索引更改为0,将input_id索引更改为tokeniser.mask_token_id。
attention_mask[idx] = 0
input_ids[idx] = tokeniser.mask_token_id我的问题是,如果注意掩码与所有1s保持原样以给模型提供更多的上下文,这是否意味着input_ids也需要修改?或者它们在这个意义上没有关系?
发布于 2022-06-15 15:59:47
当attention_mask == 1表示注意到令牌时。强迫它为零有效地使令牌不可见。这和掩蔽毫无关系。
您不应该直接替换令牌,因为有些单词可以转换成几个标记,掩蔽一半的单词是无用的。最好用标记器特定的“掩码”字替换单词。对于bert-base-uncased,它是[MASK]。然后令牌程序将负责翻译。见HF 示例。
此外,掩蔽连续几个单词会对预测质量产生负面影响。
https://stackoverflow.com/questions/72633607
复制相似问题