返回列表

31st place solution

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

开始: 2024-09-12 结束: 2024-12-12 学习效果预测 数据算法赛
第 31 名解决方案 - Double Zeta

第 31 名解决方案

作者: Double Zeta
发布时间: 2024-12-25
竞赛排名: 31

希望发布我的解决方案还不算太晚🙃

我非常兴奋能获得我的第一枚银牌。
从去年开始,我在工作之余开始参加 Kaggle 竞赛。作为一个初学者,有时我觉得构建一个可运行的提交流水线真的很难,但感谢 Kaggle 社区用户的无私分享,我学到了很多技巧和窍门,以及许多解决给定任务的有用见解。此外,我要感谢 Kaggle 和 EEDI 举办了如此有趣的竞赛。

解决方案

像许多其他选手一样,我的解决方案是一个两阶段的方法:

检索 (Retrieve)

检索器使用的是来自 这个 Notebook 的 Qwen-14b-awq。对于每个查询,选择前 25 个可能的误解。

重排序 (Rerank)

给定一个问题、一个正确答案、一个错误答案以及来自上一阶段的可能误解列表(每个查询 9 个候选),让 Qwen2.5-32b-awq 预测最可能的误解索引。
请参考热门公开 Notebook:https://www.kaggle.com/code/jagatkiran/qwen14b-retrieval-qwen32b-logits-processor-zoo
以及我的推理 Notebook:https://www.kaggle.com/code/doublezeta/notebook0d961c3b94

我的解决方案的创新点

LoRA

我通过 trl.SFTTrainer 微调(LoRA)了一个 Qwen2.5-32b-awq 重排序器。以下是我的超参数:

peft_config = LoraConfig(
    task_type="CAUSAL_LM",
    inference_mode=False,
    r=64,
    lora_alpha=16,
    lora_dropout=0.05,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
    bias="none"
)
training_args = SFTConfig(
    packing=False,
    max_seq_length=tokenizer.model_max_length,
    learning_rate=1e-4,
    per_device_train_batch_size=4,
    num_train_epochs=1,
    weight_decay=0.001,
    gradient_accumulation_steps=3,
    gradient_checkpointing=True,
    fp16=True,
    lr_scheduler_type='cosine',
    warmup_ratio=0.03,
)

我的演示训练 Notebook:https://www.kaggle.com/code/doublezeta/train-reranker 实际上我是在 Colab 上进行的训练。

我通过以下方式构建我的 SFT 训练数据集:

  1. 在竞赛训练数据集上运行检索(第 1 阶段),为每个问题 - 选项对获取 25 个候选误解。
  2. 从原始的 25 个候选中,选择 8 个错误的误解,并与正确的误解一起,形成一个包含 9 个候选的样本。标签是正确误解的索引。由于有 25 个候选,我可以为每个问题 - 选项对生成 3 个样本。

训练数据增强

竞赛概述中提到“目标是创建一个模型,不仅与已知的误解保持一致,还能泛化到新的、 emerging 的误解”。
大约有 900 个误解未出现在训练集中。我推测私有 leaderboard 会更关注未见过的误解。
因此,我稍微调整了构建 SFT 训练集的策略。在每个样本的 8 个错误候选中,4 个来自检索结果,4 个来自 900 个未见过的误解。
我相信增加未见误解的比例可以帮助 LLM 增强对这些误解的推理能力。

这确实在私有榜单上给我带来了一些改进。

公开分数 私有分数
带增强 0.539 0.531
不带增强 0.554 0.514

构建 SFT 训练集的 Notebook:https://www.kaggle.com/code/doublezeta/train-data-sft

我在第 3 名的解决方案中发现了类似的见解:讨论链接,也许我应该进一步推动🥂

尝试过但未成功的方法

我注意到重排序器只是选择最可能的误解,而不改变其余候选的顺序。
受以下灵感启发:
讨论链接
论文链接,
我使用 LLM 作为逐点评分器,通过获取 Yes token 的 logprob。
我微调(LoRA)了一个 Qwen2.5-32b-awq。在推理期间,我提示它针对给定的问题、正确答案、错误答案和可能的误解预测"Yes"或"No"。
但是公开 leaderboard 分数很差 (0.3+),我猜是因为:

  • 我没有正确地微调模型。我忘记只训练 completions 部分。
  • 与逐点推理不同,列表式推理允许 LLM 在不同候选之间进行比较。

一些经验

同比赛其他方案