362. Google QUEST Q&A Labeling | google-quest-challenge
感谢 Kaggle 和主办方为我们提供这项充满挑战的比赛,并祝贺所有获胜者!我还要感谢我的队友 @aerdem4、@zhesun 和 @jingqinnl 的辛勤工作和深刻见解。这是我第一次组队参赛,这无疑让比赛过程变得更加愉快。
简而言之,我们的最终提交基于 4 个孪生/双 Transformer 架构和一个 USE + 特征工程模型的加权融合,并结合了基于取整的后处理方法。
我将首先描述我们的后处理策略,因为正如许多其他团队一样,这对我们的表现产生了巨大影响。结合加权集成,它使我们的 10 折 GroupKFold CV 分数提高了约 0.05。总体思路是将预测值向下舍入为某个分数 1/d 的倍数:
def scale(x, d):
if d:
return (x//(1/d))/d
return x
因此,如果 d=4 且 x = [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。
我们的最终集成包括:
列出的 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_body 和 question_title + answer 分别作为输入馈送到 Transformer。正如其他顶尖团队一样,这是架构方面最大的区别,为 CV 分数增加了多达 0.01。