You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改预训练情感分类模型以输出0-1区间的连续数值?

修改预训练情感分类模型输出0-1数值的方案

核心思路

你要改的其实是模型最后的分类头——原模型bert-base-multilingual-uncased-sentiment是输出5类情感的分类张量,我们只需要把这个多分类的输出头换成单维度线性层,再通过sigmoid激活,就能得到0到1之间的连续值。不用动BERT的预训练主体部分,改分类头就行,操作很简单。

具体实现步骤

1. 替换模型分类头

原模型的classifier是一个输出5维的线性层,我们直接把它换成输出1维的,再加上sigmoid激活:

from transformers import BertForSequenceClassification
import torch.nn as nn

# 加载原预训练模型
model = BertForSequenceClassification.from_pretrained('bert-base-multilingual-uncased-sentiment')

# 修改配置的标签数为1,替换分类头
model.config.num_labels = 1
model.classifier = nn.Linear(model.config.hidden_size, 1)

# 添加sigmoid激活层
model.sigmoid = nn.Sigmoid()

2. 推理时获取0-1得分

改完之后,推理的时候直接用sigmoid处理输出的logits就行,也可以直接把sigmoid整合到模型的forward里(不过分开写更灵活):

from transformers import AutoTokenizer
import torch

tokenizer = AutoTokenizer.from_pretrained('bert-base-multilingual-uncased-sentiment')
text = "这家餐厅的服务太糟糕了"
inputs = tokenizer(text, return_tensors="pt")

with torch.no_grad():
    outputs = model(**inputs)
    # 对logits应用sigmoid得到0-1的情感得分
    sentiment_score = torch.sigmoid(outputs.logits).item()

print(f"情感得分:{sentiment_score}")

关于你贴的代码片段的说明

你贴的BertPreTrainingHeads是BERT预训练阶段(掩码语言模型+下一句预测)的头部,和情感分类任务的分类头不是一回事。情感分类用的是BertForSequenceClassification,它的分类头在model.classifier里,所以完全不用碰预训练头部的代码,只改情感分类的专属输出头就够了。

微调时的注意事项

如果要在自己的数据集上微调模型:

  • 数据集标签要改成0-1的连续值(或者二分类的0/1标签)
  • 损失函数要对应换成回归任务的MSELoss,或者直接用BCEWithLogitsLoss(这个损失函数会自动把logits和sigmoid结合计算,不需要提前做激活)

比如用BCEWithLogitsLoss的示例:

loss_fn = nn.BCEWithLogitsLoss()
# labels是形状为(batch_size,1)的张量,值为0或1
loss = loss_fn(outputs.logits, labels)

内容的提问来源于stack exchange,提问作者GlitzerImHirn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 19:38:26