返回列表

9th place solution

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

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

第9名解决方案

作者:Anastasia Karpovich
比赛排名:第9名(金牌)

首先,我要感谢 Kaggle 团队和 TensorFlow 举办了这场精彩的比赛,感谢 TFRC 项目提供的 TPU 额度,感谢 Google Cloud 提供的 300 美元额度,以及 @prokaj 分享他的解决方案。

能够处理大型真实世界的高质量数据集,第一次使用 TensorFlow 2.0 和 TPU,在几秒钟内运行推理,使用 batch_size=128 进行训练,并最终赢得金牌,这是一次非常棒的经历。

方案概述

我的方案是在 TPU 上用 TF 2.1 训练的单模型。它是经过一些调整和后处理的 Bert Joint 模型。以下是主要区别:

  • 预训练模型:Whole-Word-Masking Bert Large。
  • Tfrecords:使用 include_unknowns=0.2 生成(无答案的样本数量比原论文多 10 倍)。
  • 训练参数:训练了 1 个 epoch,batch size 为 128,lr=5e-5(在 TPU 上耗时 4-5 小时)。
  • 使用答案类型 logits:
    • 如果 answer_type=1 => yes_no_answer='NO'
    • 如果 answer_type=2 => yes_no_answer='YES'
    • 如果 answer_type=4 => 无短答案
  • 获取 top_level=False 的答案:

    我进行了数据分析(EDA),发现如果 2 个长答案候选包含短答案,其中一个是 top_level,另一个不是 top_level,并且它以 "Li" HTML 标记开头 => 大约有 70% 的概率正确的候选是非 top_level 的那个。所以我将这个想法作为后处理步骤实现了。

  • 线性回归作为答案验证器:

    对 9 个 logits 进行线性回归。这 9 个 logits 包括 5 个答案类型 logits,cls_start_logit,cls_end_logit,start_span_logit,end_span_logit。

附言:
在我的本地指标中,我设置了 long_non_null_threshold = 1,short_non_null_threshold = 1,但由于某种原因,这对排行榜分数没有太大影响(与 long_non_null_threshold = 2,short_non_null_threshold = 2 相比)。

同比赛其他方案