返回列表

14th place Solution (lucky for me)

574. CommonLit - Evaluate Student Summaries | commonlit-evaluate-student-summaries

开始: 2023-07-12 结束: 2023-10-11 智能评测 数据算法赛
第14名解决方案(对我而言很幸运)- Peng Sun

第14名解决方案(对我而言很幸运)

作者:Peng Sun | 发布时间:2023年10月13日

首先,我要衷心感谢竞赛主办方。这是一场非常棒的竞赛!我在Kaggle上确实度过了一段快乐的时光!同时,也非常感谢分享的notebooks和宝贵的讨论,从中我获得了许多灵感和启发。

我实际上并不是一个拥有各种经验和调优技能的NLP专家,因此我能走到这一步感到非常幸运。还因为这次运气眷顾了我(这种情况并不常发生,:p)。

和其他许多优秀解决方案一样,我的模型实际上非常简单:deberta-v3-large。但达到这个结果的过程却相当曲折。

我的解决方案

  • 输入
    将配对输入标记化:摘要文本提示标题 +[SEP]+ 提示文本 +[SEP] + 提示问题
    prompt = sep.join([data["prompt_title"], data["prompt_text"], data["prompt_question"]])
    tokenized = tokenizer(
            data['text'],
            prompt,
            padding=False,
            truncation=True, 
            max_length=config.max_seq_length,
        )
  • 模型
    deberta-v3-large。和大家一样 :P。我也尝试过其他模型:deberta-v3-large-squad2, deberta-v3-base

  • 最大长度
    我尝试了不同的最大长度,最终模型使用1600。

  • 模型设置和超参数
    学习率:经过多轮超参数调优后,我发现6e-6最佳
    训练轮数:4轮
    权重衰减:经过超参数调优后,使用1e-4
    预热比例:0
    批量大小:训练和评估均为2(由于GPU内存限制,无法使用更大的批量)
    学习率调度器类型:余弦
    优化器:adamw
    我也尝试冻结部分层,但没有提升本地CV,因此最终模型没有冻结任何层。
    没有使用dropout,没有使用额外的池化。
    此外,我发现本地CV和公开LBs与训练时的最大长度呈正相关。后来私有LB证明了这一点。最大长度更大的模型往往在私有LB上表现更好。

  • CV结果和集成
    最佳私有LB模型的CV得分:0.5513(fold 814d6b),0.4587(fold 39c16e),0.5038(fold 3b9047)和0.4316(fold ebad26)
    最终模型是4个fold模型的简单集成。
    我实际上考虑过使用上述设置在完整训练集上训练模型。但最终我选择了对不同fold的模型进行集成。这可能不是最佳实践,但给了我更好的机会来发现CV与公开LB之间的关系。
    公开LB:0.429
    私有LB:0.458

没有效果的方法

  1. MLM没有效果
    这实际上是我在本次竞赛中的重大失误。我理所当然地认为在之前的commonlit数据集上使用deberta的MLM会提升CV。基于这个想法,我实际上花费了整个八月和九月上半月只训练经过MLM预训练的模型。然而,我通过MLM获得的最好模型的本地CV为0.5449、0.4782、0.5182、0.4473,公开LB为0.445。此后再也无法提升。
    直到九月第三周,我才推翻一切,重新开始,不再使用任何MLM预训练,最终得到了上述描述的模型。

  2. 手动生成的伪分数数据集可以加速训练过程,但会导致过拟合
    在竞赛接近尾声时,我想到了扩展训练数据用于预训练任务的方法。具体做法如下:

    • 扩展训练数据的小部分:我从commonlit网站下载了一些文本作为提示文本和问题作为提示问题。然后使用gpt-4生成摘要文本,让机器模仿学生的写作方式。伪分数由当时我创建的最佳模型给出。这给了我大约300个额外的训练样本。
    • 扩展训练数据的主要部分:不依赖任何提示文本,我直接使用之前commonlit竞赛中学生写的文本,并让我最好的模型为其评分。这给了我约4000个额外样本。

    我希望这能解释您的疑虑 @kononenko :p。

    我使用扩展数据进行了预训练任务。我获得了更好的本地CV结果和更快收敛的网络。然而,公开LB并没有提升,最终私有LB甚至变得更差 :(。这可能导致过拟合(很好的教训)。因此我的最终模型没有在这个数据集上训练。

  3. Lightgbm没有效果
    我没有深入探究为什么lgbm没有效果。我原本以为它可以提升我的CV。

如果时间充裕,我想尝试的事情

  1. EMA
    我在竞赛早期尝试过EMA,但那是使用经过MLM预训练的模型。它没有提升本地CV,所以我甚至懒得提交。如果时间充裕,我想在未经MLM预训练的模型上尝试EMA。
  2. 分层差异学习率
    和EMA一样,我只在早期模型中应用过,但没有提升本地CV。
  3. 尝试更多最大长度的设置

我尝试过的模型总结

*所有LB均为4个fold的集成结果

模型名称 备注 本地CV LB 私有LB
Model 2308 使用MLM预训练,预训练和训练最大长度均为1536 0.5449, 0.4782, 0.5182, 0.4473 0.445 0.481
Model 2708 使用最大长度2048的MLM预训练,模型训练最大长度1536 0.5778, 0.4598, 0.5305, 0.4369 0.451 0.466
Model 3008 使用MLM预训练,预训练和训练最大长度均为2048 0.5532, 0.4706, 0.5226, 0.4383 0.447 0.471
Model 1009 使用MLM预训练,训练中使用EMA 0.5631, 0.4728, 0.5201, 0.4407 未提交 未提交
Model 2609(最佳模型) 无预训练,最大长度1600 0.5513, 0.4587, 0.5038, 0.4316 0.429 0.458
Model 0810 使用不完整扩展数据集预训练,最大长度1600 0.5363, 0.4454, 0.4974, 0.4314 0.431 0.474
Model 1010 使用完整扩展数据预训练,最大长度1600 0.5199, 0.4451, 0.4958, 0.4356 0.458 0.469
Model 0810 + lgbm 使用完整扩展数据预训练,最大长度1600,加上lgbm 0.6154, 0.4695, 0.4990, 0.4391 0.435 0.47

如您所见,除少数情况外,我的公开LB和私有LB在某种程度上是相关的。

同比赛其他方案