返回列表

2nd place solution

632. Eedi - Mining Misconceptions in Mathematics | eedi-mining-misconceptions-in-mathematics

开始: 2024-09-12 结束: 2024-12-12 学习效果预测 数据算法赛
第二名解决方案 - Eedi 竞赛
标题: 第二名解决方案 (2nd place solution)
作者: RihanPiggy (及团队成员 yokuyama, Qihang Wang, copasta)
发布日期: 2024-12-14
竞赛排名: 第 2 名

祝贺所有获奖者!感谢主办方举办如此有趣的竞赛。我们非常享受这段旅程,并从所有参赛者那里获得了很多灵感!我很幸运能成为这样一个富有成效的团队的一员,并想感谢我所有的团队成员。在这里我们分享我们的解决方案。

预处理 (Preprocess)

我们发现了一个有用的 subject_metadata.csv 文件,其中的 SubjectId 和 SubjectName 与过去在 NeurlPS 2022 上举办的 EEDI 竞赛相同。subject_metadata.csv 包含父主题信息,因此我们利用此元数据构建了一个向量数据库,以便为 train.csvtest.csv 添加父主题信息。

合成数据 (Synthetic data)

合成问题 (synthetic questions)

我们生成了 3 次合成数据,分别称为 generation1、generation2、generation3。
基本方法如下:

  • 向 LLM 提供一个误解 (misconception) 和少量示例,让它生成问题
  • 使用 qwen-math 解决问题以获得正确答案
  • 使用 qwen-math 在误解的约束下解决问题以获得错误答案
  • 使用 gpt-4o-mini 对问题质量进行评分,并选择分数大于 2 的问题(满分 5 分)

每一代之间的区别如下:
Generation1:

  • 少样本示例 (few shot examples):从 train.csv 中随机采样

Generation2:

  • 少样本示例:从 train.csv 和 Generation1 中采样具有相同误解的问题

Generation3:

  • Generation 3 的提示词基于这篇技术博客
  • 少样本示例:从 train.csv、Generation1 和 Generation2 中随机采样 2 个问题

误解增强 (misconception augmentation)

误解通常只包含一个简短的句子。为了使误解的嵌入更有意义,我们使用 LLM 为每个误解生成解释。由于我们在提交时不需要运行误解推理,因此这种方法在提交时没有任何成本。
提示词如下。llama3.1-70b-Instruct 和 qwen2.5-72b-Instruct 的解释在训练检索器方面优于 gpt-4o-mini。

system_prompt_template = 'You are an excellent math teacher about to teach students of year group 1 to 14. The subject of your lesson includes Number, Algebra, Data and Statistics, Geometry and Measure. You will be provided a misconception that your students may have. Please explain the misconception in detail and provide some short cases when the misconception will occur. No need to provide the correct approach. The explanation should be in format of "Explanation: {explanation}"'

user_prompt_template = 'Misconception: {misconception}'

思维链 (Chain of thought)

我们使用 qwen2.5-32B-Instruct-AWQ 生成思维链 (CoT),作为后续检索和重排序的额外输入。提示词如下:

system_prompt_template = "You are an excellent math teacher about to teach students of year group 1 to 14. The detail of your lesson is as follows. Subject:{first_subject}, Topic: {second_subject}, Subtopic {third_subject}. Your students have made a mistake in the following question. Please explain the mistake step by step briefly and describe the misunderstanding behind the wrong answer at conceptual level. No need to provide the correct way to achieve the answer."

user_prompt_template = "Question: {question_text}\nCorrect Answer: {correct_text}\nWrong Answer of your students: {answer_text}\n\nExplanation: \nMisunderstanding: "

检索 (Retrieve)

训练检索模型 (Training the Retrieve Models)

我们使用两种不同的流程训练了检索器。
流程 1 (Pipeline1):

  • 骨干网络:Linq-AI-Research/Linq-Embed-Mistral
  • 损失函数:Arcface
  • 在训练和推理中使用思维链 (CoT) 作为额外输入

流程 2 (Pipeline2):

  • 骨干网络:Qwen/Qwen2.5-14B, Qwen/Qwen2.5-32B, Qwen/QwQ-32B-Preview
  • 损失函数:MultipleNegativesRankingLoss
  • 不使用思维链 (由于推理时间限制)

单个模型的性能如下:

检索器 (retriever) 合成数据 私有榜 (Private LB) 公有榜 (Public LB) 推理时间
Linq-AI-Research/Linq-Embed-Mistral Generation123 0.461 0.484 50 分钟
Qwen/Qwen2.5-14B Generation12 0.479 0.507 45 分钟
Qwen/Qwen2.5-14B Generation123 0.485 0.492 45 分钟
Qwen/Qwen2.5-32B Generation123 0.495 0.536 140 分钟
Qwen/QwQ-32B-Preview Generation123 0.500 0.531 140 分钟

我们最好的提交使用了 Mistral 和 2 个 qwen2.5-14B 的集成,以便为 72B 重排序留出足够的时间,私有榜和公有榜得分为 0.513 和 0.530。

检索器改进的关键因素 (Key Factors for Retriever Improvements)

  1. 使用大模型
    如上表所示,越大越好,GPU 和信用卡是你获得力量所需的一切!!!比赛期间千万不要打开计费页面。
    • qwen2.5-14B + Generation12: H100 约 2 天
    • qwen2.5-14B + Generation123: H100 约 3 天
    • qwen2.5-32B + Generation123(采样): H100 约 5 天
    • QWQ + Generation123(采样): H100 约 5 天
  2. 合成问题
    我相信大多数参与者都使用了合成问题,高质量的问题越多,性能越好。对于我们团队来说,使用 gpt-4o-mini 过滤高质量问题是关键。
  3. 误解增强
    使用误解增强显著提高了检索器性能约 2-4%。
  4. 思维链 (CoT)
    CoT 也很有用。但对于 14B 和 32B 模型,在提示词中添加 CoT 会使推理时间加倍。
  5. 池化选择 (Pooling Selection)
    我们发现,在 Qwen 模型中,最后一个 token 池化 (last token pooling) 比平均池化 (mean pooling) 取得了更好的性能。

重排序 (Rerank)

我们使用列表式 (listwise) 重排序器来优化检索候选项的排名。我们的重排序过程采用了滑动窗口方法:首先,我们使用轻量级 LLM 对排名第 8 到第 17 位的候选项进行重新排序。然后,我们利用更大的模型来确定前 10 名候选项的最终排名。

用于重排序的 LLM 是在合成数据和训练数据的组合上进行微调的。

  • 窗口 1 (第 8 ~ 17 名)
    • Qwen2.5-14B-Instruct
  • 窗口 2 (第 1 ~ 10 名)
    • Qwen2.5-72B-Instruct
    • Llama-3.3-70B-Instruct

重排序改进的关键因素 (Key Factors for Reranking Improvements)

  1. 使用大模型
    我们发现较大的模型(例如 72B 参数)始终比 14B 或 32B 等较小的模型提供更强的验证分数。然而,这些较大的模型最初在公有榜上表现较差,导致了一些担忧。尽管如此,我们信任验证分数,并在最终提交中包含了 72B 模型(特别感谢三次提交规则!)。最终,72B 模型在私有榜上产生了出色的分数,帮助我们获得了奖项。
  2. 思维链 (CoT)
    上述 CoT 提示词极大地提高了重排序性能。
  3. 滑动窗口 (Sliding Window)
    与其增加重排序的候选项数量,不如多次应用滑动窗口策略来优化前 10 名的排名,事实证明这更有效。
    滑动窗口示意图
  4. 测试时增强 (Test-Time Augmentation)
    在推理过程中,我们对某些模型使用了 TTA,通过生成反向顺序的提示词并将其分数与标准提示词的分数平均。这项技术略微提高了准确性。

训练重排序模型 (Training the Rerank Models)

我们基于 atmacup17 的第一名解决方案开发了用于 LLM 重排序器的 QLoRA 训练代码。特别感谢 @kcotton21 分享如此优秀的解决方案。

以下是一些在重排序模型训练期间证明有效的技巧:

  1. 随机化列表式选择
    我们不是总是使用前 10 名候选项作为提示词,而是创建了包含各种前 N 名组合的提示词,如前 3 名、前 5 名、前 15 名和前 25 名。
  2. 合成数据
    用于训练检索器的合成数据也有助于训练重排序器。总共,我们在 8,000 条训练数据(2 个 epoch)和 14,000 条合成记录上进行了训练, resulting in a combined dataset of 22,000 records.
  3. 负样本挖掘 (Negative Sample Mining)
    为了挖掘负样本,我们使用了结合微调后的 dunzhang/stella_en_400M_v5 模型和 TF-IDF 的混合检索器。22,000 个正样本中的每一个都有使用此设置挖掘出的相应负样本。

训练时间

Qwen2.5-14B: H100 上约 2 小时
Qwen2.5-72B: H100 上约 8 小时

量化 (Quantization)

我们使用 intel/auto-round 库对 LLM 重排序器进行量化。与 AutoGPTQ 和 AutoAWQ 相比,该库更易于使用,并且造成的精度损失最小(通常小于 2%)。此外,它可以生成与 vLLM 兼容的模型。

qwen2.5-72b-Instruct 由于其 intermediate_size(29568) 在 multi GPU 上运行存在一些问题。遵循 gptq 文档 中提供的解决方法,我们将权重填充到 29696,然后执行量化。

对于校准,我们使用了训练数据集。以下是量化参数:

bits, group_size, sym = 4, 128, True  
autoround = AutoRound(    
    model, tokenizer, bits=bits, group_size=group_size, sym=sym, dataset=calib_prompts, seqlen=256,    
    nsamples=512,    
    iters=500,    
)

推理 (Inference)

我们使用 vLLM 进行推理。

通过将 enabling_prefix_cache 设置为 True,我们能够节省大约 10% 的推理时间。

jagatkiran 分享了关于使用 72B LLM 模型进行推理的见解。在这次竞赛中,较大的模型往往表现更好,这对我们非常有帮助。

我们使用 logits_processorslogprobs 实现了重排序器,通过为特定 token 分配 +100 的权重。这种方法帮助我们建立了排名器的框架。我们也尝试直接使用分类头,但结果并不令人满意,而且使用 vLLM 进行推理也不容易。我们相信这种方法可能会成为未来竞赛的范例。

消融实验 (Ablation)

基线 (检索器) Qwen14B Qwen72B Llama70B 8-17 名 Qwen14B 私有榜 公有榜
0.513 0.530
0.568 0.583
0.593 0.582
0.596 0.609
0.604 0.622

在最后一天,我们尝试微调 Nexusflow/Athene-V2-Chat 来代替 Llama70B。不幸的是,由于 GPU 和超时问题,带有该模型的提交超时了,但它在排行榜上显示了令人印象深刻的性能:0.609。

训练代码:https://github.com/wangqihanginthesky/Eedi_kaggle
推理代码:https://www.kaggle.com/code/honglihang/2nd-place-inference-code

同比赛其他方案