361. TensorFlow 2.0 Question Answering | tensorflow2-question-answering
恭喜所有的获奖者!
我已经公开了我的解决方案(Public 分数 0.65,Private 分数 0.67)。
我的模型很简单,使用了 BERT large whole-word-masking uncased,仅使用起始/结束 logits 损失进行重新训练,去除了答案类型损失。使用提供的 NQ 训练 TF record,设置如下:
注意,由于学习率的预热/衰减,这与使用 2e-5 训练 1 个 epoch 是不同的。
然后完全忽略答案类型分类(因为我没有包含它),依靠在开发集上使用 nq_eval 调整的长问题和短问题的阈值设置。是的,我放弃了所有的 YES/NO 问题。
我确实尝试在 BERT 阶段之后添加一个 ALBERT xxlarge yes/no 验证器,这在开发集上似乎提高了 1 个百分点,但在 Leaderboard(LB)上不知何故没有效果。我的 kernel 也包含了 ALBERT 部分。工具脚本中没有太多深刻的见解,除了为了将检查点恢复到一些被迫在 keras 中重写的 contrib 层(例如 LayerNormalization)所做的修改。那简直是一场噩梦……
我参加比赛太晚了,而且在 ALBERT 耗时太长的错误方向上徘徊了很久,导致几乎没有时间进行调优。我仍然有一种强烈的感觉,即 bert-joint 中的“联合”部分可能没什么用,因为我们已经知道:
根据我的观察和验证实验,情况很可能就是这样,这意味着答案类型分类器可能仅仅沦为一个问题类型分类器(这对 BERT 来说是一个容易得多的任务),这将是段落包含何种答案的一个