我们如何 can/should 在 HuggingFace 标记分类(实体识别)中加权 类?

How can/should we weight classes in HuggingFace token classification (entity recognition)?

我正在使用自定义数据加载器训练 token classification (AKA named entity recognition) model with the HuggingFace Transformers 库。

像大多数 NER 数据集(我想?)有一个相当显着的 class 不平衡 :绝大多数标记是 other - 即不是一个实体——当然不同的实体class之间存在一些差异。

正如我们所预料的那样,我的“准确性”指标因此而变得非常扭曲:如果您 90% 的标记是 other...一个简单的模型本可以做得更好!

我可以计算一些额外的、更有洞察力的评估指标——但这让我想知道……Can/should我们以某种方式将这些权重合并到训练损失中?这将如何使用典型的 *ForTokenClassification 模型来完成,例如BERTForTokenClassification?

这实际上是一个非常有趣的问题,因为似乎(还)没有打算自己修改模型中的损失。专门针对 BertForTokenClassification,我发现 this code segment:

loss_fct = CrossEntropyLoss()
# ...
loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1))

要实际更改损失计算并添加其他参数,例如您提到的权重,您可以采用以下两种方式之一:

  • 您可以在本地修改转换器的副本,并从那里安装库,这使得这只是代码中的一个小改动,但在不同的实验中更改部件可能会很麻烦,或者
  • 你 return 你的 logits(默认情况下是这种情况),并在 huggingface 模型的实际前向传递之外计算你自己的损失。在这种情况下,您需要注意在 前向调用中计算的损失的任何潜在传播,但这应该在您的权力范围内进行更改。