感谢Kaggle组织这次比赛。我在工作中经常处理类似任务,很高兴看到开源社区在这里能取得如此出色的成果。我的最终解决方案主要基于Deberta系列模型,其中仅有一半的测试题目由Mistral大语言模型处理。
系统组件
-
知识数据库
使用Hugging Face数据集 graelo/wikipedia/20230601.en 作为单一知识来源。每个文档被分割成句子,并组合成重叠的文本块,平均长度为1000字符。使用pyserini.index luciferase包建立索引。索引文件占用23 GB空间,检索200×5个查询约需5分钟。 -
重排序模型
每个检索到的文本块都通过自定义重排序模型重新评分。该deberta-v3-base重排序模型的结构类似于标准的DebertaV2ForMultipleChoice模型,但其功能是预测给定问题/答案对的最佳上下文。为构建训练数据集,使用教师模型生成伪排名标签:针对每个正确的问题/答案对,检索若干上下文并通过教师模型评估,将得分最高的上下文视为重排序模型的正确选项。教师模型基于deberta-v3-large构建。 -
多项选择模型
对Deberta和Mistral模型采用标准的DebertaV2ForMultipleChoice方法。唯一特殊处理是:为适应不同选项数量的训练集,按loss * (self.num_labels / num_choices_in_sample)缩放损失函数。 -
掩码语言模型
错误分析显示,当选项间仅有个别词汇差异时,多项选择模型表现较差。针对这种选项高度相似的长文本场景,使用了专用掩码语言模型。该模型易于训练,但应用于5选项问题较困难。理想方案是进行多序列比对并一次性比较差异词,但未找到合适的Python库实现,最终采用sed.standard_sed_backtrace逐对比较选项。 -
交叉引用选项
原预期测试结果会有更大波动,假设测试集中包含更多"以上都不是"类选项。例如,当将验证集的正确答案全部替换为"以上都不是"时,MAP@3分数从0.9骤降至0.3。基于此观察,构建了包含更多此类训练样本的第二阶段排序器。 -
XGBRanker
使用XGBRanker作为融合机制。该排序器在验证集上训练,特征包括:检索模型分数、Deberta/Mistral多项选择模型的logits值,以及"以上都不是"选项的标记特征。
失败的实验
- 为
DebertaV2ForMultipleChoice使用Focal Loss - 移除Llama注意力的因果约束
数据集
| 作者 | 名称 | 大小 | 许可 |
|---|---|---|---|
| @radek1 | all | 39249 | |
| @leonidkulyk | stem_1k_v1 | 928 | |
| @nlztrk | eduqg_llm_formatted | 3297 | |
| @mozattt | test | 3084 | |
| @cdeotte | MMLU | 17433 | 非商业性 |
| AI2 | openbookqa | 5957 | |
| AI2 | ai2_arc | 7787 | |
| AI2 | qasc | 9060 | |
| AI2 | sciq | 13679 | 非商业性 |
消融分析
| 系统 | 私有分数 | 公开分数 | 内核 |
|---|---|---|---|
| k=1, 2xDebertaMC | 0.909763 | 0.907823 | |
| k=8, 2xDebertaMC, 重排序器 | 0.916119 | 0.907823 | |
| k=8, 2xDebertaMC, 重排序器, XGBRanker | 0.915963 | 0.909904 | |
| k=8, 2xDebertaMC, 重排序器, XGBRanker, 掩码LM | 0.915546 | 0.911568 | |
| k=8, 2xDebertaMC, 重排序器, XGBRanker, 掩码LM, MistralMC | 0.931489 | 0.931543 | llm-xgboost-abc |
*k - 从索引中检索的文档数量
结论
本方案的核心组件包括完整的维基百科索引和XGBRanker融合层,后者综合了不同模型的输出:BM-25/重排序分数、Deberta和Mistral多项选择模型的logits值。