作为“自然语言处理”场景的新手,我正在实验性学习并实现了以下代码段:
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)
我理解应用该模型会返回一个“torch.FloatTensor
,其中包含取决于配置 (RobertaConfig) 和输入的各种元素”,并且可以使用 .logits
访问 logits。如前所述,我已将 .softmax 函数应用于张量以返回归一化概率并将结果转换为列表。我输出以下内容:
[0.5022980570793152, 0.49770188331604004]
这些概率是否代表某种总体“屏蔽”概率?
第一个和第二个索引在输入的上下文中代表什么?
编辑:
model.num_labels
输出:
2
@cronoik解释说该模型“试图对序列属于一类还是另一类进行分类”
我是否可以假设因为没有经过训练的输出层,所以这些类还没有任何意义?
例如,我可以假设句子在分析后属于第 1 类的概率是 0.5。但是,什么是 1 类?
此外,具有预训练输出层的模型卡,例如 open-ai detector帮助区分什么是 "real"和 "fake" ,所以我可以假设一个句子属于哪个类。但是,如果没有某种类型的“mapping.txt”文件,我如何确认这些“标签”呢?
最佳答案
您已经初始化了一个默认情况下的 RobertaForSequenceClassification
模型(在 roberta-base
和 roberta-large
没有经过训练的输出层的情况下)用于序列分类)尝试对序列属于一类还是另一类进行分类。我使用了“属于一个类或另一个类”这一表达方式,因为这些类还没有任何意义。输出层未经训练,需要微调才能赋予这些类意义。 Class 0
可以是 X
而 Class 1
可以是 Y
或者相反。例如,为 IMDb 评论数据集微调序列分类模型的教程将负面评论定义为 Class 0
,将正面评论定义为 Class 1
(link)。
您可以通过以下方式检查支持的类的数量:
model.num_labels
输出:
2
您得到的输出是每个类别的非标准化概率(即 logits )。您应用 softmax 函数对这些概率进行归一化,这导致第一类的概率为 0.5022980570793152,第二类的概率为 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< 的概率
。我们知道这些类是什么,因为作者提供了 mapping这澄清了它。如果模型的作者没有提供这样的映射(通过自述文件或原始训练代码),我们只能通过随机样本测试来猜测每个类代表什么。
model card您提到的没有提供有关类映射到它们所代表的内容的任何有用信息,但模型是 provided by huggingface itself他们提供了一个 link用于训练模型的代码。 dataset.py表示 fake
由 Class 0
表示,real
由 Class 1
表示。
关于python - RobertaForSequenceClassification 的对数和概率代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65221079/