Bert with Padding 和 Masked 令牌预测
Bert with Padding and Masked Token Predicton
我正在玩 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 of 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 传递给 BERT,因此它会将添加的填充标记视为普通标记。
您还在评论中询问了如何摆脱填充标记预测。根据您的实际任务,有几种方法可以做到这一点。其中之一是使用 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 预训练模型 (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 of 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 传递给 BERT,因此它会将添加的填充标记视为普通标记。
您还在评论中询问了如何摆脱填充标记预测。根据您的实际任务,有几种方法可以做到这一点。其中之一是使用 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)