673. MAP - Charting Student Math Misunderstandings | map-charting-student-math-misunderstandings
感谢 Kaggle 和社区举办这场有趣的竞赛。
我花费了大量时间训练和测试各种方法,但最终跌出了金牌区。不过,我早就预料到这种情况会发生。随着我提交更多版本,不稳定的 LB 分数和 CV-LB 的不一致性揭示了这场竞赛固有的随机性。
我的主要收获:控制实验随机性,并系统地找出什么有效、什么无效。
防止局部头过拟合损害骨干网络的泛化能力:
if eta_local2lora == 0:
feat_local = feat.detach() # 硬阻断
else:
feat_local = feat.detach() + eta * (feat - feat.detach()) # 软阻断
最优设置:eta_local2lora = 0.2 (20% 梯度流)
final_score = lambda * p_local37 + (1 - lambda) * p_global
最优 lambda 范围:0.0~1.0(在验证期间测试多个值)
基于 QuestionId + MisconceptionId 组合的 5 折分层 KFold。
使用不同的查询格式训练多个模型,以增加集成的多样性:
学习率在这场竞赛中非常关键。以下设置产生了最佳结果:
最佳 CV 分数通常在第二个 epoch 结束时(epoch 1)达到。保留 Epoch 2 但很少能带来更好的 CV 分数。
选择来自不同 fold 并使用不同输入格式训练的模型以获得更好的泛化能力。根据 CV 表现将不同的模型分配给不同的 QuestionId,这进一步略微提高了 LB 分数。
cands = { # 候选列表
"model1":[lora_path_1, lambda_1, query_format_1],
"model2":[lora_path_2, lambda_2, query_format_2],
"model3":[lora_path_3, lambda_3, query_format_3],
"model4":[lora_path_4, lambda_4, query_format_4],
"model5":[lora_path_5, lambda_5, query_format_5],
...
}
cands_sub = { # 权重
"model1": {31772: 0.4, 31774: 0.0, 31777: 0.4, 31778: 0.4, 32829: 0.4, 32833: 0.4, 32835: 0.4, 33471: 0.4, 33472: 0.4, 33474: 0.0, 76870: 0.4, 89443: 0.4, 91695: 0.4, 104665: 0.0, 109465: 0.4},
"model2": {31772: 0.0, 31774: 0.4, 31777: 0.0, 31778: 0.0, 32829: 0.0, 32833: 0.0, 32835: 0.0, 33471: 0.0, 33472: 0.0, 33474: 0.4, 76870: 0.0, 89443: 0.0, 91695: 0.0, 104665: 0.4, 109465: 0.0},
"model3": {31772: 0.5, 31774: 0.5, 31777: 0.5, 31778: 0.5, 32829: 0.5, 32833: 0.5, 32835: 0.5, 33471: 0.5, 33472: 0.5, 33474: 0.5, 76870: 0.5, 89443: 0.5, 91695: 0.5, 104665: 0.5, 109465: 0.5},
"model4": {31772: 0.4, 31774: 0.4, 31777: 0.4, 31778: 0.4, 32829: 0.0, 32833: 0.4, 32835: 0.0, 33471: 0.4, 33472: 0.4, 33474: 0.4, 76870: 0.0, 89443: 0.0, 91695: 0.0, 104665: 0.4, 109465: 0.0},
"model5": {31772: 0.0, 31774: 0.0, 31777: 0.0, 31778: 0.0, 32829: 0.0, 32833: 0.0, 32835: 0.4, 33471: 0.0, 33472: 0.0, 33474: 0.0, 76870: 0.4, 89443: 0.4, 91695: 0.0, 104665: 0.0, 109465: 0.0},
"model6": {31772: 0.0, 31774: 0.0, 31777: 0.0, 31778: 0.0, 32829: 0.4, 32833: 0.0, 32835: 0.0, 33471: 0.0, 33472: 0.0, 33474: 0.0, 76870: 0.0, 89443: 0.0, 91695: 0.4, 104665: 0.0, 109465: 0.4},
}
最终,借用了一个公开 Notebook 中的分歧处理集成方法 (https://www.kaggle.com/code/kishanvavdara/ensemble-gemma-qwen-deepseek),其产生的公开 LB 结果略优于简单的加权集成:
base[c] = sum(w_m * p_m[c]) # 加权概率和
conf[c] = max(w_m * p_m[c]) # 最高置信度
agree[c] = (top3 votes) / M # 共识分数
final[c] = 0.6*base[c] + 0.3*agree[c] + 0.1*conf[c]