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

微调DeBERTa-v3-base用于反讽检测时遇RuntimeError问题求助

问题原因与解决方法

核心问题

你用AutoModel加载DeBERTa时,模型返回的是全序列所有token的隐藏状态(形状[32, 30, 768]),后续分类头直接在该维度做映射,最终输出形状为[32, 30, 2];而BERT/RoBERTa的代码中,你要么用了封装好的序列分类模型,要么手动提取了<[BOS_never_used_51bce0c785ca2f68081bfa7d91973934]>位置的token输出,得到单样本特征向量(形状[32, 768]),分类后输出[32, 2],和标签形状匹配。

解决方法

方法1:使用封装好的序列分类模型(推荐)

直接用AutoModelForSequenceClassification,它会自动处理序列特征的池化/提取,输出直接匹配分类任务的形状要求:

from transformers import AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained(
    "microsoft/deberta-v3-base",
    num_labels=2  # 反讽检测为二分类任务
)

方法2:手动处理DeBERTa的输出(若需自定义)

如果一定要用AutoModel,需要手动提取有效特征向量后再喂给分类头:

  • 提取<[BOS_never_used_51bce0c785ca2f68081bfa7d91973934]>token的隐藏状态:DeBERTa输入开头为<[BOS_never_used_51bce0c785ca2f68081bfa7d91973934]> token,取其对应的隐藏状态即可得到单样本特征:
# 前向传播获取模型输出
outputs = model(**inputs)
# 取[:, 0, :]即<[BOS_never_used_51bce0c785ca2f68081bfa7d91973934]>位置的特征,形状为[32, 768]
cls_feature = outputs.last_hidden_state[:, 0, :]
# 传入分类头得到[32, 2]的logits
logits = your_classification_head(cls_feature)
  • 均值池化:对全序列的隐藏状态做均值计算,也能得到单样本特征:
outputs = model(**inputs)
# 对序列维度(dim=1)做均值,形状为[32, 768]
pooled_feature = outputs.last_hidden_state.mean(dim=1)
logits = your_classification_head(pooled_feature)

补充说明

交叉熵损失函数要求输入的logits形状为[batch_size, num_labels],标签形状为[batch_size]。DeBERTa之前的输出多了序列长度维度,导致损失计算时形状不匹配,触发报错RuntimeError: Expected target size [32, 2], got [32]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:45:41