返回列表

21st place solution

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

开始: 2019-11-22 结束: 2020-02-10 自然语言处理 数据算法赛
第21名解决方案

第21名解决方案

作者:Dean
发布时间:2020年2月13日

首先,我想感谢我的队友 @brightertiger@khyeh0719@arvissu@qbenrosb00,我们合作得非常愉快。同时也感谢 Google 和 Kaggle 主办了这场精彩的比赛。我将简要总结我们的方法。

预处理

我们在训练 BERT 模型之前尝试了一些预处理方法,结果发现 CV(交叉验证)分数和 LB(排行榜)分数与不做预处理的情况相似。为了保持代码整洁,我们在训练 SOTA 模型时没有进行任何预处理。此外,我们使用了文本的头部和尾部作为模型的输入。

输入

和其他团队一样,我们训练了两个 BERT 模型,分别用于问题标签(21个)和回答标签(9个)。

  • 问题:[cls] + title + [sep] + question + [sep]
  • 回答:[cls] + title + [sep] + question + [sep] + answer + [sep]

建模

我们尝试了不同架构的 BERT:

  • 原生 BERT:LB 0.35x
  • 自定义 BERT + 文本头尾部分: LB 0.392
  • 将问题和回答分开用两个 BERT 训练:LB 0.396
  • 使用特殊标记将问题和回答分开的两个 BERT:CV 0.415,LB 0.405

我们发现使用两个 BERT 配合特殊标记在 LB 上取得了最好的结果。因此,我们应用该方法训练了 GPT2 和 RoBERTa。

我们还使用 BERT 的输出作为嵌入来训练 LSTM,并取得了不错的结果:CV: 0.418,LB: 0.396。

我们尝试过的模型总结:

  • BERT-base:CV 0.415,LB 0.405
  • RoBERTa:CV 0.411,LB 0.398
  • GPT2:CV 0.418,LB 0.396
  • BERT-large
  • BERT-large-wwm
  • BERT-large-wwm-squad
  • BERT-RNN:CV 0.418,LB 0.396
  • 预训练嵌入 + NN
  • RNN + USE

集成

我们用于集成的模型包括 BERT、RoBERTa、GPT2 和 BERT-RNN。我们仅使用了简单的平均法进行集成。

后处理

我们仅使用了阈值方法进行后处理,并在 LB 上获得了约 0.004 的提升。我不喜欢后处理方法。然而,在这场比赛中,后处理就是你所需的一切

def postProcessing(x):
    x = np.where(x >= 0.9241, 1.0, x)
    x = np.where(x <= 0.0759, 0.0, x)
    
    return x
    
targets = ['question_conversational',
           'question_type_compare', 
           'question_type_consequence', 
           'question_type_definition', 
           'question_type_entity', 
           'question_type_choice']
           
sub.loc[:, targets] = postProcessing(sub.loc[:, targets].values)

对我们无效的方法

  • BERT-large
  • 基于 SQuAD2 数据集预训练的 BERT-base
  • 梯度累积
同比赛其他方案