我们如何/应该在HuggingFace代币分类(实体识别)中对类别进行加权



我正在使用HuggingFace Transformers库和自定义数据加载器训练一个令牌分类(也称为命名实体识别(模型。

与大多数NER数据集一样(我想是吗?(,存在相当显著的类不平衡:绝大多数令牌都是other,即不是实体,当然不同实体类之间也有一些差异。

正如我们所期望的;准确度";指标被扭曲了很多:如果你的代币90%是other,那么获得80%的代币分类准确率并不是什么大成就。。。一个微不足道的模型本可以做得更好!

我可以计算一些额外的、更有洞察力的评估指标,但这让我想知道。。。我们是否可以/应该以某种方式将这些重量纳入训练损失中?如何使用典型的*ForTokenClassification模型(例如BERTForTokenClassification(来实现这一点?

这实际上是一个非常有趣的问题,因为似乎还没有打算自己修改模型中的损失。特别是对于BertForTokenClassification,我发现了这个代码段:

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

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

  • 您可以在本地修改transformer的副本,并从那里安装库,这使得这只是代码中的一个小更改,但在不同的实验中更换零件可能会非常麻烦,或者
  • 您返回您的logits(默认情况下是这样(,并在拥抱面模型的实际正向传递之外计算您自己的损失。在这种情况下,您需要注意前向呼叫中计算的损失的任何潜在传播,但这应该在您的能力范围内进行更改

最新更新