362. Google QUEST Q&A Labeling | google-quest-challenge
感谢赞助商和 Kaggle 主办了如此有趣且充满挑战的比赛!我们的工作是一次惊人的团队合作,在短短两周的时间内进行了冲刺,在此期间我们每天都在取得进展。
为什么是两周?因为我们中的一些人刚刚结束 TF2 QA 竞赛,决定复用在那里获得的 NLP 知识。感谢所有队友:@christofhenkel @cpmpml @philippsinger @dott1718 @maxjeblick。
请同时也给他们点赞,我们抽签决定由谁来发布解决方案,每个人都为此做出了同等的贡献。
我们唯一的遗憾是,最终得分过于依赖 question_type_spelling 列,而该列在训练数据中只有 11 个非零目标值。后期提交实验表明,我们只需对处理该列的方式进行微调,就可以轻松提高或降低我们的最终排名。
像大多数团队一样,我们使用了 HuggingFace 提供的预训练模型,并在 PyTorch 中实现。我们的最终融合(blend)由 5 个 Transformer 模型组成,它们之间存在若干差异以增加多样性。然而,它们的共同点是使用 2 个独立的输入,分别代表问题和答案,长度最多为 512 个 token。这 2 个输入要么通过同一个 Transformer,要么通过 2 个独立的 Transformer。我们将目标更改为序数表示(设置 >target 为 1),从而产生 170 个目标列,每个原始列具有 n 个唯一的目标列。然后通过计算期望值生成预测。
大多数模型使用差分学习率进行训练,其中 Transformer 的学习率为 3e-5,模型头部的学习率为 0.005,并使用余弦调度训练 3 个 epoch,包括在一个 epoch 上的预热。优化器使用 AdamW 或 RAdam,权重衰减为 0.01,有效批次大小为 8(梯度累积)。
双 RoBERTa-base:
双 RoBERTa-base:
带有 Softmax 层权重的连体 RoBERTa-base:
双 RoBERTa-large:
双 XLNet:
鉴于评估指标是基于排名的,且目标不是二进制的,能够正确预测既不是 0 也不是 1 的值似乎很重要。我们尝试了 MSE 损失和其他变体,但结果并不令人满意。然后我们决定使用二元交叉熵和二元目标。第一次尝试是对目标使用独热编码,因为目标具有少量不同的值。这也不令人满意,因为这种表示丢失了值的顺序。
我们最终使用了 (t > v) 形式的编码,对于目标 t 的所有 v 值,除了最后一个值。例如,如果目标 t 具有唯一值 [0, ⅓, ⅔, 1],那么