574. CommonLit - Evaluate Student Summaries | commonlit-evaluate-student-summaries
感谢Learning Agency Lab和Kaggle主办这场比赛。我们很高兴😌能在最终排名中幸存下来。
比赛背景: www.kaggle.com/competitions/commonlit-evaluate-student-summaries/overview/description
数据: https://www.kaggle.com/competitions/commonlit-evaluate-student-summaries/data
我们最终提交的结果包含了17个不同的模型,使用LGBM进行堆叠。
我们采用了每个fold使用一个prompt的交叉验证策略。所有模型都使用了collate函数来加速训练和推理。较小的batch size也带来了帮助。大多数模型在一个epoch结束时进行评估,少数模型在epoch中多次评估。许多不同的小型模型都经过了蒸馏(如下所述)。
我们所有人都为模型堆叠贡献了力量,有些人甚至从未查看过单个模型的得分,因为公开榜单似乎不太稳定。我们的堆叠模型比单个模型更稳定。
除了模型预测结果外,我们在堆叠中还使用了以下特征:
word_overlap_count
bigram_overlap_count
bigram_overlap_ratio
trigram_overlap_count
trigram_overlap_ratio
- 文本统计特征
Osman
Gutierrez_polini
Dale_chall_readability_score
flesch_kincaid_grade
以下是每个模型的详细描述:
(A) Deberta v3 large - 完整prompt文本伪标签模型 [ar3]
该模型在堆叠中拥有最佳CV分数(0.4721)- 使用最大长度1790训练,顶部带有注意力头。该模型还使用了回译伪标签数据集。每个样本都被翻译成德语再翻译回英语。我们随机选择了50%的该数据用于训练。因此每个训练fold都有约3100个不同的伪标签样本,验证集则没有伪标签样本。
该模型的损失函数是SmoothL1Loss、RMSE Loss和RankLoss的组合 - @fightingmuscle 描述的损失函数 这里
输入格式:[ANSWER_START] + summary_text + [ANSWER_END] + [PROMPT_START] + prompt_text [PROMPT_END] + [QUESTION_START] + prompt_question + [QUESTION_END]
推理最大长度 = 1024
(B)
这些是相同模型,使用不同种子和平均池化,输入为summary_text + prompt_question,使用RMSE损失,在epoch结束时验证。
(C)
这些是相同模型,使用不同种子和CLS token,输入为summary_text + prompt_question,使用MSE损失,在epoch结束时验证。我在prompt question前添加了"Summarize:"文本,如果我们仔细观察数据,会发现有些prompt包含"cite evidence"且没有"总结"字样,这些对应的摘要文本要长得多。在阅读其他解决方案后,本应尝试更多这样的变体。
(D)
所有这些模型都经过蒸馏 - 50% OOF标签和50%真实标签,并添加了AWP - 仅使用summary_text作为输入,在epoch中多次验证。
(E)
Deberta v3 large [ar2] - 该模型的输入顺序与其余模型不同 - text + SEP + prompt_question
Deberta v3 Base和XSmall模型 [ar4, ar5, ar7] - 这些是蒸馏模型。我们使用了先前堆叠的OOF标签。这些模型使用OOF标签进行训练,而验证集仍使用真实标签。
Bigram Signal -
outputs = self.model(input_ids, attention_mask, token_type_ids)
bigram_signal = outputs.last_hidden_state[:, 1:, :] * outputs.last_hidden_state[:, :-1, :]
feature = bigram_signal[:, 0, :]
return feature
(F) Deberta v3 large - 分类 - Attention Head,Mean Pooling - (4x) [ar6]
分析数据后,我们发现有1134个不同的内容和措辞类别,因此添加了使用BCEWithLogitsLoss的分类模型。我们训练了4个不同heads的模型,将它们平均后加入堆叠。
我们还没有完全理解训练集/公开榜单/私有榜单的划分方式。训练集和公开榜单的prompt分布与私有榜单非常不同。公开榜单和训练集中prompt文本很长,但私有榜单中则不然。此外,每个prompt对应的摘要文本数量在训练集/公开榜单和私有榜单之间也存在很大差异,这些差异导致了很多队伍的排名波动。
许多其他尝试但未包含在最终提交中的方法
致谢
感谢 @kononenko 提供 此 兼容的textstat内核
感谢 @tsunotsuno 提供 LGBM特征
🙏 感谢我出色的队友们,很荣幸能与大家一起完成这场比赛。