632. Eedi - Mining Misconceptions in Mathematics | eedi-mining-misconceptions-in-mathematics
希望发布我的解决方案还不算太晚🙃
我非常兴奋能获得我的第一枚银牌。
从去年开始,我在工作之余开始参加 Kaggle 竞赛。作为一个初学者,有时我觉得构建一个可运行的提交流水线真的很难,但感谢 Kaggle 社区用户的无私分享,我学到了很多技巧和窍门,以及许多解决给定任务的有用见解。此外,我要感谢 Kaggle 和 EEDI 举办了如此有趣的竞赛。
像许多其他选手一样,我的解决方案是一个两阶段的方法:
检索器使用的是来自 这个 Notebook 的 Qwen-14b-awq。对于每个查询,选择前 25 个可能的误解。
给定一个问题、一个正确答案、一个错误答案以及来自上一阶段的可能误解列表(每个查询 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
我通过 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 训练数据集:
竞赛概述中提到“目标是创建一个模型,不仅与已知的误解保持一致,还能泛化到新的、 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+),我猜是因为:
enable_prefix_caching=True 加速 vLLM 推理