返回列表

🏅️ 4th Place Solution (0.447) 🏅️

446. CommonLit Readability Prize | commonlitreadabilityprize

开始: 2021-05-03 结束: 2021-08-02 智能评测 数据算法赛
🏅️ 第四名解决方案 (0.447) 🏅️

🏅️ 第四名解决方案 (0.447) 🏅️

作者: datasaurus (Grandmaster) | 排名: 第4名

我要感谢 Kaggle 和 CommonLit 举办了这次比赛,也要感谢这里所有分享了精彩讨论和 Notebooks 的人。我到现在还很震惊,因为我一直梦想着能获得单人金牌,但从没想过真的能实现!

CV 策略

这是继去年的 Tweet Sentiment Extraction 比赛之后,我参加的第二个 NLP 比赛。两者有一些相似之处,即 a) 数据集较小,b) 目标噪声较大。TSE 比赛的技巧是使用 5 折交叉验证(CV),但要平均多个随机种子(我用了 5 个,每个实验总共运行 25 次,然后取平均值)。

为了创建我的 5 折数据,我使用了 Abhishek 的分箱和分层 方法。平均来看,CV 和 Public LB 之间大约有 0.01 的差距,但相关性很好。我没有提交大部分的单模型,因为我对我的 CV 设置很满意,而且我很懒 😂️。

我表现最好的模型是 deberta-large,其 CV 为 0.4738(5 个种子的平均值)。

流程

Transformers

对于我所有的 transformer 模型,我使用了此 notebook 中的 AttentionBlock,但将其应用于 transformer 序列的最后隐藏状态。

n_hidden = self.config.hidden_size  # from HF config

self.seq_attn_head = nn.Sequential(
    nn.LayerNorm(n_hidden),
    AttentionBlock(n_hidden, n_hidden, 1),
    nn.Linear(n_hidden + n_additional_features, 2 if kl_loss else 1),
)

额外特征

我还使用 textstat 添加了几个特征,即 flesch_reading_easesmog_index,并将它们拼接到 AttentionBlock 的输出之后,再进入回归头。这些特征给我的 CV 带来了微小但可重复的提升,但我不确定这对最终性能是否有重大影响。我在比赛后期做了一个测试,拼接了其他模型的预测结果,效果并不比下面的集成方法好,这让我觉得这些特征的作用很小。

训练配置

  • 优化器:AdamW
    • 权重衰减:1.0
    • 学习率:0.00005 或 0.000025(取决于 batch size)
  • 轮次:6,在第 3 轮后使用 SWA
  • Batch size:16(较大的模型为 12)
  • 每 5 步验证/保存检查点一次
  • 损失函数:MSE
  • 无 dropout

其他工具

  • 日志记录:结合使用 Weights & Biases 和 Google Sheets(用于跟踪多个种子)
  • 模型存储:Google Cloud Bucket 并传输到 Kaggle Notebook(到 /kaggle/output/)。我发现这比常规的数据集上传更可靠,而且不会遇到存储限制。
  • PyTorch Lightning
  • 使用 Kaggle API 的 Shell 脚本来测量 notebook 执行时间

集成

选择

我从所有的模型开始,迭代地移除最差的模型,直到符合 GPU 时间限制。(我发现这比贪婪地添加模型效果更好)。我认为这最终效果很好,因为选择过程会选择有助于整体集成的模型,而不是 CV 分数最高的模型。

我主要使用了 3 种集成方法:

  • RidgeCV(使用 LeaveOneOut 交叉验证)
  • BayesianRidgeRegression(带有 LOO CV 循环)
同比赛其他方案