返回列表

11th place solution

574. CommonLit - Evaluate Student Summaries | commonlit-evaluate-student-summaries

开始: 2023-07-12 结束: 2023-10-11 智能评测 数据算法赛
第11名解决方案

第11名解决方案

感谢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)

  • Deberta V3 Large [MK 43] - MeanPooling
  • Deberta V3 Large [MK 45] - MeanPooling

这些是相同模型,使用不同种子和平均池化,输入为summary_text + prompt_question,使用RMSE损失,在epoch结束时验证。


(C)

  • Deberta V3 Large [r3] - CLS
  • Deberta V3 Large [r4] - CLS
  • Deberta V3 Large [r5] - CLS

这些是相同模型,使用不同种子和CLS token,输入为summary_text + prompt_question,使用MSE损失,在epoch结束时验证。我在prompt question前添加了"Summarize:"文本,如果我们仔细观察数据,会发现有些prompt包含"cite evidence"且没有"总结"字样,这些对应的摘要文本要长得多。在阅读其他解决方案后,本应尝试更多这样的变体。


(D)

  • Bart Large - Attention Head(蒸馏)
  • Electra Large - Attention Head(蒸馏)
  • Funnel Large - Mean pooling(蒸馏)

所有这些模型都经过蒸馏 - 50% OOF标签和50%真实标签,并添加了AWP - 仅使用summary_text作为输入,在epoch中多次验证。


(E)

  • Deberta v3 large [ar2] - CLS Token
  • Deberta v3 base [ar4] - CLS Token - 蒸馏模型
  • Deberta v3 XSmall [ar5] - CLS Token - 蒸馏模型
  • Deberta v3 XSmall [ar7] - 蒸馏模型 - Bigram Signal

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对应的摘要文本数量在训练集/公开榜单和私有榜单之间也存在很大差异,这些差异导致了很多队伍的排名波动。

许多其他尝试但未包含在最终提交中的方法

  • 基于此分享数据集的MLM方法
  • RAG(类似于LLM中分享的方法)
  • 许多不同的架构、heads、超参数、损失函数
  • 2x T4推理
  • 大型蒸馏模型
  • 向LGBM添加更多特征
  • Catboost、XGBoost、神经网络与LGBM结合
  • 从GPT3.5生成数据
  • 我很高兴我们没有在滑动窗口方法上花费太多时间,因为私有榜单中prompt的最大长度小于或等于公开榜单。

致谢
感谢 @kononenko 提供 兼容的textstat内核

感谢 @tsunotsuno 提供 LGBM特征


🙏 感谢我出色的队友们,很荣幸能与大家一起完成这场比赛。

同比赛其他方案