返回列表

21th place solution, puzzlingly shaking from public LB 3th

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

开始: 2019-10-28 结束: 2020-01-22 自然语言处理 数据算法赛
第21名方案,从Public LB第3名令人费解的下滑

第21名方案,从Public LB第3名令人费解的下滑

作者: Luke (mikelkl) | 比赛排名: 第21名

感谢 Kaggle 举办这场精彩的比赛。非常感谢我出色的队友 @ewrfcas@leolemon214。从 Public LB 第3名跌落有点遗憾,希望未来能获得金牌。

我们仔细阅读了其他顶尖方案的分享,但仍然对 Private LB 下降4%感到困惑,有人能帮忙找出这种震荡的原因吗?

以下是我们方案的有效部分,所有以下实验主要在包含 1600个样本的离线开发集 上进行,部分结果已在 Public LB 上验证。

1. 预处理

编号 技术 优点 缺点 效果
1 TF-IDF 段落选择 缩短文档,提高推理速度和准确率 可能丢失部分上下文信息 - dev f1 +1.8%,
- public LB f1 -1%
2 负样本采样至 1:1 平衡正负样本 导致训练时间变长 dev f1 +2.248%
3 多进程预处理 加速预处理,特别是针对训练数据 需要多核 CPU 快 N 倍(使用 N 个进程)

2. 建模

编号 模型架构 思路 性能
1 Roberta-Large 联合长/短跨度提取器 1. 联合建模:
- 回答类型
- 长跨度
- 短跨度
2. 输出 topk 起始/结束 logits/索引
dev f1 63.986%
2 Albert-xxlarge 联合短跨度提取器 联合建模:
- 回答类型
- 短跨度
dev short-f1 69.364%

以上所有模型架构均由我们在 SQuAD 数据集上进行了预训练。

3. 技巧

编号 技巧 效果
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%