感谢主办方举办本次竞赛。我也非常感谢 Kaggle 上所有人通过代码和讨论分享见解。
我排名非常低(第754名)的原因是由于从10月3日到比赛结束期间我发高烧,没有足够的时间来提升公共排行榜分数。
(我原本计划先达到在单模型 CV-LB 讨论中报告的类似 CV 分数,然后再尝试提升 CV 和公共排行榜分数。但后来没有足够的时间完成后续部分。)
方法概述
我的解决方案是对两个使用不同设置的 deberta-v3-large 模型进行平均集成。每个模型有4个权重(4折),因此推理时总共使用8个权重。我使用了最佳的 CV 检查点。
CV 设置采用按 prompt_id 分组的分组 K 折交叉验证,每个模型的 CV 分数分别为 0.482 和 0.492。
提交详情
对 CV 分数提升影响最大的部分是在学生总结内部进行池化。与其他改进相比,其他因素带来的提升较小。详细信息将在以下章节中介绍。
模型输入
每个模型的输入各不相同。
一个模型的输入是 [START] text [END] prompt_question [SEP] prompt_text。
另一个模型的输入是 [START_QUESTION] prompt_question [END_QUESTION] [START_SUMMARY] text [END_SUMMARY] [SEP] [START_TITLE] prompt_title [END_TITLE] [START_PROMPT] prompt_text [END_PROMPT]。
模型架构
每个模型采用不同的池化方式。
一种是在 [START] 和 [END] 标记之间进行平均池化,即在学生总结内部进行池化。
另一种是在 [CLS] [SEP] 标记之间进行 GeM 池化,即在问题提示和学生总结内部进行池化。
第二个模型设有独立的预测头,分别用于预测内容得分和表达得分。
其他设置
跨模型的相同设置
- 梯度裁剪 = 10。
- 将
hidden_dropout_prob和attention_probs_dropout_prob设为 0。 - 分词器最大长度为 1024。
跨模型的不同设置
- 训练期间计算 CV 以保存最佳检查点的频率分别为 100 和 300。
- 第二个模型的预测头使用不同的学习率。
未奏效的方法
我猜测本次比赛最重要的部分是如何有效地结合学生总结和提示文本。我大部分时间都专注于这一方向,但均未带来显著提升(它们带来的 CV 分数与最终模型相似,但即便进行集成也没有大幅提升)。
- 将总结和 prompt_text 传入骨干网络后,对总结和 prompt_text 进行池化,然后使用 bert 交叉注意力机制处理它们
- 我还尝试像这篇论文中一样多次堆叠 bert 交叉注意力层和 bert 层,但未奏效
- 将总结和提示文本分别传入骨干网络,然后连接这些隐藏状态并输入到预测头
- 重新初始化层
- 冻结层
- 与其他骨干网络(debrta-large、longformer)进行集成
- 使用相当长的最大长度(4096)