为什么人们在预训练语言模型时将具有<pad>标记的标签标记的值设置为-100?

问题描述 投票:0回答:1

enter image description here

为什么人们在预训练语言模型时将带有token的label token的值设置为-100?例如下图中带有 pad token 的值,转换为 -100。

我认为这是为了忽略 pad 代币的影响。然后我想知道在计算交叉熵损失时这些值是如何变化的。

python nlp torch loss-function
1个回答
0
投票

在大多数情况下,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
© www.soinside.com 2019 - 2024. All rights reserved.