返回列表

30th place solution

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

开始: 2023-07-12 结束: 2023-10-11 智能评测 数据算法赛
第30名解决方案 - Yazhini

第30名解决方案

作者:Yazhini

发布日期:2023-10-15

竞赛排名:第30名

点赞数:9

感谢Kaggle、竞赛主办方以及Kaggle社区,度过了三个月充满乐趣和收获的时光。我非常期待阅读所有人的解决方案并向大家学习。第30名的提交方案是6个deberta-v3-large模型的集成。

在整个竞赛过程中,我一直担心过拟合问题。我最早尝到过拟合的苦头是在短暂地达到金牌位置时,公共排行榜得分0.461,当时我没有按prompt-id分割数据,而是采用了随机的80/20训练/验证分割。在为自己公共排行榜排名上的金牌标志兴奋了一天后,我开始怀疑这一切都是幻觉,我过拟合了(那次提交在私有排行榜上的得分确实证实了这一点)。那时候如果按prompt-id分割,模型甚至无法训练。又过了几周,我才学会如何稳定地训练Transformer模型,使验证损失稳步下降。我没有使用很多高分公开笔记本中的特征,因为我担心过拟合。我不知道这个决定是否正确,但最终排名只下降了5个名次,我并不后悔。

有效的方法

  • 分别训练内容和语言分数。我每个"完整模型"训练了8个模型(每个目标4个,因为有4折)。对于交叉验证,我平均了袋外预测。对于测试数据预测,我平均了每个目标的4个模型的预测结果。

  • 这是一个3级建模过程:
    1) 多个不同的deberta-v3-large模型(不同的池化技术、不同输入、冻结与不冻结、不同的最大长度等)
    2) 从每个deberta的输出生成LGBM预测,加上文本长度等特征。所有模型使用相同的特征列表。
    3) 将6个模型的deberta和LGBM输出输入到爬山算法(带负权重)来预测最终输出。爬山算法作为贪心算法,对输入顺序敏感,我尝试寻找替代方案,但都不如它效果好。

  • 分层学习率衰减 - 使用线性或带warmup的余弦调度器来稳定Transformer训练,这是所有模型的基础。

  • 将输入文本中与prompt文本共现的n-gram替换为"_"字符后使用。大多数模型的输入格式为:prompt_question + 分隔符 + prompt_title + [start] + 修改后的输入文本 + [end]。一个模型在末尾附加了修改后的prompt_text——我将在下面解释。另一个模型在summary_text的每个句子前加上了[P]标记。

  • 仅使用部分token的编码器输出,如[start]和[end],或从[start]到[end]的token,或仅对[P] token进行gem池化。

  • 加权层池化(所有层)、gem池化和均值最大池化

  • 所有模型使用相同的头部:2个线性层,中间使用tanh激活函数。

  • 冻结嵌入层和层。我冻结了12到18层(不包括嵌入层),嵌入层在所有模型中都被冻结。

  • 伪标签:我通过在竞赛数据上训练T5模型,用它生成文本,然后用我最好的集成模型为其打标签,最后先在伪标签数据上训练新模型,再在竞赛数据上训练。第一次实现时存在数据泄露,导致排行榜得分大幅下降。第二次实现带来了小幅提升(2模型集成得分从0.431提升到0.430),但我不知道是否值得这些麻烦。

  • 混合精度训练似乎能得到与全精度训练相当的结果,同时速度更快

  • 我这样加入prompt文本:从prompt_text中收集至少被一名学生引用的句子,这些学生写的摘要至少有20%原创内容(通过n-gram匹配计算)。6个模型的集成中包含了一个采用此方法的模型。该模型在私有排行榜上的得分是0.48(公共排行榜为0.443)。我不知道这种方法到底有多大用,但能找到一种包含prompt_text的方法我已经很开心了。

  • 爬山算法

无效的方法

  • 重新初始化Transformer层
  • AWP(对抗性权重扰动)
  • 通过SIFT进行对抗性攻击
  • MLM(掩码语言模型)
  • SWA(随机权重平均——可能是我的实现有问题)
  • 用于集成的岭回归或XGB
  • 用于将摘要分类到离散化分数桶的辅助损失
  • 使用各种模型嵌入的RAPIDS SVR(未在竞赛数据上训练)
  • 我计算的许多特征,如prompt_text和summary_text之间的平均句子Transformer余弦相似度(按句子计算),提高了CV得分但使排行榜得分更差
  • 尝试让vicuna-13b生成各种特征(包括"黄金"摘要)供deberta或LGBM使用,没有成功。让chatgpt猜测用于计算语言和内容的各项评分细则也没有成功。
  • 我感觉如果摘要提供了切题的、原创的见解,得分会更高。我花了很多精力尝试用各种预训练模型来预测这一点。我还生成了大量chatgpt或llama生成的数据,用于微调deberta以达到此目的。这完全没有奏效。我想我第一个月大部分时间都花在这个追求上,以及让vicuna-13b变得有用。通过这样做,我学到了很多关于LLM基准测试的数据集、关于微调llama和句子Transformer等知识。所以也许这还是有用的(我表示怀疑哈哈)。
  • 一个直到最后都无效的令人担忧的方法是梯度范数裁剪。如果进行裁剪,模型就会停止训练。
  • 使用在之前反馈竞赛数据上训练的模型来猜测语法、连贯性、词汇等竞赛数据的分数,没有成功。但我很早就尝试过,那时我还不太了解后来学到的各种Transformer技术。所以如果我在快结束的时候尝试,也许能成功。
  • 我只选了2个提交,因为我本打算选一个最后时刻提交的,但它出错了,我忘了选替代方案。
  • 我真希望我一直相信CV得分。它与私有排行榜的相关性最好。

致谢

通用学习资料

我从今年四月开始学习机器学习,直到这次竞赛前,我一直对Kaggle感到敬畏。如果有像我一样的人读到这篇文章,我强烈推荐这些课程。我发现它们都非常有帮助和教育意义:

同比赛其他方案