Home

Awesome

nCoV-2019 sentence similarity

比赛地址

https://tianchi.aliyun.com/competition/entrance/231776/introduction

竞赛题目

比赛主打疫情相关的呼吸领域的真实数据积累,数据粒度更加细化,判定难度相比多科室文本相似度匹配更高,同时问答数据也更具时效性。本着宁缺毋滥的原则,问题的场地限制在20字以内,形成相对规范的句对。要求选手通过自然语义算法和医学知识识别相似问答和无关的问题。

竞赛数据

本次大赛数据包括:脱敏之后的医疗问题数据对和标注数据。医疗问题涉及“肺炎”、“支原体肺炎”、“支气管炎”、“上呼吸道感染”、“肺结核”、“哮喘”、“胸膜炎”、“肺气肿”、“感冒”、“咳血”等10个病种。

数据共包含train.csv、dev.csv、test.csv三个文件,其中给参赛选手的文件包含训练集train.csv和验证集dev.csv,测试集test.csv 对参赛选手不可见。

每一条数据由Id, Category,Query1,Query2,Label构成,分别表示问题编号、类别、问句1、问句2、标签。Label表示问句之间的语义是否相同,若相同,标为1,若不相同,标为0。其中,训练集、验证集Label已知,测试集Label未知。

示例 编号:0 类别:肺炎 问句1:肺部发炎是什么原因引起的? 问句2:肺部发炎是什么引起的 标签:1

编号:1 类别:肺炎 问句1:肺部发炎是什么原因引起的? 问句2:肺部炎症有什么症状 标签:0

提交说明

提交说明

参赛者提交的模型在运行后针对测试数据需生成result.csv 文件。

格式如下:

id,label 0,1 1,0 2,1

具体格式请见test示例。

评估指标

选手检验出的结果和标准答案对比。

本次比赛测评指标为准确率,计算公式为:

准确率 = 正确预测数目 / 总问题对数目

解决方案

预训练模型

RoBERTa-large-pair 大句子对模型

参数量 290M

存储大小 1.20G

语料 CLUECorpus2020

下载地址:https://github.com/CLUEbenchmark/CLUEPretrainedModels

训练数据

模型训练 (5 fold, 5epochs)

模型得分

model_0model_1model_2得分
1000.9545
0100.9583
0010.9585
0.20.40.40.9609
0.10.60.30.9616
0.10.50.40.9625
0.10.40.50.961

选择最高得分的权重进行预测

依赖环境

代码复现

运行main.sh即可# nCoV-2019-sentence-similarity

前排大佬解决方案

Rank1:

小模型同时加入CHIP2019数据训练

模型特点权重加入外部句对数据
BERT-wwm-ext全词Mask1YES
Ernie-1.0对词、实体及实体关系建模1YES
RoBERTa-large-pair面向相似性或句子对任务优化1NO

img

img

Rank2:

img

模型原始数据增强数据(外部数据)增强数据(传递性)增强数据(新类别)
ERNIEyesnoyesyes
Roberta_large_pairyesyesyesyes
Roberta_largeyesyesyesno

在医疗文本相似度任务中,交换两个文本的数据不会改变该文本对的标签。但是对于Bert来说,交换文本对的位置,会改变位置编码,能使模型从不同的角度取观察这两个文本的相似性。在测试数据增强时,通过计算原始文本对与交换文本对的输出概率的平均值,能够使模型更好地在测试数据上的进行预测。

Rank3:

  1. 通过相似性传递增强数据

img

  1. 采用对抗训练
query 1query 2label(true)label(fgm)label(none)
腰和后背疼是胸膜炎吗?腰和后背疼是胸膜炎的症状吗?001
右下肺部感染是肺炎吗?又下肺部感染是肺炎不是110
23价肺炎有必要打吗23价肺炎有什么作用001
  1. 组间投票再投票的融合方式

img

Rank4_1:

RoBERTa-large,将最后一层的进行平均池化操作并与[cls]进行拼接。在训练时采用对抗训练(PGD)增强语义信息。

def forward(self, input_ids, input_masks, segment_ids):`
	sequence_output, pooler_output, hidden_states = self.bert_model(input_ids=input_ids,  token_type_ids=segment_ids,attention_mask=input_masks)`
    seq_avg = torch.mean(sequence_output, dim=1)`
    concat_out = torch.cat((seq_avg, pooler_output), dim=1)`
    logit = self.classifier(concat_out)`
    return logit

Rank4_2

1.OOV病种数据增强

在本次比赛中,我们需要模型学习哪些信息?我们如何让模型获得OOV病种的这些信息? 在本解决方案中,认为模型需要学习以下四种信息:

img

2.训练时-测试时交换增强

img

3.模型融合与伪标签

本解决方案同样使用了一些数据比赛的常用方法:模型融合和伪标签

Rank6_1

Rank6_2

有效的trick 1.预训练模型的选择上,Roberta_wwm_large、UER线下实验效果最好 -> https://github.com/ymcui/Chinese-BERT-wwm、https://github.com/dbiir/UER-py

2.通过相似传递进行数据增强(正负采样:A-B相似、A-C相似 -> B-C相似)¶ 3.对抗训练,提升模型鲁棒性 -> https://zhuanlan.zhihu.com/p/91269728

4.Label-Smoothing 标签平滑(微小提升) 5.加权融合(自定义search函数寻找最优的融合权重) 6.自蒸馏(没有明显提升) 7.实体替换增强(没有明显提升)