返回列表

24th place - mixing all I can - BERT+XLNET+GPT2+LGB

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

开始: 2019-11-22 结束: 2020-02-10 自然语言处理 数据算法赛
第24名 - 混合所有能用的模型 - BERT+XLNET+GPT2+LGB

第24名 - 混合所有能用的模型 - BERT+XLNET+GPT2+LGB

作者:Akhat Rakishev | 排名:第24名 | 发布日期:2020-02-11

这是我第一次在公开场合分享东西。我达到了专家等级,所以我想是时候回馈社区了,即使我的结果并不是最顶尖的!

以下是一些产生关键影响的想法:

预处理

  • 特征工程 - 标点符号的数量、名词等事物的数量、问题与答案之间的常用词数量等。这些特征被用于单独的模型(LGB)中。
  • 两组单独的分词输入集。第一组完全由问题标题和问题正文组成,用于预测仅依赖问题的类别(前21个输出)。第二组由问题标题、问题正文和答案组成,用于剩余的9个类别,这些类别与答案如何关联问题以及答案本身的特征有关。

建模

  • 训练 BERT、XLNET、GPT2,均使用基础配置(base configuration)——针对两组输出(仅问题和问题+答案)各训练一种模型。使用 one-cycle 训练策略、标准 Adam 优化器,并在验证指标下降时进行早停。训练了3个折(但使用的是10折 GroupKFold,以便每个折都有更大的训练集)。
  • 仅使用工程化特征训练 LGB,每个输出变量训练一个 LGB 模型。

后处理

  • 使用经过 softmax 处理的验证分数作为权重来混合所有模型。使用的 beta 值为 18.5,因为这最大化了验证分数(在单独的内核中优化得出)。
  • 遍历每个输出变量的不同取整策略,并为每个变量选择最佳策略。考虑的取整策略包括:保留1-5位小数的常规取整、通过将预测值乘以 10^X(X 在 1-5 范围内)然后使用 floor/ceil(向下/向上取整),再除以 10^X 来实现的取整。

PS:最初的内核 fork 自 Bert-base TF2.0 (now Huggingface transformer),非常感谢 @akensert 的分享!如果没有这个基础,我不可能取得这样的成绩,因为我加入比赛比较晚(结束前19天才加入)。

PSS:实际代码比较乱,并且依赖于保存的模型权重。不过如果有人想看一看,代码在 这里(v19 是最终提交版本)。

同比赛其他方案