返回列表

15th Place Solution: utilizing discourse type

615. Learning Agency Lab - Automated Essay Scoring 2.0 | learning-agency-lab-automated-essay-scoring-2

开始: 2024-04-03 结束: 2024-07-02 智能评测 数据算法赛
第 15 名解决方案:利用话语类型

第 15 名解决方案:利用话语类型

作者: sun
发布日期: 2024-07-03
竞赛排名: 第 15 名

首先,我想感谢主办这样有趣且具有挑战性的比赛,也感谢每一位竞争对手通过辛勤工作慷慨地分享他们的宝贵发现。
这是我的第一篇解决方案 write-up。如果我遗漏了什么,请随时提问。

概述

解决方案概述图

总结

解决方案中最重要的关键部分是利用 Persuade 2.0 语料库中给出的标注话语类型。我将这些话语类型作为目标,训练并预测 essay 中未标注的每个句子,并进行了一些后处理。然后,我将这些预测的话语类型添加到相应句子的开头。我相信这会丰富数据,并明确告诉模型句子在 essay 中的具体角色,帮助它理解 essay 的结构甚至 essay 中提出的论点数量。所有神经网络模型都是在此数据上训练的。与默认给出的 essay 相比,这在 CV 和 LB 上为单模型带来了大约 0.005-0.006 的提升。最后,LightGBM 使用 stacking 神经网络模型的 OOF 预测以及其他特征进行训练。由于 LightGBM 的结果有点不稳定,我决定仅在模型 random_state 上混合 3 个不同的种子。

话语类型

首先,我从 [(DISCOURSE_TYPE)] 开始,并将用户定义的特殊 token 添加到 tokenizer 中。然后,我意识到使用模型已经预训练过的 token(单词)可能更好,而不是使用在微调时可能持有不同含义的用户定义 token。为了增加与预训练中使用的特殊 token 的对比度,使用 <> 代替 []。所以从 [LEAD] 变为 <Lead> 或从 [CONCLUDE] 变为 <Concluding>。注意在映射过程中,有很多边缘情况需要处理,大多数标记都正确放置了。然而,有些话语类型标记与其应该所在的位置略有偏差。此外,ClaimCounterclaim 被排除在外,因为在 essay 中包含它们会导致更差的结果。我找不到为什么会这样的证据。因此,这个决定是基于实证实验结果做出的。可能的理论是,这两个比其他更难预测,因此预测出的假阳性比其他标记更多。

例如:

<Lead>I am a scientist at NASA that is discussing the "face" on mars. <Position>I will be explaining how the "face" is a land form. By sharing my information about this isue i will tell you just that.
<Claim>First off, how could it be a martions drawing. There is no plant life on mars as of rite ...

仍有改进空间。例如,正确放置话语类型标记,更好的预测话语类型的解决方案(在此解决方案中,在开发想法的早期阶段使用了 4 折 DeBERTA-v3-small。在提交时,仅预测 4 折小模型的话语类型就花了大约 1 小时,1 折大模型花了 1 小时。后来,我发现是一次 feeding 1 个 batch(一次 1 个句子)。将 batch size 增加到 32 将推理时间减少到不到 20 分钟。然而,当时已经太晚无法做出任何更改)。

交叉验证策略

在比赛的早期阶段,花费了大量时间寻找 robust 的交叉验证策略。我从简单的 StratifiedKFold 开始, followed by GroupKFoldStratifiedGroupKFold。然而,在 folds 之间观察不到一致性。我最终使用了基于 score 和 prompt_name 的 MultilabelStratifiedKFold,分为 4 折。(Prompt_name 也使用 persuade 2.0 语料库进行训练)。这使得每个 fold 都平等地暴露于 score 和 prompt_name(主题),因为我发现模型在未见过的主题上表现不佳。我采取了保守的路径,因为隐藏测试数据集可能包含未见过的主题。通过比赛结束,我找不到本地 CV 和 LB 之间的密切相关性。实验的方向是朝着本地 CV 和 LB 改进观察到相同趋势和相似范围的路径移动。

Folds 分布图

建模

模型编号 架构 Pooling 层 最大长度 CV 公有榜 私有榜
exp181 DeBERTa-v3-Large Mean Pooling 2048 0.84362 0.802 0.816
exp186 DeBERTa-Large Mean Pooling 2048 0.84839 0.797 0.816
exp187 DeBERTa-v3-Large GeM Pooling 2048 0.84523 0.799 0.820
exp188 Longformer-large-4096 Mean Pooling 2048 0.83610 0.798 0.815
exp197 DeBERTa-Base Attention Pooling 1024 0.83633 0.804 0.818
stacking LightGBM - - 0.85891 0.823 0.835

这 3 个架构是解决方案中最有效的。我也尝试了 bigbird-roberta-large 和 funnel-large。然而,两者在 stacking 时都没有帮助改善本地 CV 和 LB。它们没有被包括在内。对于 pooling 层,Mean pooling 和 GeM pooling 在我的本地 CV 中表现最好,Attention Pooling 被添加以增加变化。
我在所有模型中使用了类似的超参数:

  • 层间学习率衰减 (Layer-wise learning rate decay)
  • lr: 1e-5
  • 无 warmup
  • epoch: 3
  • batch size: 8
  • 梯度裁剪 (gradient cliping): 1.0

特征

对于特征工程,使用了类似于公共 notebook 的关于 essay 的统计信息。我逐行研究了 notebook,修改了一些部分,并将 Pandas 转为 Polars 以进行更快的处理。pyspellchecker 用于计算拼写错误(这与公共 notebook 中使用 txt 有点不同,或者至少更正确)。
当我探索 Persuade 语料库时,我观察到关于话语类型数量的特定趋势。这个发现帮助我想出了如何利用这些东西的想法。
下表显示了每个分数中话语类型数量的平均值。

话语类型数量统计表

过去比赛的特征也被利用了。(Feedback Prize - English Language Learning)。我采用了 Team turing 的(效率奖第 1 名) 模型,这帮助改善了本地 CV 和 LB。我想感谢他们的 phenomenal 工作。
请考虑给他们点赞。

最终提交选择

我想分享我的本地 CV 与 LB 提交的过山车经历。
我当前的排名是我的第二好 LB 分数和第二好 CV。我选择了 0.824,以防公共 notebook 保持在顶部,这样我就不会被踢下 700+ 排名。同时,我最好的私有分数提交在本地 CV 和 LB 上都略低,所以我没有选择它。

公有榜分数 私有榜分数

有效的方法

  • 带有低学习率的层间学习率衰减
  • 最后一层权重初始化
  • 基于主题和分数的 MultilabelStratifiedKFold(4 折)
  • 话语类型注入(立场、证据、反驳、总结陈述)

无效的方法

  • 对抗训练 (AWP, SiFt)
  • 加权平均 (EMA)
  • 预训练 MLM
  • 使用 MLM 预测话语类型
  • Stacking 回归模型与分类模型
  • 训练多任务
  • 在文章开头添加任务说明

重要引用与特别感谢

编辑

在我阅读了许多顶级解决方案后,我重新计算了特定数据集的 CV:

  • 仅在 Kaggle 数据上计算:0.81440
  • 在非 Kaggle 数据上计算:0.871564

似乎我的解决方案更偏向于 Persuade 语料库而不是测试数据集。

同比赛其他方案