Kaggle MAP:学生数学误区识别竞赛方案复盘
相关资源
比赛在做什么
MAP(Misconception Annotation Project)比赛的核心目标是:
- 根据学生的数学作答与开放式解释文本,自动判断其答案正确性和潜在误解类型
- 输出每个样本的 Top-3 候选标签(
Category:Misconception) - 使用 MAP@3 评估模型在前 3 个候选中的命中质量
这项任务的实际价值在于,帮助教师更高效地定位学生“看起来会做题、但概念理解有偏差”的关键问题,从而支持更有针对性的教学反馈。
通俗解释
可以把它理解成一个“自动阅卷助教”:
- 它不只看学生答案对不对,还会读学生写的“为什么这么做”
- 然后判断解释是正确、存在明确误区,还是无法归入具体误区
- 最终给出 3 个最可能的
Category:Misconception标签
比如一道小数比较题,学生说“0.355 比 0.8 大,因为 355 比 8 大”。
- 模型需要识别其把小数错误地按照整数思维比较
- 如果正确标签排在第 1 个,得分最高
- 排在第 2 或第 3 个也有分,但权重更低
- 前 3 个都没命中则为 0
这就是 MAP@3 的直觉:猜中很重要,猜中的位置越靠前越好。
我在项目中的主要工作
- 设计并实现多模型融合方案,组合 10 个大语言模型进行协同预测
- 使用 LoRA + Classification Head + Focal Loss 完成 65 类监督微调,缓解类别长尾与难样本问题
- 迭代提示词工程,将自然文本输入重构为结构化 XML,降低题干、作答与解释之间的语义歧义
- 在强模型分支上进一步尝试 Tree-GRPO 风格的二阶段排序后训练,直接利用 MAP@3 Reward 优化 Top-3 决策
- 设计融合基础概率、模型一致性和置信度的集成打分机制,提升最终 Top-3 预测稳定性
方法核心
1) 多模型协同与模型多样性
方案整合了 4 个自训练模型和 6 个公开模型,覆盖 Qwen、DeepSeek、Hunyuan 等不同模型系列,核心目的不是单纯增加模型数量,而是利用不同模型的 Error Diversity 降低单模型偏差。
例如,对同一个学生解释:
- Qwen 可能更擅长识别数学语言中的显式逻辑错误
- DeepSeek 可能对推理关系和数学语义更加敏感
- 其他模型可能在少数类或边界样本上表现更稳定
当某一个模型错误时,只要其他模型的错误模式并不完全相同,最终集成层就有机会通过概率、一致性和置信度信号把正确标签重新推到 Top-3 前列。
因此,多模型方案的核心可以概括为:
Task Specialization + Model Diversity + Ensemble Calibration
2) 基础训练:LoRA + Classification Head + Focal Loss
基础模型采用 Sequence Classification 结构:
结构化文本输入 ↓LLM Backbone + LoRA ↓最终 Hidden State ↓Classification HeadLinear(hidden_dim, 65) ↓65 类 Logits其中 LoRA 插入 Transformer 的 Attention / FFN 投影层中,负责低成本适配 Backbone;Classification Head 位于 Backbone 之后,将文本表示映射为 65 个 Category:Misconception 类别分数。
Focal Loss
Misconception 标签存在明显的类别不平衡。若直接使用普通 Cross Entropy,大量高频、简单样本容易主导梯度,使模型对少数类和高歧义样本学习不足。
Focal Loss 根据真实类别的预测概率降低简单样本权重,把更多优化能力集中到:
- 少数类
- 容易混淆的 Misconception
- 当前模型尚未正确掌握的 Hard Samples
因此它主要解决的是监督训练阶段的长尾与难样本问题。
LoRA
基础大模型已经具备较强的数学与语言理解能力,本任务更接近“将通用能力适配到固定的 Misconception 标签体系”,因此没有必要对全部参数进行 Full Fine-tuning。
LoRA 冻结主体权重,只学习低秩增量:
监督训练时主要更新 LoRA 参数与 Classification Head,从而显著降低训练显存和优化器状态开销,并便于快速训练和比较多个模型分支。
3) 输入结构化:从自然文本到 XML
最初将题干、学生答案和解释直接拼接为自然文本时,模型容易混淆不同字段的语义角色。
因此后续将输入改为类似:
<question>...</question>
<student_answer>...</student_answer>
<student_explanation>...</student_explanation>这种结构化表示明确区分:
- 题目本身是什么
- 学生最终选择了什么
- 学生为什么会这样判断
它的价值不在于“XML 本身更强”,而在于显式提供字段边界和角色信息,减少输入歧义。
4) Tree-GRPO:围绕 MAP@3 的二阶段排序后训练
4.1 为什么仅靠分类 Loss 还不够
LoRA + Focal Loss 优化的是“让真实类别获得更高概率”,但比赛真正评价的是:
正确标签有没有进入 Top-3,以及它最终排在第几位。
因此监督分类 Loss 与 MAP@3 之间仍然存在一定 Objective Gap。
在基础监督模型已经具备较高 Candidate Recall 后,我进一步将 Tree-GRPO 的树状相对优化思想适配到 Top-3 排序任务,直接使用 MAP@3 作为 Outcome Reward。
4.2 本项目中的 Tree 如何生成
这里不生成很长的显式 Chain-of-Thought,而是把一次性 65 类分类改造成 Top-1 → Top-2 → Top-3 的三步条件排序策略。
首先利用监督模型将 65 类压缩为高召回的 Top-6 Candidate Pool。随后每一步仍然由:
LLM Backbone + LoRA ↓Classification Head ↓65 类概率分布产生候选概率,但会把已经选择的标签加入下一步输入。
例如:
Root / \ Rank1:Scale Rank1:Decimal / \ / \ Rank2:Ratio ... Rank2:Scale ... / \ Rank3:Decimal Rank3:Other假设 Candidate Pool (K=6)、Tree 深度固定为 3、每个节点采用 branching factor (b=2) 的随机概率采样,则一棵完整二叉树最多形成:
条 Root-to-Leaf trajectory。
一条路径例如:
Scale → Ratio → Decimal就是一组完整的 Top-3 排序。
因此这里的 Tree 不是自然语言 CoT,而是:
当前排名选择作为下一步输入条件,从多个候选决策处分叉,比较不同 Top-3 路径最终获得的 MAP@3。
4.3 MAP@3 Reward
假设真实标签为 Scale:
路径 A:Scale → Decimal → RatioReward = 1.0
路径 B:Decimal → Scale → RatioReward = 0.5
路径 C:Decimal → Ratio → ScaleReward ≈ 0.33
路径 D:Decimal → Ratio → ArithmeticReward = 0因此 RL 阶段可以直接偏向能够获得更高 MAP@3 的排序路径。
4.4 Tree 如何进行 Credit Assignment
同一个父节点可以随机展开多个不同 child,因此可以利用各子树最终 Reward 的差异判断当前候选决策是否合理。
例如:
Root / \ Scale Decimal │ │ 子树平均奖励 子树平均奖励 0.90 0.35说明当前样本中,“Rank-1 选择 Scale”比“Rank-1 选择 Decimal”更容易形成高质量 Top-3。
这种同一父节点下的局部比较构成 Intra-Tree Advantage;同时还可以将同一 Prompt 不同 Tree、相同深度的节点进行更大范围比较,构成 Inter-Tree Advantage,以获得更加稳定的相对基线。
因此 Tree 的主要价值是:
利用共享状态下不同候选分支的 Outcome 差异,为中间排序动作提供更细粒度的 Credit Assignment。
4.5 GRPO Policy Update
Rollout 阶段使用旧策略随机采样多条 Top-3 trajectory,并记录每一步所选标签的旧策略概率。
更新阶段重新计算当前 Policy 的概率,通过:
- Group Relative Advantage 判断某个动作相对同组是好还是差
- Current / Old Policy Probability Ratio 做 Importance Sampling 修正
- PPO-style Clip 限制单次策略更新过大
- Reference Model 的 KL Regularization 限制长期策略漂移
最终得到可导的 Policy Loss,并继续反向传播更新 LoRA + Classification Head。
冻结的 Reference Model 则保留监督微调后的参数,作为 RL 后训练的稳定行为锚点。
4.6 Tree-GRPO 在本任务中的定位
原始 Tree-GRPO 在长 Agent 轨迹中还可以通过共享公共 Prefix 减少重复 Rollout,但本任务最终只有 3 个候选决策,因此计算与显存节省并不是主要收益。
在这个 Kaggle 任务中,它更主要用于:
- 直接对齐 MAP@3 评价指标
- 对高歧义候选进行 Stochastic Exploration
- 将 Top-3 从一次性分类改造成条件排序
- 利用树状分支改善局部 Credit Assignment
因此它更适合作为基础分类模型之后的 Ranking Post-training 扩展。
4.7 Tree-GRPO 与 LoRA / Focal Loss / Ensemble 的关系
官方训练数据 ↓XML 结构化输入 ↓LLM Backbone + LoRA ↓65-way Classification Head ↓Focal Loss 监督微调 ↓获得稳定的任务基础模型 ↓Tree-GRPO 排序后训练直接优化 MAP@3 ↓4 个自训练模型 + 6 个公开模型 ↓10 模型 Ensemble ↓最终 Top-3因此整体方案可以概括为:
- LoRA:解决大模型高效任务适配
- Classification Head:将 LLM 表示映射为 65 类概率
- Focal Loss:解决类别长尾与 Hard Samples
- XML:降低输入字段语义歧义
- Tree-GRPO:缩小监督 Loss 与 MAP@3 之间的 Objective Gap
- 10 模型集成:利用 Error Diversity 降低单模型方差与偏差
5) 集成层三重评分
最终预测不是简单多数投票,而是融合三类信号:
基础概率分
不同模型对候选 Misconception 给出的预测概率,是最直接的模型判断。
模型一致性分
统计不同模型是否共同支持同一个候选。
如果多个不同架构模型都把某一标签放入 Top-3,即使单个模型概率并不极端,也说明该候选具有较高稳定性。
置信度分
进一步区分:
A: 0.80, B: 0.10和:
A: 0.36, B: 0.35虽然两种情况 Top-1 都是 A,但前者明显更加确定。
最终再结合各模型自身的验证集表现进行性能加权,形成稳定的最终 Top-3。
结果与产出
- 在 Kaggle MAP 竞赛中获得 银牌
- 形成“监督分类微调 → Ranking Post-training → 多模型集成”的完整任务优化链路
- 在类别长尾、高歧义解释和 Top-3 排序目标下,兼顾模型效果与工程迭代效率
- 沉淀可复用的教育 NLP 误解识别与 LLM Ranking 技术框架
我的收获
- 对“任务定义—监督微调—强化后训练—集成决策”全链路优化建立了更系统的理解
- 理解了训练 Loss 与最终 Ranking Metric 不一致时,如何通过 Reward-based Post-training 缩小 Objective Gap
- 在真实竞赛约束下强化了模型训练、快速实验、多模型融合和工程化迭代能力
- 更清晰地理解了教育 AI 场景中“可解释误差诊断”的落地价值
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分内容可能已过时