返回列表

17th place solution - BigBird 🐥

463. chaii - Hindi and Tamil Question Answering | chaii-hindi-and-tamil-question-answering

开始: 2021-08-11 结束: 2021-11-15 自然语言处理 数据算法赛
第17名方案 - BigBird 🐥

第17名方案 - BigBird 🐥

作者: Nicholas Broad | 发布时间: 2021-11-16

首先,非常感谢比赛主办方和Kaggle。我在这次比赛中投入了大量的时间,确实学到了很多关于QA(问答系统)、多语言模型以及Kaggle本身的知识。

这基本上是我第一次在Kaggle的公共区域展示自己,我很高兴自比赛开始以来取得了以下成就:

  • 3x Kaggle Expert(数据集、Notebooks和讨论),很快就是4x了 😊
  • 2x 金牌 Notebooks
  • 20+ 金/银牌评论
  • 从几天前的LB(排行榜)600+名上升到今天的第17名(我用户名后的乌龟最初是为了代表我的进步。稳扎稳打!)
  • 找到了一份新工作 🤗

我的解决方案

XLM-R

  • 6折交叉验证,最大长度384,步长128,私有/公开LB 0.747/0.77,CV平均分 0.718

MuRIL Large

  • 6折交叉验证,最大长度384,步长128,私有/公开LB 0.739/0.777,CV平均分(忘记了)

RemBERT

  • 5折交叉验证,最大长度384,步长128,私有/公开LB 0.750/0.786,CV平均分 0.748

MuRIL Large BigBird

  • 6折交叉验证,最大长度1024,步长512,私有/公开LB 0.756/0.796,CV平均分 0.732

最后一个模型可能是我做的唯一新颖的事情,也是我排名这么高的原因。我注意到这些段落的上下文相当长,通过一些研究我发现 BigBird 和 LongFormer 是为长上下文设计的两种架构,不会导致计算时间激增。我还注意到 BigBird 的作者指出,他们在训练模型时从 BERT 检查点进行了“热启动”,这减少了训练步骤,所以我想我也从 XLM-R 或 MuRIL 做同样的尝试(参见第7页“Pretraining and MLM”部分)。由于 MuRIL 基本上与 BERT 相同,所有权重(除了一个模块)都顺利加载到了 BigBird 模型中。让我纠结了一会儿的是位置嵌入(是学习得来的)从 (512, 768) 变为 (4096, 768)(max_seq_length, hidden_size)。我参考了 Longformer 作者的做法,最终将原始位置嵌入平铺8次以使其适应(参见第6页“Position Embeddings”部分)。

我在 TPU v3-8 上使用 Flax 训练了150k步,批次大小为1,训练任务是掩码语言建模(MLM)。我使用了 mc4 的泰米尔语、印地语、泰卢固语、乌尔都语和英语部分,直接输入模型,没有进行清洗。进行全词掩码和数据清洗可能会有显著帮助,但我没时间了。我对 large 尺寸的模型也做了同样的处理,但我只能适应1024的序列长度,而且只训练了90k步,批次大小为1。base 模型在评估集上的 MLM 准确率达到了75%,large 模型达到了71%。

在此基础上,我的 MuRIL Large、XLM-R 和 Muril Large BigBird 模型首先在 SQuAD2 上训练,然后在 XQuAD、MLQA、TyDiQA(泰卢固语)和 chaii 数据集上训练,仅在一个分层的 chaii 折上进行验证。因为我还有计算时间,我在 TPU v3-8 上使用 Flax 轻松快速地完成了所有这些工作。

在 Kaggle GPU 上训练 RemBERT 很痛苦,所以我使用了 Tensorflow 和 Kaggle TPU。这变得很容易,而且我说服自己,拥有一些 Tensorflow 模型提供了模型多样性。我在 SQuAD2 上训练了它,然后是 TyDiQA、MLQA、XQuAD。

这是我获得最高分的最终 Notebook。它很乱,本来没打算作为我的最终提交 😅

模型融合

我实际上没有通过模型融合得到提交结果。我没有融合不同模型时的最高分是 MuRIL BigBird Large 的6折。我永远无法让23折及时完成,但我计划根据长度在大约10k字符处分割段落。10k以下的使用 XLMR、MuRIL Large、RemBERT 和 MuRIL BigBird Large。10k以上的只使用 MuRIL BigBird Large。有些上下文太长了,特别是以384/128分割时。

对于融合,我尝试了投票,但在完成之前就没时间了。我最终通过平均多个部分之间的重叠并将它们连接起来,将 token logits 转换

同比赛其他方案