Pytorch 在HuggingFace标记分类(实体识别)中,我们可以/应该如何加权类?

Pytorch 在HuggingFace标记分类(实体识别)中,我们可以/应该如何加权类?,pytorch,huggingface-transformers,transformer,Pytorch,Huggingface Transformers,Transformer,我正在用这个库训练一个(又名实体识别)模型,它带有一个定制的数据加载器 与大多数NER数据集(我可以想象?)一样,存在着相当显著的类不平衡性:绝大多数标记都是其他的——即不是一个实体——当然,不同实体类之间也有一些差异 正如我们所料,我的“准确度”指标被这一点扭曲了很多:如果90%的令牌都是其他的,那么获得80%的令牌分类准确度并不是什么了不起的成就。。。一个微不足道的模型本可以做得更好 我可以计算一些额外的、更具洞察力的评估指标——但这让我想知道。。。我们是否可以/应该以某种方式将这些重量纳入

我正在用这个库训练一个(又名实体识别)模型,它带有一个定制的数据加载器

与大多数NER数据集(我可以想象?)一样,存在着相当显著的类不平衡性:绝大多数标记都是
其他的
——即不是一个实体——当然,不同实体类之间也有一些差异

正如我们所料,我的“准确度”指标被这一点扭曲了很多:如果90%的令牌都是
其他的
,那么获得80%的令牌分类准确度并不是什么了不起的成就。。。一个微不足道的模型本可以做得更好


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

这实际上是一个非常有趣的问题,因为似乎无意(尚未)自行修改模型中的损失。特别是对于BertForTokenClassification,我发现:

loss\u fct=CrossEntropyLoss()
# ...
loss=loss\u fct(logits.view(-1,self.num\u labels),labels.view(-1))
要实际更改损耗计算并添加其他参数,例如您提到的权重,您可以采用以下两种方法之一:

  • 您可以在本地修改transformers的一个副本,然后从那里安装库,这使得代码中的更改很小,但在不同的实验中更改部分可能会很麻烦,或者
  • 您返回您的logit(默认情况下是这样),并在huggingface模型的实际向前传球之外计算您自己的损失。在这种情况下,您需要意识到在转发呼叫中计算的损失可能会造成的任何传播,但这应该在您改变的能力范围内