为什么人们在预训练语言模型时将带有token的label token的值设置为-100?例如下图中带有 pad token 的值,转换为 -100。
我认为这是为了忽略 pad 代币的影响。然后我想知道在计算交叉熵损失时这些值是如何变化的。
在大多数情况下,label 的 tokenizer vocab ID 通常是正的 >0 ,当一些代码片段将标签标记映射到 -100 时,这是为了避免与实际的 vocab ID 发生任何冲突。
这就是为什么你会经常看到类似的东西:
def compute_metrics(p):
predictions, labels = p
predictions = predictions.argmax(axis=2)
# Remove ignored index (special tokens)
true_predictions = [
[label_list[p] for (p, l) in zip(prediction, label) if l != -100]
for prediction, label in zip(predictions, labels)
]
true_labels = [
[label_list[l] for (p, l) in zip(prediction, label) if l != -100]
for prediction, label in zip(predictions, labels)
]
results = metric.compute(predictions=true_predictions, references=true_labels)
return {
"precision": results["overall_precision"],
"recall": results["overall_recall"],
"f1": results["overall_f1"],
"accuracy": results["overall_accuracy"],
}
要查看用于特定模型的可用令牌 ID 是什么,请检查其标记器,例如
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
min(tokenizer.vocab.values()), max(tokenizer.vocab.values())
[出]:
(0, 30521)
并查看特殊令牌 ID,
print(tokenizer.special_tokens_map)
print()
print(tokenizer.convert_tokens_to_ids('[UNK]'))
print(tokenizer.convert_tokens_to_ids('[SEP]'))
print(tokenizer.convert_tokens_to_ids('[PAD]'))
print(tokenizer.convert_tokens_to_ids('[CLS]'))
print(tokenizer.convert_tokens_to_ids('[MASK]'))
[出]:
{'unk_token': '[UNK]',
'sep_token': '[SEP]',
'pad_token': '[PAD]',
'cls_token': '[CLS]',
'mask_token': '[MASK]'}
100
102
0
101
103