0 基本思想
0.1 竞赛无需重复造轮子
- 在利用其它SOTA模型时,不要试图修改放入自己的模型框架,基于其源码框架修改输入输出即可,可以最大限度避免模型复现问题,减少复现时间
0.2 刷榜竞赛结果注意格式完全正确才能得到结果
0.3 基于他人模型修改时务必先阅读每一行代码,了解哪些部分需要修改
- 一定要仔细阅读,磨刀不误砍柴工,如果不仔细阅读,后续调试会耗费更多时间
0.4 一定要坚持进度管理
虽然算法竞赛可能存在一些长时间调参去获取更优效果的情况,但是基本的进度管理还是要坚持,即便没有进展,也应该要按时讨论以及做进度汇报与总结。否则,会导致后续时间严重不足。
0.5 要透过问题现象看本质
实验效果不好的原因,不能仅仅停留于表面,要不断深深入,直到找到最根本的原因。
1 CHIP2022-医疗因果实体关系抽取学术评测
1.0 时间安排
首先,已经要有一个明确的时间安排,并且
一定要坚持进度管理!
一定要坚持进度管理!
一定要坚持进度管理!
1.1 数据集分析
这里的数据集分析是对目标任务的数据进行一个简单统计,包括最长文本长度、关系或实体数目等,至于更加详细的关系抽取难点应该是在利用基本模型进行测试之后才能知道。
1.1.1 初步数据统计特征
- 最长文本长度:由于现在一般采用预训练微调策略,但是如BERT等预训练模型一般会有输入文本长度限制(如基本BERT限制512),因此需要统计最长文本长度,如果长度过长,需要采取一定策略解决,这次比赛中,我们采用截断的简单策略。
- 最靠后实体位置:这个也是为解决输入预训练模型文本长度过长而服务的,此处因为最靠后实体位置小于512,因此简单采用截断策略也不会对结果有太大影响。
- 关系实例信息:
- 总体数量:考虑是否存在长尾问题、小样本问题等
- 头尾实体前后反向数量:考虑头尾实体之间是否存在严格的先后顺序
- 跨越句子:这个可能涉及到按句子划分输入文本
1.1.2 格式化输入数据(难点1)
在本任务中,最明显也是最难的一个问题是关系2:条件关系是一个嵌套关系,格式为**(头实体,条件关系,(子头实体,因果关系,子尾实体)),而一般的关系抽取模型均基于三元组(头实体,关系,尾实体),因此在利用已有模型进行测试时,需要格式化输入数据,这里我们采用了多种划分策略进行测试,其中方案1的效果最好**。此外,输出数据也要进行组合才能提交到测试平台进行测试,我们采用与划分策略相对应的组合策略。
(头实体,条件关系,子头实体),(头实体,条件关系,子尾实体),(子头实体,因果关系,子尾实体)
(头实体,条件关系,子头实体),(头实体,因果关系,子尾实体)
(头实体,条件-原因关系,子头实体),(头实体,条件-结果关系,子尾实体),(子尾实体,因果关系,子尾实体)
此外,我们还尝试了对SpERT模型进行略微修改,然后直接输入多元组(头实体,子头实体,子尾实体,关系)。
对于如何格式化输入数据,其实是本任务的难点,可以考虑直接输入,也可以考虑划分策略。但是直接输入需要采用对应的模型,实验结果证明,直接在三元组模型上修改比较难取得较好的结果。
1.2 策略尝试
这是比赛的重中之重,我们查找了需要的网络资料与论文文章。
主要寻找到了一篇非常贴近任务的经验贴,链接见上。其中,对于这种刷榜比赛的经验可以说给了我们很多提示,特别是其中的关于比赛的主要步骤以及关于数据增强提分的部分,给了我们很大的帮助。
论文模型方面,我们尝试了来两类关系抽取的模型,Pipeline和联合抽取。虽然我们阅读了很多论文,但是一共只尝试了4个模型。但是总的来说有点少,主要还是因为不可避免的因素以及没有做好进度管理。主要进行尝试的模型如下,具体的模型介绍请阅读论文,此处不做过多描述:
在实验结果中,PL-Maker虽然是英文关系抽取的最新SOTA模型,但是在本任务中表现不佳,当然结果也可能受其他方面影响,比如在调整PL-Maker适应本任务的输入输出中,修改了原模型的损失函数以及评估指标。
其中,对于刷榜性竞赛,在自己的编码能力足够强时,可以将不同的模型进行堆砌,以得到更好效果的模型。
1.3 针对性解决问题(难点2)
在使用模型进行尝试后,可以基于模型在验证集上的结果,查看模型效果不好的原因,然后针对性解决问题。
比如在本次任务中,我们对条件关系多元组进行划分之后,仅仅关注到条件关系预测效果不好,就去尝试不同的划分策略以及模型,但是没有看到其根本原因是模型预测到的(头实体,条件关系,尾实体)(以方案1策略为准)很少,导致最终组合成完整条件关系后得到的预测条件关系也少。因此,如果可以早一点发现根本问题,就可能解决条件关系的预测问题。
在最后阶段,我们发现了这个问题,对SpERT进行了略微调整。将文本中条件关系附近的文本出现的字进行统计,共现次数多的字将会在条件关系的上下文信息中被强调,但是效果不太好,可能是因为受时间限制,实现方式过于简单。如果时间允许,可以尝试其他的强调策略以及引入触发词策略。
1.4 数据增强(难点3)
这是在刷榜性竞赛中非常重要的一个部分,一般可以将模型效果进行略微提升。
在上述提到的经验贴中,提到了许多的数据增强方法,在本任务中,由于时间限制(还是没有做好进度管理),我们仅仅尝试了伪标降噪。我们使用在标注数据集上训练好的模型,对未标注数据进行标注(置信度阈值设置为0.9),称为伪标数据,然后将标注数据与伪标数据进行融合,重新输入模型进行训练,效果得到了0.1左右的提升。
常用的数据增强方法有(来源上述经验贴):
词汇增强:即引入词汇信息,并适配于所对应的标注策略;这种词汇增强的方式常见于NER问题中,具体可参见《](https://zhuanlan.zhihu.com/p/142615620)[JayLou娄杰:中文NER的正确打开方式: 词汇增强方法总结 (从Lattice LSTM到FLAT)](https://zhuanlan.zhihu.com/p/142615620)[》](https://zhuanlan.zhihu.com/p/142615620)。这种方式的关键在于如何引入具体的知识库信息(实体信息);
对抗训练:聚焦于提高鲁棒性,已经成为NLP各大竞赛的提分利器、标配动作!常用的比如FGM、PGD等,具体可参见博客:Nicolas:【炼丹技巧】功守道:NLP中的对抗训练 + PyTorch实现。
远程监督:即将训练集中的三元组当作知识库,然后将其作为知识特征引入模型中。
解决标注不平衡 由于指针标注或多头标注中存在0-1不平衡问题(稀疏问题),可采取focal loss或者幂次惩罚。
假阴性降噪:通常的信息抽取数据集是通过远程监督+人工check构建的,指标通常会呈现出高准确、低召回的情况,对于这种情况,我们通常要清洗训练集中存在的“假阴性”问题,我们可以借鉴Postive Unlabel Learning的思想,通过交叉验证对训练集进行清洗&重训练,采取以下两种方式:
- 只对高频出现的三元组进行回标;
- 高频三元组进行loss计算;中频三元组不进行loss计算;低频drop;
伪标降噪:如果手头或者主办方能够提供无标注数据,我们可以进行伪标,但比较棘手的一个问题就是如何降噪,这里给出两种简单的方式:
- 通过置信度判别模型,通过阈值来过滤噪声样本;
- 通过交叉验证,通过投票过滤噪声样本;
交替训练:遵循联合抽取中“硬共享编码不一定奏效的思想”,我们可以对实体和关系两个子任务进行拆解,根据多任务学习中的交替训练机制进行。
1.5 最终实验结果
最终,在B榜数据上,我们与第一名相差0.8左右。