463. chaii - Hindi and Tamil Question Answering | chaii-hindi-and-tamil-question-answering
感谢 Kaggle 和主办方举办这场比赛!感谢我在论坛和讨论区交流过的每一位社区成员,我从你们那里学到了很多。
在我写这篇总结时,我只知道我的公共排行榜排名,所以这一段可能会变得有些“苦涩”。在这次比赛中,我决定完全信任公共排行榜,甚至没有跟踪本地 CV(交叉验证)。训练数据集很小且被证实存在噪声,而公共排行榜数据量更大,包含 3 路标注,这意味着质量更高。我预计公共排行榜和私人排行榜之间的相关性,要比我的本地 CV 和私人排行榜之间的相关性更高。
我所有的模型都是标准的问答模型(AutoModelForQuestionAnswering),后处理直接复用了 Sylvain Gugger 的 HF 示例笔记本中的代码,我在公开的 EDA 中也使用了该代码。我使用了 XLM-Roberta Large、MURIL Large 和 Rembert,并混合了每个骨干网络中几个模型的预测结果。在下一阶段,我在 3 个骨干网络之间使用了词级别的多数投票,来决定哪些词会进入最终预测。
为了增加多样性,我提交了另一个不混合单一模型的集成,只进行多数投票。它在公共排行榜上的分数较差,但在私人排行榜上是一样的——我选定的两个提交在私人排行榜上都是 0.787。我最好的私人提交是 0.796。我还有一个单模型/折(MURIL),在公共排行榜上得分 0.802,在私人排行榜上得分 0.783。
像大多数其他参赛者一样,我开始比赛时使用的是 Deepset 在英文 SQUAD 上预训练并在 chaii 数据上微调的 XLM-Roberta Large。后来,我开始预训练我自己的骨干模型(我指的是 QA 预训练,而不是 MLM)。我专注于 TyDi 数据集,因为主办方提到 chaii 数据的收集方式与之类似。我进行了几次不同的预训练和微调协议实验,关键的发现是预训练骨干模型的性能往往超过其微调版本。基于这一观察,我决定放弃两阶段方法,改为单阶段训练。然而,我想控制向模型提供不同数据集的顺序。我称之为数据配方,因为这感觉像是在烹饪。
这是我在最终实验中使用的一个数据配方示例:
更多细节:
datasets 库让这一切变得超级简单。这部分深受 fastai 的启发——在一次深度学习课程中,@jhoward 谈到了他将预训练方法从计算机视觉迁移到 NLP(ULMFiT)的工作,并提到遵循这种方法还有许多其他机会。我专注于增强技术。
这是 CV 中标准的增强手段,但我没见过它应用于 NLP,尽管它在这里非常合适:我们需要将很长的文本分块成固定标记长度的片段。与其每个 epoch 只做一次并展示相同的例子,为什么不把它变成动态的随机裁剪呢?最初,我实现了一个函数,对正样本取答案文本周围带有填充的随机裁剪,对负样本取随机裁剪。当我转向上述数据配方时,我意识到通过在每次将数据集添加到配方时使用不同的步长和负采样,可以更简单地实现同样的效果。