620. LMSYS - Chatbot Arena Human Preference Predictions | lmsys-chatbot-arena
感谢 Kaggle 和 LMSYS 组织这场精彩的比赛!我们很高兴能取得不错的排名。特别感谢我的队友(@Shizhe Diao, @Shuo XING, @research4mike)和小组成员(Wei Xiong 和 Hanze Dong)富有洞察力的讨论和坚定的奉献。
我们大约在一个月前才了解到这场竞赛。因此,进一步探索的时间有限。我们的解决方案涉及从基础模型微调分类器并添加后处理步骤。虽然已经有一些优秀的帖子介绍了其他团队训练奖励模型 LoRA 的方法,但我们旨在专注于我们独特的经验。
基础模型的选择显著影响性能。许多团队使用 gemma2-9b-it 作为他们的基础模型。我们的假设是,一个更好对齐的模型(通过指令微调或 RL 微调)将能更好地辨别哪些响应是好的。我们的实验证实了这一点:princeton-nlp/gemma-2-9b-it-SimPO (0.902) 优于 gemma-2-9b-it (0.908)。因此,我们选择 princeton-nlp/gemma-2-9b-it-SimPO 作为我们的基础模型。我们也测试了其他模型,但没有一个优于 princeton-nlp/gemma-2-9b-it-SimPO。
lmsys/chatbot_arena_conversations。lmsys/lmsys-arena-human-preference-55k 并没有使我们的模型受益。对于竞赛来说,模型推理后的后处理通常是有用的。然而,我们认为大部分贡献应该来自训练部分。在这个任务中,如果你的预测错误且置信度高(真实标签的概率低),对数损失(log loss)会受到显著惩罚。即使模型在训练集或验证集上几乎最优,它也可能不适用于未见过的测试集。因此,我们选择在推理后调整温度并直接设置某些预测。
一个简单的解决方案是在 softmax 运算符之前乘以常数 $\\tau$。改进取决于模型;一个好的模型可能不会改善太多。对于我们的模型,$\\tau$ 值在 0.85 到 0.95 之间使最终结果提高了 0.001 到 0.002。
outputs = model(**inputs.to(device))
proba = torch.softmax(tau * outputs.logits, dim=-1).cpu()
另一个观察结果是,当 prompt + 两个响应的长度超过最大长度(少量数据)时,模型非常可能预测错误的标签(此子集上的 log loss 为 1.00,而总体为 0.900)。在这种情况下,我们需要防止过于自信的预测。我的技巧是根据响应的长度替换这些预测,并使预测不那么自信。这给了我们 0.001 的改进。
long_ids = (np.array(result_df['length']) == cfg.max_length)
response_len_a = np.array(test['response_a'].apply(len))
response_len_b = np.array(test['response_b'].apply(len))
ratio = response_len_a / (response_len_a + response_len_b)
long_res = np.zeros((long_ids.sum(), 3))
long_res[:, 0] = (ratio[long_ids] > 0.54).astype(float)
long_res[:, 1] = (ratio[long_ids] < 0.46).astype(float)
long_res[:, 2] = (ratio[long_ids] >= 0.46) * (ratio[long_ids] <= 0.54).astype(float)
long_res = np.clip(long_res + 0.31, 0.0, 0.38)
pred[long_ids, :] = long_res
还有另一个奖励模型基准(Reward Bench)对本竞赛有益。一个遗憾是我想将我们关于文本生成正则化用于奖励模型的研究工作(https://arxiv.org/pdf/2406.10216)应用到这次竞赛中。我们没有选择这个模型,因为它在公共排行榜上没有优势。然而,事实证明它是我们在私有排行榜上最好的模型。我们错过了在最终排行榜上验证它的机会。