RobertaForSequenceClassification 的对数和概率代表什么?
What do the logits and probabilities from RobertaForSequenceClassification represent?
作为“自然语言处理”场景的新手,我正在实验学习并实现了以下代码段:
from transformers import RobertaTokenizer, RobertaForSequenceClassification
import torch
path = "D:/LM/rb/"
tokenizer = RobertaTokenizer.from_pretrained(path)
model = RobertaForSequenceClassification.from_pretrained(path)
inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
outputs = model(**inputs)
pred_logits = outputs.logits
print(pred_logits)
probs = pred_logits.softmax(dim=-1).detach().cpu().flatten().numpy().tolist()
print(probs)
我理解应用模型return是一个torch.FloatTensor
,其中包含各种元素,具体取决于配置 (RobertaConfig) 和输入“,并且可以使用 .logits
访问登录。如前所述,我已将 .softmax 函数应用于张量以 return 归一化概率并将结果转换为列表。我输出以下内容:
[0.5022980570793152, 0.49770188331604004]
这些概率是否代表某种总体“屏蔽”概率?
第一个和第二个索引在输入的上下文中代表什么?
编辑:
model.num_labels
输出:
2
@cronoik 解释说模型“试图 class 确定一个序列属于一个 class 还是另一个”
我是否可以假设因为没有经过训练的输出层,所以这些 class 还没有任何意义?
比如我可以假设post分析的句子属于class1的概率是0.5。然而,什么是class1?
此外,带有预训练输出层的模型卡,例如 open-ai detector help differentiate between what is "real" and "fake",所以我可以假设一个句子属于 class。但是,如果没有某种类型的“mapping.txt”文件,我如何确认这些“标签”?
您已经初始化了一个 RobertaForSequenceClassification
模型,默认情况下(在 roberta-base
和 roberta-large
的情况下没有序列 classification 的训练输出层)尝试class确定一个序列属于一个 class 还是另一个。我使用了“属于一个 class 或另一个”这个表达,因为这些 class 还没有任何意义。输出层未经训练,需要微调才能赋予这些 class 意义。 Class 0
可能是 X
而 Class 1
可能是 Y
或相反。例如,为 IMDb 评论数据集微调序列 class化模型的教程将负面评论定义为 Class 0
,将正面评论定义为 Class 1
(link).
您可以检查支持的 classes 的数量:
model.num_labels
输出:
2
您得到的输出是每个 class(即 logits)的非归一化概率。您应用 softmax 函数对这些概率进行归一化,这导致第一个 class 为 0.5022980570793152,第二个 class 为 0.49770188331604004。
也许您感到困惑,因为这些值彼此接近。让我们尝试使用预训练输出层 (model card) 的模型:
sentimodel = RobertaForSequenceClassification.from_pretrained('cardiffnlp/twitter-roberta-base-sentiment')
print(sentimodel.num_labels)
outputs = sentimodel(**inputs)
print(outputs.logits.softmax(dim=-1).tolist())
输出:
3
[[0.0015561950858682394, 0.019568447023630142, 0.9788752794265747]]
这些值表示句子 Hello, my dog is cute
为 negative
、neutral
或 positive
的概率。我们知道这些 class 是什么,因为作者提供了 mapping 来阐明它。如果模型的作者没有提供这样的映射(通过自述文件或原始训练代码),我们只能通过随机样本测试来猜测每个 class 代表什么。
model card you have mentioned does not provide any useful information regarding the mapping of the classes to what they represent, but the model is provided by huggingface itself and they provide a link to the code used for training the model. The dataset.py表示fake
由Class 0
表示,real
由Class 1
表示。
作为“自然语言处理”场景的新手,我正在实验学习并实现了以下代码段:
from transformers import RobertaTokenizer, RobertaForSequenceClassification
import torch
path = "D:/LM/rb/"
tokenizer = RobertaTokenizer.from_pretrained(path)
model = RobertaForSequenceClassification.from_pretrained(path)
inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
outputs = model(**inputs)
pred_logits = outputs.logits
print(pred_logits)
probs = pred_logits.softmax(dim=-1).detach().cpu().flatten().numpy().tolist()
print(probs)
我理解应用模型return是一个torch.FloatTensor
,其中包含各种元素,具体取决于配置 (RobertaConfig) 和输入“,并且可以使用 .logits
访问登录。如前所述,我已将 .softmax 函数应用于张量以 return 归一化概率并将结果转换为列表。我输出以下内容:
[0.5022980570793152, 0.49770188331604004]
这些概率是否代表某种总体“屏蔽”概率?
第一个和第二个索引在输入的上下文中代表什么?
编辑:
model.num_labels
输出:
2
@cronoik 解释说模型“试图 class 确定一个序列属于一个 class 还是另一个”
我是否可以假设因为没有经过训练的输出层,所以这些 class 还没有任何意义?
比如我可以假设post分析的句子属于class1的概率是0.5。然而,什么是class1?
此外,带有预训练输出层的模型卡,例如 open-ai detector help differentiate between what is "real" and "fake",所以我可以假设一个句子属于 class。但是,如果没有某种类型的“mapping.txt”文件,我如何确认这些“标签”?
您已经初始化了一个 RobertaForSequenceClassification
模型,默认情况下(在 roberta-base
和 roberta-large
的情况下没有序列 classification 的训练输出层)尝试class确定一个序列属于一个 class 还是另一个。我使用了“属于一个 class 或另一个”这个表达,因为这些 class 还没有任何意义。输出层未经训练,需要微调才能赋予这些 class 意义。 Class 0
可能是 X
而 Class 1
可能是 Y
或相反。例如,为 IMDb 评论数据集微调序列 class化模型的教程将负面评论定义为 Class 0
,将正面评论定义为 Class 1
(link).
您可以检查支持的 classes 的数量:
model.num_labels
输出:
2
您得到的输出是每个 class(即 logits)的非归一化概率。您应用 softmax 函数对这些概率进行归一化,这导致第一个 class 为 0.5022980570793152,第二个 class 为 0.49770188331604004。
也许您感到困惑,因为这些值彼此接近。让我们尝试使用预训练输出层 (model card) 的模型:
sentimodel = RobertaForSequenceClassification.from_pretrained('cardiffnlp/twitter-roberta-base-sentiment')
print(sentimodel.num_labels)
outputs = sentimodel(**inputs)
print(outputs.logits.softmax(dim=-1).tolist())
输出:
3
[[0.0015561950858682394, 0.019568447023630142, 0.9788752794265747]]
这些值表示句子 Hello, my dog is cute
为 negative
、neutral
或 positive
的概率。我们知道这些 class 是什么,因为作者提供了 mapping 来阐明它。如果模型的作者没有提供这样的映射(通过自述文件或原始训练代码),我们只能通过随机样本测试来猜测每个 class 代表什么。
model card you have mentioned does not provide any useful information regarding the mapping of the classes to what they represent, but the model is provided by huggingface itself and they provide a link to the code used for training the model. The dataset.py表示fake
由Class 0
表示,real
由Class 1
表示。