返回列表

3rd place (Public 1st) solution : monsaraida & Masaya

673. MAP - Charting Student Math Misunderstandings | map-charting-student-math-misunderstandings

开始: 2025-07-10 结束: 2025-10-15 个性化学习 数据算法赛
第 3 名(公共榜第 1)解决方案:monsaraida & Masaya

第 3 名(公共榜第 1)解决方案:monsaraida & Masaya

作者: monsaraida & Masaya

发布时间: 2025-10-16

竞赛排名: 私有榜第 3 名(公共榜第 1 名)

首先,衷心感谢组织者和 Kaggle 社区提供的讨论、公开 Notebook 和反馈。我们团队 monsaraida & Masaya 获得了私有榜第 3 名(公共榜第 1 名)。我们感激大家的支持。

概述

以下是我们解决方案的概述。在接下来的部分中,我们将依次描述 monsaraida 的部分和 Masaya 的部分。

解决方案概述图

monsaraida 的部分

提示词工程 (Prompting)

选项 (Choices)

对于公开 Notebook 中使用的 {问题 / 答案 / 正确?/ 学生解释} 结构,我将 {答案} 更改为 {选项 / selected}。此更改旨在通过不仅呈现学生选择的答案,还呈现其他选项,来帮助 LLM 识别潜在的误解。这一变化非常显著,使 CV/公共榜分数提高了超过 +0.001。这个想法也显著提高了 Masaya 模型的准确性,因此可能是本次竞赛的关键技巧之一。

提示 (Hints)

在本次竞赛中,每个问题的误解类型是预先确定的。因此,作为提示,我为每个问题的提示词中添加了一个误解列表,按其发生概率排序。这一变化使我的 CV 分数提高了 +0.0003。

提示词示例

问题:形状的未阴影部分占几分之几?请给出最简形式。[图片:一个三角形被分成 9 个相等的小三角形。其中 6 个被阴影覆盖。]
选项:(A) \( \frac{1}{3} \) (B) \( \frac{3}{9} \) (C) \( \frac{3}{6} \) (D) \( \frac{3}{8} \)
Selected: \( \frac{1}{3} \)
正确?是
学生解释:1 能整除所有数,3 能整除 9
此问题的常见错误:Incomplete, WNB

训练 (Training)

基座模型 (Base model)

在测试了以下备选方案并选择了表现最好的一个后,我采用了 Qwen/Qwen3-14B 作为基座模型:google/gemma-2-9b-it, Qwen/Qwen2.5-14B-Instruct, Qwen/Qwen2.5-Math-7B-Instruct, deepseek-ai/deepseek-math-7b-instruct, Qwen/Qwen2.5-Coder-14B, deepseek-ai/DeepSeek-R1-Distill-Qwen-14B, mistralai/Mistral-Nemo-Instruct-2407, mistralai/Mixtral-8x7B-Instruct-v0.1, mistralai/Mathstral-7B-v0.1, AmanPriyanshu/gpt-oss-10.8b-specialized-instruction_following-pruned-moe-only-15-experts

带有多任务学习的 LoRA SFT

我使用 LoRA 进行了监督微调,并使用 AutoModelForSequenceClassification 进行分类。在分类期间,我使用了多任务学习,主要任务是“类别:误解(65 类)”,以及以下辅助任务:

  • True / False(2 类)
  • Correct / Misconception / Neither(3 类)
  • Misconception(36 类)

多任务学习对准确率的提升略有贡献。

提升泛化能力 (Improving generalization)

由于本次竞赛标签的噪声水平较高,我引入了 R-Drop(正则化 Dropout)作为提高泛化能力的措施。R-Drop 的效果显著,使 CV 提高了超过 +0.001。在 R-Drop 之上添加 AWP(对抗权重扰动)带来了进一步的轻微 CV 提升。此外,引入 EMA(指数移动平均)稳定了 CV 并提高了准确性。

推理 (Inference)

多阶段推理 (Multi-stage inference)

为了在 9 小时的推理时间限制内集成多个模型,我实施了多阶段推理。在第一阶段,我对整个测试集进行推理并集成结果。在下一阶段,我按置信度升序对结果排序,仅对置信度最低的 50% 重新运行推理。(我也尝试了更复杂的阶段划分,但并未获得最佳的私有榜分数。)

加速推理的技巧

一些公开 Notebook 使用了 torch_dtype=torch.bfloat16,但 bfloat16 在 Kaggle 的 T4 执行环境中不可用,这增加了转换开销。将 bfloat16 更改为 float16 使推理速度提高了 2 倍。此外,由于本次竞赛通常涉及简短的提示,设置 padding=False 而不是 padding="max_length" 又实现了 2 倍的速度提升。 combined,这些变化 resulted in 4 倍的速度提升,使得能够在集成中使用更多模型,从而有助于提高准确性。

Masaya 的部分

概述

我的 pipeline 概述如下:

Masaya 解决方案流程图

使用 CausalLM 的优势之一是,即使标签长度可变,也能实现更高的准确性。
在本次竞赛中,由于每个 QuestionId 出现的标签是预先确定的,我假设限制每个 QuestionId 的标签集——而不是在所有 37 或 65 个标签上进行推理—— will improve accuracy。
因此,我主要使用 CausalLM 进行实验。

我的单个最佳模型是 Qwen2.5-72B-Instruct-GPTQ,但在测试集上的推理耗时约 3 小时。
因此,我设计了一个系统,首先使用相对较小的模型(如 14B 和 32B)进行推理,仅对 top1 概率较低的样本使用 72B 模型重新推理。
这种方法将 72B 模型的推理时间减少到约 1 小时。

注意:此 pipeline 用于我们的公共榜最佳提交,私有榜分数略低于上述 pipeline。

预处理 (Preprocess)

在本次竞赛中,训练集和测试集的 QuestionId 数量都有限(仅 15 个)。此外,每个 QuestionId 只有 2 到 5 个误解,这也是有限的。因此,为了缩小 CausalLM 的预测 token 范围,提示词被设计为仅包含每个特定 QuestionId 出现的误解、正确和错误选项。正如 此处 讨论的那样,True_ / False_ 标签可以使用基于规则的逻辑稍后分配,因此也被排除以进一步减少预测 token 的数量。这种方法显著提高了准确性,同时也减少了推理时间。(LB/CV +0.002~0.003 且速度加快约 3 倍)
如上所述,在提示词中添加其他选项有助于提高准确性。(LB/CV +0.003~0.004)

以下是提示词示例:

<|im_start|>system
你是 Qwen,由阿里巴巴云创建。你是一个有用的助手。<|im_end|>
<|im_start|>user

你是一名数学老师。
你的任务是评估学生的解释是否包含误解,如果有,识别具体的误解类型。

问题文本:计算 \( \frac{1}{2} \div 6 \)
选项:(1) \( \frac{1}{12} \), (2) \( 3 \), (3) \( \frac{6}{2} \), (4) \( \frac{1}{3} \)

学生答案:\( 3 \)
学生答案是否正确:否

学生解释:因为你做 6 的一半 = 3

你必须从以下选项中选择你的答案:

A. Correct:NA
B. Neither:NA
C. Misconception:FlipChange
D. Misconception:Mult
E. Misconception:SwapDividend

<|im_end|>
<|im_start|>assistant
你的答案:

训练模型 (Training Models)

主要地,我调整了 Qwen2.5 作为 CausalLM。
单个最佳模型是使用 EMA 训练的 Qwen2.5-72B-Instruct,但由于其在公共 leaderboard 上的表现低于类似模型,我决定不在最终提交中使用它。
我使用 LoRA 进行微调,r=16,lora_alpha=32,lora_dropout=0.05,target_modules=( "q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj")
主要训练配置如下:

  • epoch=2
  • learning_rate=1e-4
  • per_device_batch_size=4
  • gradient_accumulation_steps=4

技巧:高学习率提高了分数,但过高的学习率会导致训练崩溃。

模型 任务 CV LB* PD 是否最终使用 推理时间 备注 (其他信息)
Qwen/Qwen2.5-14B-Instruct-AWQ CausalLM 0.9469 0.943 0.942 30 分钟
Qwen/Qwen2.5-32B-Instruct-AWQ CausalLM 0.9498 0.949 0.944 60 分钟
Qwen/Qwen2.5-72B-Instruct-GPTQ CausalLM - 0.950 0.946 190 分钟
Qwen/Qwen2.5-72B-Instruct-GPTQ CausalLM - 0.950 0.948 190 分钟 训练时使用 EMA (单个最佳)
Qwen/Qwen2.5-32B-Instruct-AWQ CausalLM 0.9474 0.945 0.941 60 分钟 提示词中无选项
Qwen/Qwen2.5-72B-Instruct-GPTQ CausalLM - 0.946 0.940 190 分钟 提示词中无选项

(*) CV 是根据 fold 0 计算的(因为缺少 GPU)。LB 来自提交的全训练模型。

推理 (Inference)

推理期间的提示词设计与之前相同。
在这个阶段,由于每个 token 的含义根据 QuestionId 不同而不同,输出被转换回 65 个标签以与 monsaraida 的概率对齐。
True_ / False_ 标签可以从 is_correct 的值推断出来。
至于 72B 模型,由于不能使用 LoRA 进行推理,我执行了 LoRA 合并和量化 (GPTQ),并在卸载到 CPU 的同时执行它。(参考 此处

对我无效的方法 (Not Worked for me)

  • Qwen2.5 以外的模型,包括 Llama 3.3-70B 和 gemma2。
  • 用于成对决策的 Causal LM。推理时间太长。
  • 固定每个标签的选项 token。例如:
    A. Correct:NA
    B. Neither:NA
    F. Misconception:FlipChange
    D. Misconception:Mult
    R. Misconception:SwapDividend
  • 预训练其他竞赛数据。我使用了 Eedi 竞赛 的预训练模型,但没有效果。
  • 考虑 此处 讨论的标签噪声。对于 QuestionId=31778,我在具有高置信度的 Correct Neither 样本的前 2 个预测中包含了反转的 True_ / False_ 版本。然而,这在最终结果上略微降低了准确性,尽管 CV 略有改善。
同比赛其他方案