446. CommonLit Readability Prize | commonlitreadabilityprize
2021年9月10日 - 添加了提交笔记链接
2021年8月16日 - 添加了代码链接
首先,我要感谢 Kaggle 和 CommonLit 举办了这场比赛,也要感谢 Kaggle 社区让这个平台成为一个学习的好地方。这是我参加的第二个 Kaggle 比赛,第一个是 Coleridge Initiative;不得不说,过去的三个月是一段极棒的旅程。如果三个月前有人告诉我会在 Kaggle 比赛中获得第3名,我是不会相信的。如果没有 Kaggle 及其不可思议的社区,这一切都不可能实现。
特别感谢:
@rhtsingh 分享了许多带有详细且出色解释的优秀笔记本。这些笔记本指导了我在比赛前几周的工作。
@andretugan 分享了一个简单而优雅的解决方案。我最终模型的部分内容源于他的方法。
在介绍我的方法之前,我想分享我对比赛目标的看法。如果我说错了或者对你来说没意义,请指正。
本次比赛的特点是训练数据量小,且目标值嘈杂、难以直观理解。目标值是通过 Bradley-Terry 算法从相对较少的成对比较数据中生成的。根据我的直觉,Bradley-Terry 就像 Elo 等级分系统,比赛结果被转化为代表每个玩家“实力”的原始数字。(同样,这可能只是我的片面观点)在本次比赛中,文本是玩家,而“实力”就是“阅读难易度”,越容易阅读的文本得分越高。
训练数据 + 公开/私有数据总计不到 5k 个样本,每个样本平均与其他样本比较 46.47 次。这意味着每段文本平均只与整个数据集约 1% 的文本进行了比较。想象一下一个棋手的 Elo 分,该棋手只与整个棋手群体中的 1% 下过棋,而且对手是随机选择的。我认为大部分噪声是由于比较次数太少造成的。
比赛的目标是预测任意文本在由 5k 个文本生成的排行榜上的位置。
比赛开始时我主要尝试了 Roberta base,通过在最后一层隐藏层上使用 gru+多头注意力 + 学习率衰减,我在公开和私有 LB 上都获得了 ~0.473 的成绩。
随后我切换到 large 模型,同样的设置下,公开和私有 LB 成绩大约在 0.465-0.467。
之后我从 @andretugan 的笔记本中学到了很多,并将 3 组学习率衰减、简单注意力头和验证步策略融入到了我的解决方案中。
Roberta-large + 简单注意力头 + 学习率衰减:两个 LB 均为 0.462
0.462 + 所有层的加权平均和多样本 dropout(来自 google quest #1 方案)+ 单独的头部学习率:公开成绩 0.459
0.459 + 3阶段学习率调度:公开成绩 0.454

0.454 + 在第3个 epoch 开始时早停:公开成绩 0.453
然而,私有 LB 并没有认可提升到 0.453 的结果,当时我并不知道这一点。私有 LB 停留在 ~0.461
不过,将 2 个 Roberta large 和 1 个 Roberta base 这样训练的模型进行集成,公开成绩 0.454,私有成绩 0.456。
然后我使用了我的两个 0.453 公开模型来标记额外数据,这些数据包括简单的 wiki 转储、儿童读物测试和 OneStopEnglishCropus。
使用所有折进行标记会导致不切实际的低 CV(由于泄露)且对 LB 没有提升,所以我使用了 google quest #1 方案中描述的 5 折伪标签方法。
我首先在伪标签数据上训练模型,然后用低学习率训练 3 个 epoch 结束,并使用每个 epoch 衰减率(1, 0.5, 0.25)的学习率调度器,无预热。
2 个周期将我的公开成绩提升到了 0.448:0.453 -> 0