返回列表

5th place solution

519. Feedback Prize - English Language Learning | feedback-prize-english-language-learning

开始: 2022-08-30 结束: 2022-11-29 智能评测 数据算法赛
第5名方案

第5名方案

作者: Psi | 比赛排名: 第5名

感谢 Kaggle 和主办方举办第三届 Feedback 竞赛。

概述

我的解决方案基于多个微调 NLP transformer 模型的集成。此外,我在旧的 Feedback 数据上使用了两轮伪标签。

我参考了我们在第二届 Feedback 竞赛中的很多建议(描述这里),并为这次比赛工作了大约两周。我的时间分配大约是 50% 用于准确性,50% 用于效率解决方案。

交叉验证

总的来说,我观察到本地 CV 和公共 LB 之间有很好的相关性。由于数据非常少且评估指标是 RMSE,本地得分可能会非常不稳定。为此,对于我运行的每个实验,我都训练了三个不同的随机种子,并且只比较这三个种子的平均值。例如,如果我想比较 LR=1e-5 和 LR=2e-5,我会为这两个实验分别运行三个单独的种子进行单折验证,只有当三个种子的平均值有提升时,我才会在所有 5 折上运行,然后再次比较 3 个种子的混合结果以确保无误。

这让我能够为我的实验带来更多的可信度,而且由于数据量真的很小,这对我来说通常是可行的。

建模

当前的问题非常直接:将文本输入 transformer 模型,应用某种池化,添加一个线性头,并预测回归目标。我在最终集成中使用了以下训练流程的组合:

Token 长度:

  • 512
  • 1024
  • 2048

我所有的模型都使用动态填充进行训练和预测。

池化:

  • CLS Token
  • GeM Pooling

主干网络:

  • Deberta-V3-Base
  • Deberta-V3-Large
  • Deberta-V2-XL
  • Deberta-V2-XXL
  • Longformer Large
  • Roberta-Large

对于我的大多数模型,我通常运行 3 个 epoch,全部使用余弦衰减学习率,并总是选择最后一个 epoch。我对模型的主干和头部使用差异化学习率。我不使用论坛中建议的任何其他技术,如主干各层的差异化学习率或重新初始化。

像往常一样,为了最终提交,我在完整数据上重新训练了我的模型,但也混入了一些折模型,因为我还有很多运行时间剩余。

伪标签

我遵循了我们在第二届 FB 竞赛中的流程,并按照以下步骤实施了两阶段伪标签:

  1. 仅在给定的训练数据上训练模型集成
  2. 在之前的 Feedback 竞赛数据上运行预测(排除本次竞赛的数据)
  3. 使用来自这个额外数据集的伪标签,先在伪标签上预训练模型,然后仅在给定的训练数据上进行微调。
  4. 重复步骤 1-3 三次,使用现在在伪标签上训练的模型集成

通过进行预训练和微调,我不需要调整伪标签的分布,因为我正在本次竞赛的数据上做最终调整。这让我能够毫无问题地使用所有以前的数据。

集成

对于我的大多数提交,我只是做了跨种子和模型的常规平均。我最终最好的提交是一个经过 Nelder-Mead 优化的模型集成,我分别针对每个目标列优化了集成权重。为了不过度拟合 CV,我在权重上添加了 1 到 3 之间的权重界限。

实际上,我本可以更信任本地优化,我几天前有一个未选中的提交,拥有最好的本地 CV,它在 Private LB 上能排到第 2 名,该提交对集成权重没有限制,甚至包含负权重,但这感觉有点太冒险了,而且因为我只做了一次基于最佳 CV 的提交,所以我选择了一个稍微保守一点的方案。

无效的尝试

  • 数据增强(一如既往,特别是对于回归任务很棘手)
  • 不同的损失函数
  • TFIDF
  • 其他主干网络(如 T5、GPT 等)- Deberta 实在是太强了
  • 第二阶段模型 / 堆叠模型

最终提交

我做了一个基于保守最佳 CV 分数的提交,这也是我最好的已选 Private LB 提交(虽然我有一个更好的未选中提交)。我做了一个基于最佳 Public LB 的提交,它在 Private LB 上明显更差。还有一个提交花在了效率上。

同比赛其他方案