361. TensorFlow 2.0 Question Answering | tensorflow2-question-answering
感谢 Kaggle 举办这场精彩的比赛。非常感谢我出色的队友 @ewrfcas 和 @leolemon214。从 Public LB 第3名跌落有点遗憾,希望未来能获得金牌。
我们仔细阅读了其他顶尖方案的分享,但仍然对 Private LB 下降4%感到困惑,有人能帮忙找出这种震荡的原因吗?
以下是我们方案的有效部分,所有以下实验主要在包含 1600个样本的离线开发集 上进行,部分结果已在 Public LB 上验证。
| 编号 | 技术 | 优点 | 缺点 | 效果 |
|---|---|---|---|---|
| 1 | TF-IDF 段落选择 | 缩短文档,提高推理速度和准确率 | 可能丢失部分上下文信息 | - dev f1 +1.8%, - public LB f1 -1% |
| 2 | 负样本采样至 1:1 | 平衡正负样本 | 导致训练时间变长 | dev f1 +2.248% |
| 3 | 多进程预处理 | 加速预处理,特别是针对训练数据 | 需要多核 CPU | 快 N 倍(使用 N 个进程) |
| 编号 | 模型架构 | 思路 | 性能 |
|---|---|---|---|
| 1 | Roberta-Large 联合长/短跨度提取器 | 1. 联合建模: - 回答类型 - 长跨度 - 短跨度 2. 输出 topk 起始/结束 logits/索引 |
dev f1 63.986% |
| 2 | Albert-xxlarge 联合短跨度提取器 | 联合建模: - 回答类型 - 短跨度 |
dev short-f1 69.364% |
以上所有模型架构均由我们在 SQuAD 数据集上进行了预训练。
| 编号 | 技巧 | 效果 |
|---|---|---|
| 1 | 如果 answer_type 是 yes/no,输出 yes/no 而不是短跨度 | public LB f1 +6% |
| 2 | 1. 如果 answer_type 是 short,输出长跨度和短跨度 2. 如果 answer_type 是 long,仅输出长跨度 3. 如果 answer_type 是 none,既不输出长跨度也不输出短跨度 |
public LB f1 +8% |
| 3 | 从 topk * topk 种长/短回答组合中选择最佳的长/短回答对 | dev f1 +0.435% |
| 4 | long_score = summary.long_span_score - summary.long_cls_score - summary.answer_type_logits[0]short_score = summary.short_span_score - summary.short_cls_score - summary.answer_type_logits[0] |
- dev f1 +2.12% - public LB +2% |
| 5 | 增加 long [CLS] logits 乘数阈值以增加空长回答 | dev long-f1 +3.491% |