BertForSequenceClassification 与用于句子多类分类的 BertForMultipleChoice

sta*_*010 13 python machine-learning pytorch bert-language-model huggingface-transformers

我正在处理文本分类问题(例如情感分析),我需要将文本字符串分类为五个类别之一。

我刚开始在PyTorch 中使用Huggingface Transformer包和 BERT。我需要的是一个顶部带有 softmax 层的分类器,以便我可以进行 5 向分类。令人困惑的是, Transformer 包中似乎有两个相关选项:BertForSequenceClassificationBertForMultipleChoice

我应该使用哪一种来完成我的 5 向分类任务?他们的适当用例是什么?

BertForSequenceClassification的文档根本没有提到 softmax,尽管它确实提到了交叉熵。我不确定这个类是否仅用于 2 类分类(即逻辑回归)。

Bert 模型转换器,顶部带有序列分类/回归头(池化输出顶部的线性层),例如用于 GLUE 任务。

  • 标签(torch.LongTensor of shape (batch_size,), optional, defaults to None)——用于计算序列分类/回归损失的标签。索引应该在 [0, ..., config.num_labels - 1] 中。如果 config.num_labels == 1 计算回归损失(均方损失),如果 config.num_labels > 1 计算分类损失(交叉熵)。

BertForMultipleChoice的文档提到了 softmax,但是从描述标签的方式来看,这个类听起来像是用于多标签分类(即多个标签的二元分类)。

Bert 模型,顶部带有多项选择分类(池化输出顶部的线性层和 softmax),例如用于 RocStories/SWAG 任务。

  • 标签(torch.LongTensor of shape (batch_size,), optional, defaults to None)——用于计算多项选择分类损失的标签。索引应该在 [0, ..., num_choices] 中,其中 num_choices 是输入张量的第二维的大小。

感谢您的任何帮助。

den*_*ger 10

这个问题的答案在于(诚然非常简短的)任务是关于什么的描述:

[ BertForMultipleChoice] [...],例如用于 RocStories/SWAG 任务。

在查看SWAG论文时,任务似乎实际上是学习从不同的选项中进行选择。这与您的“经典”分类任务形成对比,其中“选择”(即类别)不会因您的样本而异,这正是BertForSequenceClassification它的用途。

实际上,通过更改配置中的参数,这两种变体都可以用于任意数量的类(在 的情况下BertForSequenceClassification)和选择(对于BertForMultipleChoicelabels。但是,由于您似乎正在处理“经典分类”的情况,因此我建议使用该BertForSequenceClassification模型。

短期解决缺少的 Softmax 问题BertForSequenceClassification:由于分类任务可以计算独立于样本的类别的损失(与多项选择不同,您的分布正在变化),这允许您使用交叉熵损失,它在反向传播步骤中考虑 Softmax增加数值稳定性