可否训练Sentence Transformer做序列分类及用其微调AutoModelForSequenceClassification?
完全可以。Sentence Transformer的核心是预训练语言模型+池化层,用来生成句向量。要做序列分类,只需要在池化层的输出后面添加一个分类头(比如全连接层),然后在你的分类数据集上进行端到端微调就行。
你也可以先利用Sentence Transformer生成所有样本的句向量,再用这些句向量训练一个独立的分类器(比如逻辑回归、SVM),不过端到端微调的效果通常更好。
这个操作是完全可行的,出现的警告属于正常现象:
Some weights of
BertForSequenceClassificationwere not initialized from the model checkpoint at sent_tranf_model/ and are newly initialized: ['classifier.bias', 'classifier.weight'] You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.
原因很简单:你的Sentence Transformer模型本身没有分类头(就是警告里提到的classifier层),而AutoModelForSequenceClassification默认会带一个分类头用于下游任务。所以加载模型时,预训练语言模型和池化层的权重都正常加载了,只有新增的分类头权重是随机初始化的,这也是为什么警告提示你需要在下游任务上训练这个模型——只要你在二分类数据集上完成微调,分类头的权重就会被训练到位,之后就能正常做推理了。
另外注意你的代码里有个笔误:模型加载路径写的是"ssent_tranf_model/",和tokenizer的"sent_tranf_model/"不一致,建议修正成相同路径,避免加载错误。
内容的提问来源于stack exchange,提问作者MAC

