我正在使用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(默认情况下是这样(,并在拥抱面模型的实际正向传递之外计算您自己的损失。在这种情况下,您需要注意前向呼叫中计算的损失的任何潜在传播,但这应该在您的能力范围内进行更改