620. LMSYS - Chatbot Arena Human Preference Predictions | lmsys-chatbot-arena
首先,我想感谢 Kaggle 和 LMSYS 组织了这场非常有趣且具有教育意义的竞赛。我还要感谢我的队友 @cody11null 贡献了宝贵的想法并促进了团队内的有效沟通。特别感谢队友 @mohammad2012191,他提供了宝贵的技巧并贡献了重要的计算资源,在模型后处理方面进行了重要的探索。我还要感谢队友 @lihaoweicvch 提供的宝贵想法和强大的计算支持,以及他在解决推理代码超时问题方面的出色工作。如果没有这三位队友的努力,我们团队就不会取得今天的成功。
此外,我想特别感谢 @emiz6413。正是他的开源 推理 notebook 和 训练 notebook 激励我完全投入到这场竞赛中。他的开源精神体现了 Kaggle 的真谛,我深深敬佩他的奉献精神。
接下来,我将主要从三个方面讨论我们的解决方案:首先是关键技巧;其次是我在整个竞赛过程中的探索;最后是本次竞赛中潜在的优化点和未解决的问题。
1. 在 lora_config 的 target_modules 中添加 o_proj, gate_proj
lora_config = LoraConfig(
r=config.lora_r,
lora_alpha=config.lora_alpha,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj"],
layers_to_transform=[i for i in range(42) if i >= config.freeze_layers],
lora_dropout=config.lora_dropout,
bias=config.lora_bias,
task_type=TaskType.SEQ_CLS,
)
cv 提升约 0.12
lb 提升约 0.08 (单模型)
补充:我将在下面详细分享关键的实验数据。
2. 将训练 max_len 提高到 3072
cv 提升约 0.02
lb 提升约 0.05 (单模型)
3. 将冻结层数设置为 0
cv 提升约 0.17
lb 提升约 0.11 (tta)
4. 添加外部 数据
cv 提升约 0.06
lb 提升约 0.12 (tta)
5. 将 lora_r 增加到 64
cv 提升约 0.06
lb 提升约 0.09 (tta)
补充:如果我们就停在这里,实际上可以在新测试中赢得金牌哈哈 :)😄

6. 设计一个新的简单头部来替换 model.score
class CustomClassificationHead(nn.Module):
def __init__(self, config):
super().__init__()
self.fc1 = nn.Linear(config.hidden_size, config.hidden_size * 2, bias=False)
self.fc2 = nn.Linear(config.hidden_size * 2, config.hidden_size // 2, bias=False)
self.fc3 = nn.Linear(config.hidden_size // 2, config.num_labels, bias=False)
def forward(self, features):
x= self.fc1(features)
x= self.fc2(x)
x= self.fc3(x)
return x
cv 提升约 0.03
lb 提升约 0.04 (tta)
尝试 Deberta
训练和推理 notebook 公开在 这里
尝试 Gemma-2-9B-it
几乎所有的模型权重我公开在 这里
还有一些在 Kaggle 数据集上
未修改头部的推理公开在 这里 -> 金牌分数哈哈 :)
Gemma-9B-it 关键实验数据
| 版本 | 脚本版本 | 技巧 | CV | CV 准确率 | 训练损失 | LB | Epoch 数 | 最大长度 | 批大小 | 梯度累积 | 学习率 | LoRA r | LoRA alpha | 加速器 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 原始 | 0.935504 | 0.555498 | 1.005892 | 0.941 | 1 | 1024 | 4 | 2 | 2.00E-04 | 16 | 32 | A100-40G |
| 3 | 1 | 提高 max_length | 0.92079 | 0.568894 | 0.997738 | 0.933 | 1 | 2048 | 2 | 4 | 2.00E-04 | 16 | 32 | A100-40G |
| 5 | 4 | 添加 o_proj, gate_proj | 0.908097 | 0.572112 | 0.998925 | 0.925 | 1 | 2048 | 8 | 4 | 2.00E-04 | 16 | 32 | A100-80G |
| 15 | 4 | 添加 o_proj, gate_proj+ 尝试长序列 +inter 3072 | 0.906807 | 0.575418 | 0.993547 | 0.92 | 1 | 3072 | 2 | 8 | 2.00E-04 | 16 | 32 | A100-40G |
| 16 | 4 | 添加 o_proj, gate_proj+ 尝试长序列 +freeze0+ 推理 3072 | 0.90772 | 0.574287 | 0.984961 | 0.919 | 1 | 3072 | 2 | 16 | 2.00E-04 | 16 | 32 | A100-40G |
| 17 | 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列 | 0.904647 | 0.575331 | 0.930781 | 0.912 | 1 | 3072 | 2 | 16 | 1.00E-04 | 16 | 32 | A100-40G | |
| 18 | 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0 | 0.891603 | 0.584029 | 0.915302 | 1 | 3072 | 2 | 16 | 1.00E-04 | 16 | 32 | A100-40G | ||
| 22 | 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r | 0.889211 | 0.583942 | 0.917987 | 1 | 3072 | 2 | 16 | 1.00E-04 | 32 | 64 | A100-40G | ||
| 23 | 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r | 0.894082 | 0.582898 | 0.924007 | 1 | 3072 | 2 | 16 | 1.00E-04 | 24 | 48 | A100-40G | ||
| 24 | 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r | 0.885727 | 0.584116 | 0.92209 | 1 | 3072 | 2 | 16 | 1.00E-04 | 48 | 96 | A100-40G | ||
| random tta v18 | 0.906 | 3072 | ||||||||||||
| v18 tta | 0.908 | 2048 | ||||||||||||
| v17 cp2000 tta | 0.919 | 1536 | ||||||||||||
| v18 cp2000 tta | 0.911 | 1536 | ||||||||||||
| v18 cp2000 tta | 0.906 | 2000 | ||||||||||||
| v18 cp2000 tta | 0.906 | 2100 | ||||||||||||
| v21 cp2100 | 0.913 | 3072 | ||||||||||||
| v21 cp2100 tta | 0.905 | 2000 | ||||||||||||
| particular tta | 0-1024 非 tta | 0.91 | ||||||||||||
| particular tta | 0-1536 非 tta | 0.91 | ||||||||||||
| 25 | lora_alpha = 32 + 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r | 0.895018 | 0.577331 | 0.916444 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 32 | A100-40G | ||
| 26 | n_split = 10+ 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r | 0.869383 | 0.591336 | 0.925077 | 1 | 3072 | 2 | 16 | 1.00E-04 | 48 | 96 | A100-40G | ||
| 27 | n_split = 50+ 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r | 0.858467 | 0.607826 | 0.933301 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 128 | A100-40G | ||
| 28 | 新混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r | 0.593338 | 0.758525 | 0.844598 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 128 | A100-40G | ||
| 29 | n_split = 100+ 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r | 0.832338 | 0.615652 | 0.929202 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 128 | A100-40G | ||
| 30 | 基于 v29 cp2440 继续训练 | 0.828129 | 0.626087 | 0.898 | ||||||||||
| 32 | new_score_head n_split = 5 | 0.883596 | 0.58603 | 0.910986 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 128 | A100-40G | ||
| 33 | new_score_head n_split = 10 | 0.869587 | 0.598643 | 0.91562 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 128 | A100-40G | ||
| v26_2250 | 0.895 | 2000 | ||||||||||||
| v26_2200 | 0.896 | 1900 | ||||||||||||
| v27_2200 | 0.899 | 1920 | ||||||||||||
| v27_2200 | 0.903 | 1536 | ||||||||||||
| v29_2440 tta | 0.894 | 1776 | ||||||||||||
| 34 | new head + alpha = r | 0.881545 | 0.591249 | 0.908757 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 64 | A100-40G | ||
| 35 | new head + alpha = r n_split = 10 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 64 | A100-40G | |||||
| 36 | attn head + alpha = r | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 64 | A100-40G | |||||
| 37 | linear head+ bf16 + eager n_split = 10 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 64 | A100-40G | |||||
| 38 | linear head+ bf16 + eager n_split = 50 | 0.858054 | 0.606957 | 0.911753 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 64 | A100-40G | ||
| 39 | linear head+ bf16 + eager n_split = 5 | 0.884285 | 0.586987 | 0.912451 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 64 | A100-40G | ||
| 40 | ipynb+n_split = 10+ 混合数据+linear head+ bf16 + eager | 0.840444 | 0.619868 | 0.934066 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 64 | A100-40G | ||
| 41 | ipynb+n_split = 100+ 混合数据+linear head+ bf16 + eager | 0.831409 | 0.636522 | 0.915951 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 64 | A100-40G | ||
| 42 | ipynb+n_split = 5+ 混合数据+linear head+ bf16 + eager | 0.842306 | 0.612661 | 0.925324 | 1 | 3072 | 2 | 16 | 1.00E-04 | 64 | 64 | A100-40G | ||
| v38_2422 tta | 0.892 | 2048 |
mix_data : 竞赛数据 +21k 外部数据
尝试 Llama3.1-8B-it
我更改了一个 padding token。下载新的完整修订模型文件和训练权重在 这里
训练脚本
Llama3.1-8B-it 实验数据
| 版本 | 脚本版本 | 技巧 | CV | CV 准确率 | 训练损失 | LB | Epoch 数 | 最大长度 | 预热步数 | 预热比例 | 批大小 | 梯度累积 | 学习率 | LoRA r | LoRA alpha | LoRA dropout | LoRA bias | 加速器 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 原始 | 0.981412351 | 0.516527488 | 1.06309152 | 1 | 2048 | 20 | 0 | 4 | 8 | 2.00E-04 | 16 | 32 | 0.05 | none | A100-40G | |
| 2 | 1 | 提高 max_len | 0.976300371 | 0.522442589 | 1 | 3072 | 20 | 0 | 2 | 8 | 2.00E-04 | 16 | 32 | 0.05 | none | A100-40G | ||
| 3 | 2 | sft | 0.931414843 | 0.555671538 | 0.974404319 | 1 | 3072 | 20 | 0 | 2 | 8 | 1.00E-04 | 16 | 32 | 0.05 | none | A100-40G | |
| 4 | 2 | sft+ 混合数据 | 0.921216846 | 0.562021573 | 0.924224623 | 1 | 3072 | 20 | 0 | 2 | 8 | 1.00E-04 | 16 | 32 | 0.05 | none | A100-40G | |
| 5 | 2 | sft+ 混合数据+o_proj+gate_proj | 0.922720075 | 0.564631176 | 0.924524553 | 1 | 3072 | 20 | 0 | 2 | 8 | 1.00E-04 | 16 | 32 | 0.05 | none | A100-40G | |
| 6 | 2 | sft+ 混合数据+o_proj+gate_proj+dense | 0.920885503 | 0.561325678 | 0.924782057 | 1 | 3072 | 20 | 0 | 2 | 8 | 1.00E-04 | 16 | 32 | 0.05 | none | A100-40G |
mix_data : 竞赛数据 +21k 外部数据
1. 左侧截断
2. 使用 8-bit 加速推理
3. 添加两个预测头来预测 response_a 和 response_b 是由哪两个模型提供的
4. EMA (指数移动平均)
5. 更多强相关数据
1. 两阶段微调难以收敛
2. 知识蒸馏难以找到好方法
3. 难以微调全参数以获得好的 CV 结果
4. @mohammad2012191 公开在 这里
我爱 Kaggle!!!😃