带有填充和掩码令牌预测的 Bert

Posted

技术标签:

【中文标题】带有填充和掩码令牌预测的 Bert【英文标题】:Bert with Padding and Masked Token Predicton 【发布时间】:2021-10-24 16:25:55 【问题描述】:

我正在使用 Bert 预训练模型(bert-large-uncased-whole-word-masking) 我用Huggingface试了一下我第一次用了这段代码

m = TFBertLMHeadModel.from_pretrained("bert-large-cased-whole-word-masking")
logits = m(tokenizer("hello world [MASK] like it",return_tensors="tf")["input_ids"]).logits

然后我在应用 softmax 后使用 Argmax 来获得最大概率, 到目前为止一切正常。

当我使用 max_length = 100 的填充时,模型开始做出错误的预测并且无法正常工作,并且所有预测的标记都相同,即 119-Token ID

我用于 Argmax 的代码

tf.argmax(tf.keras.activations.softmax(m(tokenizer("hello world [MASK] like it",return_tensors="tf",max_length=,padding="max_length")["input_ids"]).logits)[0],axis=-1)

使用填充之前的输出

<tf.Tensor: shape=(7,), dtype=int64, numpy=array([ 9800, 19082,  1362,   146,  1176,  1122,   119])>

使用 max_length 为 100 的填充后的输出

<tf.Tensor: shape=(100,), dtype=int64, numpy=
array([119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
       119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
       119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
       119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
       119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
       119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
       119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
       119, 119, 119, 119, 119, 119, 119, 119, 119])>

我想知道这个问题是否会在训练新模型时普遍存在,因为必须为训练新模型设置输入形状我填充并标记了数据,但是现在我想知道这个问题是否还会继续存在。

【问题讨论】:

也要为你的模型添加一个 attention_mask ;) 谢谢兄弟,我已经完全忘记了。是的,他们表明了立场。请将其作为答案,以便我可以使您的答案正确。 现在我得到的结果没有问题,但是填充的令牌是随机分配的随机令牌无论如何都可以摆脱它。 【参考方案1】:

正如 cmets 中已经提到的,您忘记将 attention_mask 传递给 BERT,因此它会将添加的填充标记视为普通标记。

您还在 cmets 中询问了如何摆脱填充标记预测。根据您的实际任务,有几种方法可以做到这一点。其中之一是使用boolean_mask 和 attention_mask 删除它们,如下所示:

import tensorflow as tf
from transformers import TFBertLMHeadModel, BertTokenizerFast

ckpt = "bert-large-cased-whole-word-masking"

t = BertTokenizerFast.from_pretrained(ckpt)
m = TFBertLMHeadModel.from_pretrained(ckpt)

e = t("hello world [MASK] like it",return_tensors="tf")
e_padded = t("hello world [MASK] like it",return_tensors="tf", padding="max_length", max_length = 100)

def prediction(encoding):
  logits = m(**encoding).logits
  token_mapping = tf.argmax(tf.keras.activations.softmax(logits),axis=-1)
  return tf.boolean_mask(token_mapping, encoding["attention_mask"])

token_predictions = prediction(e) 
token_predictions_padded = prediction(e_padded) 

print(token_predictions)
print(token_predictions_padded)

输出:

tf.Tensor([ 9800 19082  1362   146  1176  1122   119], shape=(7,), dtype=int64)
tf.Tensor([ 9800 19082  1362   146  1176  1122   119], shape=(7,), dtype=int64)

【讨论】:

以上是关于带有填充和掩码令牌预测的 Bert的主要内容,如果未能解决你的问题,请参考以下文章

使用附加信息预测句子中的遗漏单词

使用 cv2 显示 unet 预测图像

向 BERT/RoBERTa 添加新令牌,同时保留相邻令牌的令牌化

删除 Bert 中的 SEP 令牌以进行文本分类

如何使用注意掩码计算 HuggingFace Transformers BERT 令牌嵌入的均值/最大值?

如何使用训练有素的 BERT 模型检查点进行预测?