返回列表

Two BERTs are better than one (2nd place solution)

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

开始: 2019-11-22 结束: 2020-02-10 自然语言处理 数据算法赛
两个BERT胜过一个(第二名解决方案)

两个BERT胜过一个(第二名解决方案)

作者: Max Jeblick (及队友: christofhenkel, cpmpml, philippsinger, dott1718, maxjeblick)
比赛: Google QUEST Q&A Labeling
排名: 第 2 名

感谢赞助商和 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
  • 将问题标题添加为 answer-transformer 的输入
  • 每个目标都有独立的头部
  • 最后一层输出的平均值

双 RoBERTa-base:

  • 双重 roberta-base
  • 将问题标题添加为 answer-transformer 的输入
  • 每个目标都有独立的头部
  • 最后一层输出的平均值

带有 Softmax 层权重的连体 RoBERTa-base:

  • 双重 roberta-base
  • 将问题标题添加为 answer-transformer 的输入
  • 每个目标都有独立的头部
  • 最后一层输出的平均值

双 RoBERTa-large:

  • 问题/答案仅使用 256 个 token
  • 双重 roberta-large
  • 只有批次大小为 1 和 fp16 才能放入内存

双 XLNet:

  • 与双 roberta-base 相同,但使用 xlnet-base 作为骨干
我们使用了概率预测的简单平均值来集成我们的模型。

详细总结

二进制编码目标

鉴于评估指标是基于排名的,且目标不是二进制的,能够正确预测既不是 0 也不是 1 的值似乎很重要。我们尝试了 MSE 损失和其他变体,但结果并不令人满意。然后我们决定使用二元交叉熵和二元目标。第一次尝试是对目标使用独热编码,因为目标具有少量不同的值。这也不令人满意,因为这种表示丢失了值的顺序。

我们最终使用了 (t > v) 形式的编码,对于目标 t 的所有 v 值,除了最后一个值。例如,如果目标 t 具有唯一值 [0, ⅓, ⅔, 1],那么

同比赛其他方案