361. TensorFlow 2.0 Question Answering | tensorflow2-question-answering
首先,感谢 Kaggle 举办这场极具挑战性的比赛,并祝贺获奖者。这是我第一次处理问答(QA)任务,从大家身上学到了很多东西。
其次,感谢所有在这里进行讨论和分享想法的 Kaggler 们,特别是 @christofhenkel, @boliu0, @higepon 和 @kashnitsky。
这是我简明的解决方案,欢迎提问和建议。
结合了 1 个排序模型(Ranker Model)和 4 个片段预测集成模型。
问题之一是 NQ 数据集中有非常多的长答案候选。其中包含明显的负样本(无关段落),对所有候选进行预测非常耗时。
我使用了 bert-base-uncased 预训练模型,构建了一个二分类模型来预测段落是否包含长/短答案。
在我的验证数据集上,该模型的 Recall@10 分数约为 0.98。处理公开测试集大约需要 5 分钟。其他设置与片段预测模型相同。
通过该模型,我为训练数据和测试数据创建了 ranker-selected 数据集,即每条记录选择得分最高的前 10 个候选。
我使用了 4 个模型进行集成:
bert-large-uncased-squad1 预训练 + 在 NQ 数据集上微调 1 个 epochbert-large-uncased-squad2 预训练 + 在 NQ 数据集上微调 1 个 epochspanbert-large-cased-squad2 预训练 + 在 NQ 数据集上微调 1 个 epochbert-large-uncased-squad2 预训练 + 在 ranker-selected NQ 数据集上微调 1 个 epoch所有模型均基于 bert-joint 模型。
对于第 1~3 个模型,我使用了完整的 NQ 数据集。
在训练中,正如 Frustratingly Easy Natural Question Answering 论文中所述,我使用 196 作为步长,对可回答和不可回答的问题使用不同的下采样率(分别为 0.01 和 0.04)。
Batch size 为 32,最大学习率为 3e-5。
对于第 4 个模型,我使用了 ranker-selected NQ 训练数据集,并将采样率调整为可回答 0.03,不可回答 0.12。
我只使用了 ranker-selected 测试数据集。这比预测所有候选在验证分数上略有提升,更重要的是,这使得预测速度更快。
每个模型的预测大约需要 3 分钟。
单模型的 Private LB 分数为 0.65,集成模型的 Private LB 分数为 0.67。
谢谢。