返回列表

our magics

362. Google QUEST Q&A Labeling | google-quest-challenge

开始: 2019-11-22 结束: 2020-02-10 自然语言处理 数据算法赛
我们的“魔法”技巧

我们的“魔法”技巧

恭喜获奖者们。这是一场既艰难又有趣的比赛。感谢我的队友们(@Yang Zhang @chizhu @chensheng @Guan_Yuhang)。

我们在这次比赛中使用了一些“魔法”技巧。

1. 将30个目标分为两部分

一部分是问题部分,另一部分是回答部分。问题部分包含21个目标,回答部分包含9个目标。我们训练了两个模型来分别预测这两部分。这让我们在比赛初期就获得了较高的分数(0.39x)。

2. 使用定制的Transformer模型

  • a) 增加额外层。对于RoBERTa base模型,我们随机初始化并增加了第13层。对于RoBERTa large模型,我们随机初始化并增加了第25层。
  • b) 将CLS token嵌入和SEP token嵌入连接在一起。
  • c) 连接类别特征和长度特征。

3. 数据预处理

我们为Transformer尝试了许多预处理方法,但只有一种有效:

def cln(x): return " ".join(x.split())

这个非常简单的函数让RoBERTa base的LB分数提高了0.005。

4. 使用外部数据进行训练

数据来源于 https://www.kaggle.com/stackoverflow/stackoverflow

我们的灵感来自论文《Self-training with Noisy Student improves ImageNet classification》。教师模型为学生模型提供大量的弱伪标签,学生模型使用这些弱伪标签进行训练。首先,我们使用一个模型预测未标记数据的伪标签,然后我们使用这些伪标签来训练我们的模型。

  • 对于6k伪标签,我们将LSTM模型的LB分数从0.365提高到0.372(Private分数从0.332提高到0.343)。
  • 对于50k伪标签,我们将RoBERTa base的LB分数从0.405提高到0.415。
  • 对于100k伪标签,RoBERTa base的LB分数仍然是0.415。

我们没有太多时间来训练更强大的学生模型。

5. 数据后处理

这是本次比赛的一大“魔法”。

没有后处理时,我们的RoBERTa large模型LB得分为0.411。当我们使用简单的取整后处理时,分数跃升至0.448。

然后我们结合了几种优化方法进行后处理,这使得RoBERTa large的LB分数跃升至0.46x。提升非常大!

再次感谢我的队友们。你们是天才。

6. 模型集成

我们集成了6个模型(RoBERTa large, RoBERTa base, BERT base 和 XLNet。最好的单模是RoBERTa base,LB分数0.415)。我们对它们使用了后处理并得到了最终分数。

哪些方法无效:

  1. 数据增强。 我们花了很多时间,但没有得到提升。
  2. 损失函数。 我们尝试了MSE loss、Dice loss、Focal loss,它们都没有提升我们的分数。
  3. 针对单个目标训练单个模型。
  4. LSTM+USE。 我们无法通过LSTM+USE获得高分。我们想看看 @sakami 的LSTM解决方案。
同比赛其他方案