科技战疫·疫情政务问答助手 TOP 思路分享


         笔者之前也参加了问答助手这个比赛,后面因为一些原因,没有时间完成。不过笔者上周答辩的时候,特地关注了这场比赛TOP选手答辩,在这列举一下我看到的Top思路。

1.1 数据介绍

该赛题的基础文档数据集是通过在互联网上采集到的全国各地发布的疫情相关政策文档,其中以北京市发布的各类政务文件为主。标注数据包含了疫情相关的问题和答案数据,这部分数据是在相关疫情政策文件上通过人工标注形成的。

科技战疫·疫情政务问答助手 TOP 思路分享

数据说明

            简单来说,就是训练集有问答对与其对应的抽答案的文档,而测试集只有问题。基于这个数据集,我们需要从文档中找到测试集每一个问题相匹配的文档,并从匹配的文档中抽出答案。

1.2 思路

整体流程图如下,重点在于BERT的细召回部分。

科技战疫·疫情政务问答助手 TOP 思路分享

1.2.1 BM25

因为文档的数据有8000多个,如果单单用BERT进行召回的话,那么速度是非常慢的,成本代价也是最高的。BM25算法是业界常用的无监督召回策略。笔者的团队通过BM25算法粗召回与问题相关的文档50个,在训练集的召回正确率达到了90%+,为此笔者将召回文档数目设置为50

这里值得注意的是,8000多个文档中是有重复的,为此,需要在预处理的过程中将重复的文档删除,降低我们的算法的时空复杂度。

1.2.2 细召回

我们通过BM25算法得到了训练集与测试集中每个问题相关的50个文档,此时我们的任务就转化为如何利用BERT找出问题最相关的文档并找出该文档中的答案。

这里大家可以先估摸一下这两个问题的难度。其实对于BERT来说,找出问题最相关文档任务的难度远远大于阅读理解任务。答辩队伍基本都是将两个任务联合起来进行训练,那么设定两个任务的loss权重则是训练的关键。

数据构造则是问答对的形式:

input<问题·文档>output<是否为相关文档,答案>

因为前者的难度远大于后者,他们的权重的设置在[0.90+, 0.10-]这个范围,也就是说,判断是否为问题最相关文档的权重占比在90%以上。

这里值得注意的是,因为大多数文档存在过长的原因,可能无法全部喂入BERT中,我们团队则是利用动态规划的方式进行切割,尽可能得保留切割出来的段落的信息完整性,而后与问题进行组装喂入BERT中。

科技战疫·疫情政务问答助手 TOP 思路分享

模型结构图

科技战疫·疫情政务问答助手 TOP 思路分享

其中,cls loss是用来计算判断是否为问题的相关文档任务的lossstartend则是阅读理解任务的loss

1.3 总结

至此,这个比赛的最核心的点就已经介绍完了,剩下的trick比如加对抗、改异构单模以及融合等等,基本上都和别的比赛差不多,就不进行赘述了。