我正在处理一个文本分类问题(例如情感分析),需要将一段文本分类到五个类别中的一个。
我刚开始使用Huggingface Transformer包和PyTorch的BERT。我需要一个带有softmax层的分类器,以便进行五分类。令人困惑的是,Transformer包中似乎有两个相关的选项:BertForSequenceClassification和BertForMultipleChoice。
对于我的五分类任务,我应该使用哪一个?它们的适用场景是什么?
BertForSequenceClassification的文档完全没有提到softmax,尽管它提到了交叉熵。我不确定这个类是否仅用于二分类(即逻辑回归)。
Bert模型变换器带有序列分类/回归头部(在池化输出的顶部有一个线性层),例如用于GLUE任务。
- labels(形状为(batch_size,)的torch.LongTensor,可选,默认为None) – 用于计算序列分类/回归损失的标签。索引应在[0, …, config.num_labels – 1]范围内。如果config.num_labels == 1,则计算回归损失(均方损失),如果config.num_labels > 1,则计算分类损失(交叉熵)。
BertForMultipleChoice的文档提到了softmax,但根据标签的描述,这个类似乎是用于多标签分类(即对多个标签进行二分类)。
Bert模型带有多个选择分类头部(在池化输出的顶部有一个线性层和一个softmax),例如用于RocStories/SWAG任务。
- labels(形状为(batch_size,)的torch.LongTensor,可选,默认为None) – 用于计算多选分类损失的标签。索引应在[0, …, num_choices]范围内,其中num_choices是输入张量第二维的大小。
感谢任何帮助。
回答:
答案在于(尽管非常简短)对任务的描述:
[
BertForMultipleChoice
] […], 例如用于RocStories/SWAG任务。
在查看SWAG的论文时,似乎任务实际上是学习从不同的选项中选择。这与你的“经典”分类任务形成对比,在经典分类任务中,“选择”(即类别)在样本间是不变的,这正是BertForSequenceClassification
的用途。
这两个变体实际上都可以用于任意数量的类别(对于BertForSequenceClassification
),分别是选择(对于BertForMultipleChoice
),通过更改配置中的labels
参数。但由于你似乎在处理“经典分类”的情况,我建议使用BertForSequenceClassification
模型。
简要说明一下BertForSequenceClassification
中缺少的Softmax:由于分类任务可以在不依赖样本的情况下跨类别计算损失(与多选不同,在多选中你的分布是变化的),这允许你使用交叉熵损失,该损失在反向传播步骤中考虑了Softmax,以提高数值稳定性。