返回列表

19th Place Solution

620. LMSYS - Chatbot Arena Human Preference Predictions | lmsys-chatbot-arena

开始: 2024-05-02 结束: 2024-08-12 自然语言处理 数据算法赛
19th Place Solution - 第 19 名解决方案

第 19 名解决方案

作者: Roschild.Rui 及团队成员
发布时间: 2024 年 8 月 15 日
竞赛: 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)

补充:如果我们就停在这里,实际上可以在新测试中赢得金牌哈哈 :)😄
Leaderboard Screenshot

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 关键实验数据

Experiment Data 1 Experiment Data 2
版本 脚本版本 技巧 CV CV 准确率 训练损失 LB Epoch 数 最大长度 批大小 梯度累积 学习率 LoRA r LoRA alpha 加速器
11原始0.9355040.5554981.0058920.94111024422.00E-041632A100-40G
31提高 max_length0.920790.5688940.9977380.93312048242.00E-041632A100-40G
54添加 o_proj, gate_proj0.9080970.5721120.9989250.92512048842.00E-041632A100-80G
154添加 o_proj, gate_proj+ 尝试长序列 +inter 30720.9068070.5754180.9935470.9213072282.00E-041632A100-40G
164添加 o_proj, gate_proj+ 尝试长序列 +freeze0+ 推理 30720.907720.5742870.9849610.919130722162.00E-041632A100-40G
17混合数据 + 添加 o_proj, gate_proj+ 尝试长序列0.9046470.5753310.9307810.912130722161.00E-041632A100-40G
18混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze00.8916030.5840290.915302130722161.00E-041632A100-40G
22混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r0.8892110.5839420.917987130722161.00E-043264A100-40G
23混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r0.8940820.5828980.924007130722161.00E-042448A100-40G
24混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r0.8857270.5841160.92209130722161.00E-044896A100-40G
random tta v180.9063072
v18 tta0.9082048
v17 cp2000 tta0.9191536
v18 cp2000 tta0.9111536
v18 cp2000 tta0.9062000
v18 cp2000 tta0.9062100
v21 cp21000.9133072
v21 cp2100 tta0.9052000
particular tta0-1024 非 tta0.91
particular tta0-1536 非 tta0.91
25lora_alpha = 32 + 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r0.8950180.5773310.916444130722161.00E-046432A100-40G
26n_split = 10+ 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r0.8693830.5913360.925077130722161.00E-044896A100-40G
27n_split = 50+ 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r0.8584670.6078260.933301130722161.00E-0464128A100-40G
28新混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r0.5933380.7585250.844598130722161.00E-0464128A100-40G
29n_split = 100+ 混合数据 + 添加 o_proj, gate_proj+ 尝试长序列+freeze0+ 增加 r0.8323380.6156520.929202130722161.00E-0464128A100-40G
30基于 v29 cp2440 继续训练0.8281290.6260870.898
32new_score_head n_split = 50.8835960.586030.910986130722161.00E-0464128A100-40G
33new_score_head n_split = 100.8695870.5986430.91562130722161.00E-0464128A100-40G
v26_22500.8952000
v26_22000.8961900
v27_22000.8991920
v27_22000.9031536
v29_2440 tta0.8941776
34new head + alpha = r0.8815450.5912490.908757130722161.00E-046464A100-40G
35new head + alpha = r n_split = 10130722161.00E-046464A100-40G
36attn head + alpha = r130722161.00E-046464A100-40G
37linear head+ bf16 + eager n_split = 10130722161.00E-046464A100-40G
38linear head+ bf16 + eager n_split = 500.8580540.6069570.911753130722161.00E-046464A100-40G
39linear head+ bf16 + eager n_split = 50.8842850.5869870.912451130722161.00E-046464A100-40G
40ipynb+n_split = 10+ 混合数据+linear head+ bf16 + eager0.8404440.6198680.934066130722161.00E-046464A100-40G
41ipynb+n_split = 100+ 混合数据+linear head+ bf16 + eager0.8314090.6365220.915951130722161.00E-046464A100-40G
42ipynb+n_split = 5+ 混合数据+linear head+ bf16 + eager0.8423060.6126610.925324130722161.00E-046464A100-40G
v38_2422 tta0.8922048

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 加速器
11原始0.9814123510.5165274881.0630915212048200482.00E-0416320.05noneA100-40G
21提高 max_len0.9763003710.52244258913072200282.00E-0416320.05noneA100-40G
32sft0.9314148430.5556715380.97440431913072200281.00E-0416320.05noneA100-40G
42sft+ 混合数据0.9212168460.5620215730.92422462313072200281.00E-0416320.05noneA100-40G
52sft+ 混合数据+o_proj+gate_proj0.9227200750.5646311760.92452455313072200281.00E-0416320.05noneA100-40G
62sft+ 混合数据+o_proj+gate_proj+dense0.9208855030.5613256780.92478205713072200281.00E-0416320.05noneA100-40G

mix_data : 竞赛数据 +21k 外部数据

潜在优化点和未解决的问题

潜在优化点

1. 左侧截断

2. 使用 8-bit 加速推理

3. 添加两个预测头来预测 response_a 和 response_b 是由哪两个模型提供的

4. EMA (指数移动平均)

5. 更多强相关数据

未解决的问题

1. 两阶段微调难以收敛

2. 知识蒸馏难以找到好方法

3. 难以微调全参数以获得好的 CV 结果

4. @mohammad2012191 公开在 这里

总结

我爱 Kaggle!!!😃

同比赛其他方案