返回列表

6th place solution

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

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

第6名方案

作者: Robin N (队友: Ahmet Erdem, Zhe Sun, Jing Qin)
比赛: Google Quest Challenge

感谢 Kaggle 和主办方为我们提供这项充满挑战的比赛,并祝贺所有获胜者!我还要感谢我的队友 @aerdem4@zhesun@jingqinnl 的辛勤工作和深刻见解。这是我第一次组队参赛,这无疑让比赛过程变得更加愉快。

简而言之,我们的最终提交基于 4 个孪生/双 Transformer 架构和一个 USE + 特征工程模型的加权融合,并结合了基于取整的后处理方法。

1. 后处理/集成

我将首先描述我们的后处理策略,因为正如许多其他团队一样,这对我们的表现产生了巨大影响。结合加权集成,它使我们的 10 折 GroupKFold CV 分数提高了约 0.05。总体思路是将预测值向下舍入为某个分数 1/d 的倍数:

def scale(x, d):
    if d:
        return (x//(1/d))/d
    return x

因此,如果 d=4x = [0.12, 0.3, 0.31, 0.24, 0.7],这些值将被舍入为 [0.0, 0.25, 0.25, 0.0, 0.5]。对于每个目标列,我们在 [4, 8, 16, 32, 64, None] 中对 d 值进行了网格搜索。

我们在集成中进一步利用了这一技术,首先对单个模型预测应用舍入,然后在取模型预测的线性组合后再次应用舍入。在此过程中,我们发现如果对每个模型使用单独的舍入参数,OOF 分数的提高不再转化为 LB(排行榜)分数。我们通过减少舍入参数的数量来解决这个问题,即在所有模型中使用相同的 d_local

y_temp = 0
for pred, w in zip(model_preds, ws):
    y_temp += w * scale(pred, d_local) / sum(ws)
y_temp = scale(y_temp, d_global)

所有集成参数——2 个舍入参数和 5 个模型权重——都是通过小型网格搜索设置的,在 OOF 上优化 Spearman rho 指标,同时忽略具有重复问题的行的问题目标。所有这些聪明的堆叠和后处理技巧都归功于 @aerdem4

2. 模型

我们的最终集成包括:

  • Siamese Roberta base (CV 0.416)
  • Siamese XLNet base (CV 0.414)
  • Double Albert base V2 (CV 0.413)
  • Siamese Bert base uncased (CV 0.410)
  • USE + 特征工程模型 (CV 0.393)

列出的 CV 分数是未经后处理的 10 折 GroupKFold 结果。虽然 Transformer 模型在 CV 方面的得分明显更高,但 USE + 特征工程模型在堆叠中仍然做出了重大贡献(在 CV 和 LB 上提升了约 0.005)。

所有 Transformer 模型均使用 Pytorch 实现,并使用 Huggingface Transformers 库中的预训练模型作为主干。Transformer 模型是在本地的一块 RTX 2080Ti 上训练的。USE + 特征工程模型使用 Keras 实现,并使用 Kaggle 内核进行训练(代码可在此处获取 https://www.kaggle.com/aerdem4/qa-use-save-model-weights)。由于该模型由我的队友开发,如果需要,我将依靠他们在评论部分提供有关特征、架构和训练的更多详细信息。

除了预训练的主干外,所有 Transformer 架构都非常相似:

  • question_title + question_bodyquestion_title + answer 分别作为输入馈送到 Transformer。正如其他顶尖团队一样,这是架构方面最大的区别,为 CV 分数增加了多达 0.01。
  • 平均池化。这改善了某些模型的 CV(约 0.002),但对于其他模型则与 CLS 输出相似。
  • 自定义 2 层深度回归头,同时也
同比赛其他方案