返回列表

17th Place solution [bert-disjoint] kernel + all utility scripts

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

开始: 2019-10-28 结束: 2020-01-22 自然语言处理 数据算法赛
第17名解决方案 [bert-disjoint] kernel 及所有工具脚本

第17名解决方案 [bert-disjoint] kernel 及所有工具脚本

作者:Zhengkai Tu | 排名:第17名 | 发布时间:2020-01-23

恭喜所有的获奖者!

我已经公开了我的解决方案(Public 分数 0.65,Private 分数 0.67)。

模型概述

我的模型很简单,使用了 BERT large whole-word-masking uncased,仅使用起始/结束 logits 损失进行重新训练,去除了答案类型损失。使用提供的 NQ 训练 TF record,设置如下:

  • batch_size: 32
  • epoch: 2
  • alpha: 2e-5,但使用 ckpt-15000(所以大约在第 1 个 epoch 停止)

注意,由于学习率的预热/衰减,这与使用 2e-5 训练 1 个 epoch 是不同的。

然后完全忽略答案类型分类(因为我没有包含它),依靠在开发集上使用 nq_eval 调整的长问题和短问题的阈值设置。是的,我放弃了所有的 YES/NO 问题。

我确实尝试在 BERT 阶段之后添加一个 ALBERT xxlarge yes/no 验证器,这在开发集上似乎提高了 1 个百分点,但在 Leaderboard(LB)上不知何故没有效果。我的 kernel 也包含了 ALBERT 部分。工具脚本中没有太多深刻的见解,除了为了将检查点恢复到一些被迫在 keras 中重写的 contrib 层(例如 LayerNormalization)所做的修改。那简直是一场噩梦……

一些反思与见解

我参加比赛太晚了,而且在 ALBERT 耗时太长的错误方向上徘徊了很久,导致几乎没有时间进行调优。我仍然有一种强烈的感觉,即 bert-joint 中的“联合”部分可能没什么用,因为我们已经知道:

  1. BERT 类结构在段落排名方面表现不佳,要使其更好,我们需要至少像 MS-MARCO 那样多的段落。
  2. 我们的训练数据中只有大约 1-3% 的 YES/NO。非常不平衡。

根据我的观察和验证实验,情况很可能就是这样,这意味着答案类型分类器可能仅仅沦为一个问题类型分类器(这对 BERT 来说是一个容易得多的任务),这将是段落包含何种答案的一个

同比赛其他方案