620. LMSYS - Chatbot Arena Human Preference Predictions | lmsys-chatbot-arena
感谢 LMSYS 举办这次比赛!我玩得很开心,能与如此优秀的 Kaggle 选手 @conjuring92 组队真是太棒了!Raja kindly 让我发布我们的解决方案,所以我会在最后发布他的报告。
我们在竞赛数据集和 LMSYS 提供的 33k 额外数据集上训练了模型(我认为去重后大约是 21k 个样本)。
对于伪标签(Pseudo Labeling),我使用了这个数据集:https://huggingface.co/datasets/mlabonne/orpo-dpo-mix-40k 以及由 diverse 的一组 LLM 生成的 50 万个样本,这些 LLM 要么在 LMSYS 上得分相当不错,要么存在于原始数据集中。这些生成内容是作为 paired responses 针对 LMSYS 提供的 100 万数据集创建的。
我使用以下代码格式化我的 prompts:
def format_prompt(row):
chat_list = zip(row['prompt'], row['response_a'], row['response_b'])
responses = [f"<PROMPT>{r[0]}</PROMPT><RESPONSE A>{r[1]}</RESPONSE A><RESPONSE B>{r[2]}</RESPONSE B>" for r in chat_list]
return {
'formatted_prompt': ''.join(responses)
}
我在 1800 的序列长度上训练了我的模型。我没有将这些分隔符 token 添加到词汇表中,因为训练我的 embeddings 似乎损害了我的模型性能。我没有做任何花哨的回合截断/保留最后一回合,因为我发现在推理期间扩展序列长度并没有帮助。
我使用了 QLoRA 训练,batch size 为 16,r = 64,alpha = 16。针对所有线性层(linear layers)效果最好。我使用了自己的自定义 nn.Module,但它等同于 AutoModelForSequenceClassification。
我们尝试了大量的不同骨干模型(backbones),但最终使用的是以下两个:
Gemma 2 模型显然是最好的,如果单独提交,它在排行榜(LB)上的得分大约为 0.895。TTA(通过翻转 response_a 和 response_b)根据骨干模型的不同提供了约 0.007 的提升。
我发现的一个技巧是,如果禁用 Gemma2 的 softcapping,CV 和 LB 都会提高约 0.002。这很简单,只需将 config 设置为 None 即可。
PL 对我们来说意义重大。我们使用 vLLM 生成了这 50 万个样本。我也尝试了 ctranslate2,但我认为 vLLM 的连续批处理支持提供了更多的吞吐量。为了进一步加快速度,我将具有相同回合数的对话批处理在一起,而不是相同的 token 长度。这确保了我们不会意外地将单回合对话与多回合对话放在一起。由于输出 token 比 prompt token 慢得多,在这种情况下基于长度的批处理会导致很大的 slowdown。我运行了一个小的初始样本,但感谢 Raja 完成了整个 50 万集!
我在 2 个数据集上运行了 PL,集成了我刚才提到的两个骨干模型的结果。我们运行了 2 轮,但第二轮没有太大区别。仅使用 PL 的 Gemma2-RM 模型在 8k 序列长度下,没有 TTA 的情况下在 LB 上得分为 0.880。
我也尝试了 Ultrafeedback,但它并没有比只使用 ORPO DPO 数据集提供更多帮助。该数据集质量相当高,并且已经包含了来自 UF 的最高质量样本。
有趣的是,PL 导致我们的 CV/LB 相关性断裂,否则这种相关性非常紧密。虽然它仍然是一种紧密的相关性,CV 中 0.001 的改进会显示在 LB 上,但我们的 CV 数字在使用 PL 后要低得多。我仍然不确定为什么会发生这种情况,但我想知道这是否与 leak 有关。
我们的最终提交是我 Gemma2-RM 模型和 Raja 的另一个 Gemma2 模型的集成,以增加多样性。我们按长度排序,Gemma2 使用 4k 最大长度,Raja 的模型使用 3k。
感谢 Kaggle 和 LMSYS 举办如此出色的比赛!这是一个理想的设置,可以实验 LLM 微调和推理策略,同时为有影响力的研究问题做出贡献。
我们的最终解决方案基于两个关键策略:
sfairXC/FsfairX-Gemma2-RM-v0.1 而不是 google/gemma-2-9b-itRLHFlow/pair-preference-model-LLaMA3-8B 而不是 meta-llama/Meta-Llama-3.1-8B-Instruct基线模型用于为最终模型生成伪标签。具体来说,我基于 RLHFlow/pair-preference-model-LLaMA3-8B 和 google/gemma-2-9b-it 分别训练了两个基线模型。
LLaMA 模型在以下数据上进行了微调:(1) 过滤后的竞赛数据(删除了 ~300 个具有高训练损失的示例),(2) 21k 去重的 额外 lmsys arena 示例 和 (3) 一些公共奖励数据集(例如 arena-hard,reward-bench 和 mt-bench 的子集),使用 QLoRA (r=32, alpha=64, dropout=0.0) 和标签平滑 (0.03)。它在原始公共排行榜上得分为 0.913。每个示例都表示为 [CONTEXT] {prompt}\n\n[RESPONSE A] {response_a}\n\n[RESPONSE B] {response_b}\n\n[Result]: 格式。如果回合数超过 4 个,则只保留前 2 个和最后 2 个回合。我尝试了不同的 LoRA 设置(例如 rslora, lora+, 解冻 embed, ranks, grad norm)。然而,这些都没有任何显著增益。甚至 DoRA 和全量微调也没有明显更好。
为了训练最终模型,我们首先收集/生成了大量竞赛格式的配对示例(50 万+)。具体来说,我们使用 diverse 的开放 LLM(例如 google/gemma-2-9b-it, meta-llama/Meta-Llama-3.1-8B-Instruct ...)从 lmsys-1m 数据集中的 prompt 和对话生成了伴随响应。我们使用 vllm 生成响应,参数为 temperature=0.7, top_p=0.9。此外,我们使用了流行 DPO 数据集的示例(Mark 之前提到过)。我们使用基线模型的集成为这些示例生成了软标签。我们将这些示例与竞赛数据混合,并重新训练最终模型。
我们使用了 2 个 Gemma-2-9b 检查点进行推理——在公共排行榜上的单独得分分别为 0.880 和 0.896。模型分别使用了 4096 和 3072 的最大长度。对于第一个模型,我们交换响应 A 和响应 B 以产生类似 TTA 的效果。
最后,我们在此发布了我们的提交 notebook:https://www.kaggle.com/code/conjuring92/lmsys-3rd-place-submission