如何修改预训练情感分类模型以输出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
相关产品推荐
相关产品推荐

