登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  科技周边 >  人工智能

Transformers AutoModelForSequenceClassification 的 logits 怎样映射成类别概率

来源:17golang原创

时间:2026-11-14 20:42:09 172浏览 收藏

Transformers 的 AutoModelForSequenceClassification 返回的 logits 是分类头的原始分数,不是百分比。单标签分类时,对最后一维做 softmax 才能得到每个类别的相对概率;类别编号还要通过模型配置里的 id2label 翻译成业务名称。

官方地址:https://huggingface.co/docs/transformers/

最稳妥的读取链路是:保留 outputs.logits 的批量维度,使用 config.id2label 解释索引,再根据 problem_type 选择 softmax、sigmoid 或直接读取回归值。
先记住三点
  • logits.shape 通常是 [batch_size, num_labels]。
  • argmax 只决定最可能的索引,不能代替概率计算。
  • 单标签、多标签和回归的后处理方式不同,不能一律套 softmax。

先分清 logits、类别编号和概率

以二分类为例,模型可能返回 [1.8, -0.4]。这两个数只表示两个类别的相对得分,数值可以为负,也不要求相加等于 1。对最后一维做 softmax 后,才会得到形如 [0.9002, 0.0998] 的归一化结果。

批量输入时不要写成 logits[0] 后再误以为只剩一个类别维度。正确的形状是每行对应一条文本,每列对应一个标签;dim=-1 可以明确沿类别维度计算。

Transformers 分类模型输出 logits 形状与标签索引的静态关系说明图
图1:说明图,展示 batch_size、num_labels、logits 索引和标签名称之间的静态关系。

从配置读取标签顺序

模型输出第 0 列是什么类别,不能靠字母顺序或自己的猜测决定。Transformers 配置提供 id2label 和 label2id,而 num_labels 表示分类头的类别数。展示结果时先取最大分数的索引,再用同一个配置对象翻译。

from transformers import AutoConfig

# 配置只负责描述模型和标签,不会加载模型权重。
config = AutoConfig.from_pretrained("distilbert/distilbert-base-uncased-finetuned-sst-2-english")
label_id = 1
label_name = config.id2label.get(label_id, f"LABEL_{label_id}")
print(label_name)

如果配置没有可靠的标签名称,就保留 LABEL_0 这样的占位符,并在业务层维护明确的映射;不要把模型输出的位置直接当作中文类别名。

按任务类型选择后处理

单标签分类表示一条输入只能属于一个类别,使用 softmax(logits, dim=-1),每行概率和为 1。多标签分类允许一条输入同时命中多个标签,通常对每个 logit 独立使用 sigmoid,各列之间不必相加为 1。回归任务则通常直接读取输出值,不应把它伪装成类别概率。

Transformers 单标签、多标签和回归输出后处理方式的静态对照图
图2:结构图,对照三类任务的输出语义与 softmax、sigmoid、直接读取之间的边界。

这也是为什么只看模型名称不够:应结合配置的 problem_type、num_labels 以及训练任务定义判断后处理方式。

最小推理示例:概率与标签一起返回

import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

model_id = "distilbert/distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForSequenceClassification.from_pretrained(model_id)

texts = ["The interface is clear.", "The request failed."]
# padding 让同一批输入能组成规则张量,attention_mask 让模型忽略补齐位置。
inputs = tokenizer(texts, return_tensors="pt", padding=True, truncation=True)

# 推理阶段关闭梯度,避免为展示概率额外保留反向传播图。
with torch.no_grad():
    outputs = model(**inputs)

logits = outputs.logits
probabilities = torch.softmax(logits, dim=-1)
predicted_ids = probabilities.argmax(dim=-1)
labels = [model.config.id2label.get(int(i), f"LABEL_{int(i)}") for i in predicted_ids]

for text, label, scores in zip(texts, labels, probabilities):
    # 每一行 scores 与 config.id2label 的索引一一对应。
    print(text, label, scores.tolist())

这里的对照重点不是某个固定分数,而是形状和索引关系:probabilities[i] 对应第 i 条输入,probabilities[i, j] 对应该输入的第 j 个标签。

常见误区与结果核对

现象原因处理
把 logits 当百分比原始分数没有归一化单标签任务沿最后一维做 softmax
标签名称对不上手写顺序与模型配置不一致使用同一份 id2label
多标签概率总和大于 1独立标签本来就不是互斥事件使用 sigmoid,并单独设置业务阈值
分类输出维度不符合预期模型配置或任务类型选错先打印 logits.shape、num_labels、problem_type

最后可把三个字段记录到日志:logits.shape、model.config.id2label 和实际采用的后处理函数。这样比只记录一个最终标签更容易定位模型配置错位。

相关问题

softmax 应该在哪个维度计算? 对常见的分类输出使用 dim=-1,即沿类别维度计算,不要跨 batch 维度归一化。

argmax 后还需要 softmax 吗? 如果只需要类别编号,argmax 就够;如果需要概率、排序或置信度展示,还应计算 softmax。

为什么多标签任务不能用 softmax? softmax 会强制所有类别竞争同一个总和,而多标签任务允许多个类别同时成立,应对每个 logit 独立使用 sigmoid。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>