我们如何 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 模型的实际前向传递之外计算你自己的损失。在这种情况下,您需要注意在 内 前向调用中计算的损失的任何潜在传播,但这应该在您的权力范围内进行更改。
我正在使用自定义数据加载器训练 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 模型的实际前向传递之外计算你自己的损失。在这种情况下,您需要注意在 内 前向调用中计算的损失的任何潜在传播,但这应该在您的权力范围内进行更改。