673. MAP - Charting Student Math Misunderstandings | map-charting-student-math-misunderstandings
首先,衷心感谢组织者和 Kaggle 社区提供的讨论、公开 Notebook 和反馈。我们团队 monsaraida & Masaya 获得了私有榜第 3 名(公共榜第 1 名)。我们感激大家的支持。
以下是我们解决方案的概述。在接下来的部分中,我们将依次描述 monsaraida 的部分和 Masaya 的部分。
对于公开 Notebook 中使用的 {问题 / 答案 / 正确?/ 学生解释} 结构,我将 {答案} 更改为 {选项 / selected}。此更改旨在通过不仅呈现学生选择的答案,还呈现其他选项,来帮助 LLM 识别潜在的误解。这一变化非常显著,使 CV/公共榜分数提高了超过 +0.001。这个想法也显著提高了 Masaya 模型的准确性,因此可能是本次竞赛的关键技巧之一。
在本次竞赛中,每个问题的误解类型是预先确定的。因此,作为提示,我为每个问题的提示词中添加了一个误解列表,按其发生概率排序。这一变化使我的 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
在测试了以下备选方案并选择了表现最好的一个后,我采用了 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 进行了监督微调,并使用 AutoModelForSequenceClassification 进行分类。在分类期间,我使用了多任务学习,主要任务是“类别:误解(65 类)”,以及以下辅助任务:
多任务学习对准确率的提升略有贡献。
由于本次竞赛标签的噪声水平较高,我引入了 R-Drop(正则化 Dropout)作为提高泛化能力的措施。R-Drop 的效果显著,使 CV 提高了超过 +0.001。在 R-Drop 之上添加 AWP(对抗权重扰动)带来了进一步的轻微 CV 提升。此外,引入 EMA(指数移动平均)稳定了 CV 并提高了准确性。
为了在 9 小时的推理时间限制内集成多个模型,我实施了多阶段推理。在第一阶段,我对整个测试集进行推理并集成结果。在下一阶段,我按置信度升序对结果排序,仅对置信度最低的 50% 重新运行推理。(我也尝试了更复杂的阶段划分,但并未获得最佳的私有榜分数。)
一些公开 Notebook 使用了 torch_dtype=torch.bfloat16,但 bfloat16 在 Kaggle 的 T4 执行环境中不可用,这增加了转换开销。将 bfloat16 更改为 float16 使推理速度提高了 2 倍。此外,由于本次竞赛通常涉及简短的提示,设置 padding=False 而不是 padding="max_length" 又实现了 2 倍的速度提升。 combined,这些变化 resulted in 4 倍的速度提升,使得能够在集成中使用更多模型,从而有助于提高准确性。
我的 pipeline 概述如下:
使用 CausalLM 的优势之一是,即使标签长度可变,也能实现更高的准确性。
在本次竞赛中,由于每个 QuestionId 出现的标签是预先确定的,我假设限制每个 QuestionId 的标签集——而不是在所有 37 或 65 个标签上进行推理—— will improve accuracy。
因此,我主要使用 CausalLM 进行实验。
我的单个最佳模型是 Qwen2.5-72B-Instruct-GPTQ,但在测试集上的推理耗时约 3 小时。
因此,我设计了一个系统,首先使用相对较小的模型(如 14B 和 32B)进行推理,仅对 top1 概率较低的样本使用 72B 模型重新推理。
这种方法将 72B 模型的推理时间减少到约 1 小时。
注意:此 pipeline 用于我们的公共榜最佳提交,私有榜分数略低于上述 pipeline。
在本次竞赛中,训练集和测试集的 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
你的答案:
主要地,我调整了 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")。
主要训练配置如下:
技巧:高学习率提高了分数,但过高的学习率会导致训练崩溃。
| 模型 | 任务 | 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 来自提交的全训练模型。
推理期间的提示词设计与之前相同。
在这个阶段,由于每个 token 的含义根据 QuestionId 不同而不同,输出被转换回 65 个标签以与 monsaraida 的概率对齐。
True_ / False_ 标签可以从 is_correct 的值推断出来。
至于 72B 模型,由于不能使用 LoRA 进行推理,我执行了 LoRA 合并和量化 (GPTQ),并在卸载到 CPU 的同时执行它。(参考 此处)
A. Correct:NA
B. Neither:NA
F. Misconception:FlipChange
D. Misconception:Mult
R. Misconception:SwapDividend
QuestionId=31778,我在具有高置信度的 Correct Neither 样本的前 2 个预测中包含了反转的 True_ / False_ 版本。然而,这在最终结果上略微降低了准确性,尽管 CV 略有改善。