478. Feedback Prize - Evaluating Student Writing | feedback-prize-2021
感谢主办方举办这场精彩的比赛,并祝贺获奖者们。
这个问题既有趣又充满挑战。数据和标注的质量都很高。参与这次比赛是一次很好的学习和实践经历。
我在比赛开始时完全忽略了那些分享的NER(命名实体识别)基线。我认为在“目标检测”任务中,分割+后处理的方法不可能比目标检测方法做得更好。我对顶级方案中的后处理想法感到惊讶。
总的来说,我做的是一个类YOLO的文本跨度检测器。我在这个Notebook中分享了我的代码。
模型检查点分享在这里。
要复现检查点,请查看这里的代码和配置。
AutoModelForTokenClassification.from_pretrained(num_labels=1 + 2 + num_classes, ...)
网络输出的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. |