python - RobertaForSequenceClassification 的对数和概率代表什么?

标签 python nlp pytorch text-classification huggingface-transformers

作为“自然语言处理”场景的新手,我正在实验性学习并实现了以下代码段:

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-baseroberta-large 没有经过训练的输出层的情况下)用于序列分类)尝试对序列属于一类还是另一类进行分类。我使用了“属于一​​个类或另一个类”这一表达方式,因为这些类还没有任何意义。输出层未经训练,需要微调才能赋予这些类意义。 Class 0 可以是 XClass 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 cutenegativeneutralpositive< 的概率。我们知道这些类是什么,因为作者提供了 mapping这澄清了它。如果模型的作者没有提供这样的映射(通过自述文件或原始训练代码),我们只能通过随机样本测试来猜测每个类代表什么。

model card您提到的没有提供有关类映射到它们所代表的内容的任何有用信息,但模型是 provided by huggingface itself他们提供了一个 link用于训练模型的代码。 dataset.py表示 fakeClass 0 表示,realClass 1 表示。

关于python - RobertaForSequenceClassification 的对数和概率代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65221079/

相关文章:

nlp - TurboParser 的依赖解析输出是什么意思?

pytorch - 加载图像的最快方法是什么?

python - 如何将 numpy 数据预加载到像 io.BytesIO 这样的缓冲区中以使其可搜索?

python - 在 Tkinter 程序中运行我的程序

node.js - Dialog api v2 - 获取应用程序默认凭据时出现意外错误 : Could not load the default credentials

python - NLTK 语言建模混淆

python - 无法在 Conda Env 中导入 PyTorch

java - Twistd - Telnet - Python 服务器,Java 客户端,客户端在连接关闭之前永远不会接收字符串,此时所有字符串连接在一起并一起发送

python - 如何根据给定值获取列的百分比

python - 决定是否允许 pip-tools 中不安全的包版本的正确方法是什么?