返回列表

8th place solution

361. TensorFlow 2.0 Question Answering | tensorflow2-question-answering

开始: 2019-10-28 结束: 2020-01-22 自然语言处理 数据算法赛
第8名解决方案

第8名解决方案

作者:Oleg Platonov
比赛排名:第8名

首先,我要感谢主办方提供了这个有趣且数据集非标准化的比赛。问答任务是NLP中最有趣的任务之一,很高兴终于在Kaggle上看到它。同时,也要感谢为参赛者提供的GCP积分和TPU配额,我相信这极大地拓宽了本次比赛中测试的模型和思路的范围。

我的工作最初是尝试使用RoBERTa作为骨干网络在PyTorch中重新实现BERT-joint。然而,在这个过程中我添加了不少技巧和调整,最终得到的模型和流程与原始的BERT-joint有了显著不同。在这里我将描述主要的改动。

预处理

我没有在整个维基百科文章上滑动窗口,而是分别处理每个顶级长答案候选。对于每个候选,如果长度允许,我将其转换为一个训练样本;如果候选太长,则将其拆分为几个训练样本。对于那些特别短的候选,我还添加了一些周围的上下文。

上述预处理产生了大约152k个正样本和超过1200万个负样本(不包含任何答案),因此我通过随机抽样将负样本数量减少到160k。我使用了一种硬负例挖掘策略,即更多地采样那些问题和候选之间具有高TF-IDF相似度的负样本。我还采样了几个不重叠的负例子集用于不同的训练周期,从而增加了训练数据的多样性。

模型

我的模型只是RoBERTa-large(我使用Transformers库中的实现),在其顶部加了一个新的输出层。除了用于短答案的Token级跨度预测器外,我还使用了一个二元分类器来判断候选是否为长答案。可回答性分类器与跨度预测器的结合是SQUAD2.0的标准方法(XLNet、RoBERTa、ALBERT都使用它)。NQ数据集与SQuAD2.0的不同之处在于,即使正确的短答案跨度为空(当问题有长答案但没有短答案时会发生这种情况),问题也可以被认为是可回答的。

对于跨度预测器,我使用了XLNet的一个技巧:不是独立预测起始和结束Token,而是先预测起始Token,然后将其来自最终编码器层的表示连接到所有Token的表示上,并将这些连接后的表示作为输入传递给结束Token预测器。这意味着结束Token的预测以起始Token为条件,这显著提高了跨度预测的质量。

我没有找到一种在不降低总分的情况下将YES/NO答案包含在预测中的方法,因此我选择不预测此类答案。

在推理过程中,我首先找到具有最高可回答性分数的长答案候选。如果该分数高于某个阈值,我选择该候选作为我的长答案预测,并为该候选预测一个短跨度。如果该跨度的分数也高于某个阈值,我选择它作为我的短答案预测。我使用官方NQ开发集找到了长答案和短答案的最佳阈值。

训练超参数

在所有实验中,我使用了AdamW优化器,权重衰减为0.01,学习率线性衰减并带有预热。我既没有时间也没有计算资源尝试广泛的超参数范围,所以我选择的参数可能远非最优。我在开发集上获得了最佳结果的模型训练了5个周期,批量大小为48,最大学习率为2e-5。我将此模型用于我的最终提交之一。我还有另外两个结果不错的模型,后来用于集成:一个训练了3个周期,批量大小为24,最大学习率为3e-5;另一个训练了2个周期,批量大小为15,最大学习率为3e-5。

在单个V100 GPU上使用混合精度训练RoBERTa-large 1个周期(312k训练样本)大约需要4小时。

集成

对于我的第二次最终提交,我通过简单地将三个模型的输出层对数求和来进行集成。这种方法在开发集上带来了显著改进,但无法在提交时间限制内完成。为了解决这个问题,我决定通过只取前N个候选来限制每个问题的长答案候选数量(反正大多数答案都在前几段中找到)。然而,当我的最终模型和集成代码准备好时,距离截止时间只剩五小时,而且我还剩两次提交机会,所以我没有机会选择能使提交符合时间限制的最大N值。我最终选择的N值太小,这可能损害了我的集成性能。事后看来,更好的方法可能是先用一个模型对所有候选进行评分,然后仅对从第一个模型获得最高可回答性分数的几个候选使用另外两个模型。

最终,我的三个主要模型以及集成模型在私有测试集上都获得了0.68的分数。好吧,至少我的结果很稳定。

一些不太奏效的想法

  • 虽然SQuAD2.0预训练在我早期的实验中似乎有益,但它损害了我最终模型的性能,所以我最终没有使用它。我怀疑在更改输出层架构时,我可能在SQuAD预训练代码中引入了一些错误。这解释了为什么许多其他参与者以及几篇关于NQ数据集的论文都报告了SQuAD预训练带来的改进。

  • 我尝试添加另一个二元分类器来判断候选是否包含短答案,但这并没有在开发集上带来改进。现在我可以看到,我早期带有这个额外分类器的提交在私有测试集上的分数略高于没有它的类似提交,所以这可能终究是一个有用的想法。

同比赛其他方案