返回列表

6th place solution. A YOLO-like text span detector.

478. Feedback Prize - Evaluating Student Writing | feedback-prize-2021

开始: 2021-12-14 结束: 2022-03-15 智能评测 数据算法赛
第6名方案:一种类YOLO的文本跨度检测器

第6名方案:一种类YOLO的文本跨度检测器

作者:tascj | 比赛排名:第6名

感谢主办方举办这场精彩的比赛,并祝贺获奖者们。

这个问题既有趣又充满挑战。数据和标注的质量都很高。参与这次比赛是一次很好的学习和实践经历。

我在比赛开始时完全忽略了那些分享的NER(命名实体识别)基线。我认为在“目标检测”任务中,分割+后处理的方法不可能比目标检测方法做得更好。我对顶级方案中的后处理想法感到惊讶。

总的来说,我做的是一个类YOLO的文本跨度检测器。我在这个Notebook中分享了我的代码。

模型检查点分享在这里

要复现检查点,请查看这里的代码和配置。

建模

网络

AutoModelForTokenClassification.from_pretrained(num_labels=1 + 2 + num_classes, ...)
  • 1 用于目标性(objectness,或跨度存在性?前景/背景分类)。
  • 2 用于回归(从前景位置到对应跨度的第一个和最后一个索引的距离)。
  • num_classes 用于话语类型分类。

将Token聚合为Word

网络输出的Logits形状为 (num_tokens, 10)。这很不方便(用于解码输出,以及集成使用不同分词器的模型)。因此我使用RoIAlign将logits聚合为 (num_words, 10)。

训练目标

这个公式化表述的问题在于如何定义目标性训练的正样本。在目标检测中,物体中心是正样本的自然选择。在文本跨度检测中,我发现跨度的第一个单词是正样本的一个好选择。

此外,我在训练期间将每个跨度中成本最低的单词分配为正样本。这是受YOLOX启发的。

数据增强、损失函数、解码输出等

我在训练期间随机将token替换为mask token。

关于其他细节,请查看代码。

后处理

唯一的后处理是NMS(非极大值抑制)。

模型集成

我在训练中使用了单周期策略(one cycle policy),并对最后几个epoch的权重取平均。

为了集成不同的模型/折,我简单地对模型的输出取平均。

WBF(加权框融合)集成在本地验证中不起作用,我也没搞清楚原因。我想我在哪里做错了。

结果

骨干网络 验证集 Public LB Private LB
google/bigbird-roberta-base 0.685~0.69
allenai/longformer-base-4096 0.685~0.69
allenai/longformer-large-4096 0.70~0.71
microsoft/deberta-base 0.70~0.705
microsoft/deberta-large 0.715~0.72
microsoft/deberta-xlarge 0.