新冠疫情相似句对判定,快速匹配准确答案
共 4021字,需浏览 9分钟
·
2020-10-06 19:46
向AI转型的程序员都关注了这个号???
机器学习AI算法工程 公众号:datayx
面对疫情抗击,疫情知识问答应用得到普遍推广。如何通过自然语言技术将问答进行相似分类仍然是一个有价值的问题。如识别患者相似问题,有利于理解患者真正诉求,帮助快速匹配准确答案,提升患者获得感;归纳医生相似答案,有助于分析答案规范性,保证疫情期间问诊规范性,避免误诊。
达摩院联合医疗服务机构妙健康发布疫情相似句对判定任务。比赛整理近万条真实语境下疫情相关的肺炎、支原体肺炎、支气管炎、上呼吸道感染、肺结核、哮喘、胸膜炎、肺气肿、感冒、咳血等患者提问句对,要求选手通过自然语言处理技术识别相似的患者问题。成果将作为原子能力助力疫情智能问答应用技术精准度提升,探索下一代医疗智能问答技术,具有广泛的技术和公益价值。
代码及运行教程 获取:
关注微信公众号 datayx 然后回复 相似句 即可获取。
AI项目体验地址 https://loveai.tech
1. 算法说明
本解决方案使用了基于病名\药名的数据增强+模型融合+训练时-测试时增强+伪标签的解决方案
基于病名\药名的数据增强 Data augmentation
根据比赛组织方的信息,总共肺炎”、“支原体肺炎”、“支气管炎”、“上呼吸道感染”、“肺结核”、“哮喘”、“胸膜炎”、“肺气肿”、“感冒”、“咳血”十个病种,但是在train和dev数据集中仅仅出现了八个病种,其他的两个“肺结核”与“支气管炎”病种并没有出现,推测在test中包括了剩下的两个病种,是这次比赛的一个关键信息。
本次比赛需要模型学习的内容主要包括以下几个点:匹配语义信息,病名信息,药名信息,病理信息,我们需要针对这四个点来进行数据增强。
在测试集中,“肺结核”和“支气管炎”两个病种的测试数据中显然含有我们已有标注数据没有的病名、药名信息,但是这些信息是较为易得的;对于语义匹配信息和病理信息,1. 其生成难度要远远高于前两者,2.且很可能改变原数据集中的语义匹配和病理信息,出于这两点考虑,本解决方案采取了替换原数据中病名\药名的数据增强。
在实现过程中,挑选了病理与“肺结核”、“支气管炎”较为接近的“支原体肺炎”与“哮喘”标注数据中的部分样本,作病名替换,添加到原始标注数据中作为训练数据集。LB上升1.9个千分点(96.10->96.29)
模型融合 models fushion
本解决方案使用了ernie + bert_wwm_ext + roberta_large_pair的融合模型,对最后的结果使用平均值。具体的来源和下载地址见参考资料。提升2.5个千分点(95.75->96.10)
训练时-测试时增强 train-test time augmentation
本解决方案中,在预测时,首先用原测试集预测一遍标签;然后将原测试集的query1和query2字段交换,再次预测一遍;最后将两个结果相加作为最后的预测结果。出于训练时模型拟合方向的偏差考虑,在训练时也训练了两种模型,分别用于预测正序\逆序时的数据集,这一做法的提高非常稳定。
这样的技巧是为了让模型在学习\预测过程中看到数据的更多方面,结合数据中包含的边角信息。LB上升2个千分点(95.59->95.75)
注:这个地方的提升不仅是添加了train-test time augmentation, 另外考虑时间因素移除了pseudo_label, 故估计实际上升为2个千分点左右。
伪标签 pseudo label
在预测完成后,使用预测结果和原训练集一起作为新的训练集再次训练一个模型做预测。LB上升1个万分点(96.29->96.30)
主要提升的过程
题外话
基本没调参,roberta-large-pair稍微调了一下,但是毕竟dev不是特别可信... 中间一段时间(3.10~3.17)提升比较多,然后最后10天开始玩杂技,比较想通过数据增强来获得更多的提升,一直没有提升...毕竟猜到测试集里的语义匹配信息以及病例信息难度过高...最后2天幡然悔悟调了调参,dev上暴涨3个千分点,然后LB暴跌了3个千分点。。。还是头太铁了,调参绝非一日之功。
没有用K折的原因:因为使用train-test time augmentation已经6个模型了,太多了我心里过意不去也不好调,故放弃了K折,实际上我的train-test time augmentation也有一定的去随机性作用,其实可以考虑加个3折比较合适。
没有用fgm & pgd的原因:纯菜。看了大佬们的post后试了一下,pgd效果爆棚,已经在这个github里更新了这两个算法和相关的参数。
本人第一次打nlp的比赛,打过两次feature-based,都被吊打。。。奇淫技巧实在不会,所以在一开始的时候就把重心放在数据上,毕竟对新手比较友好,提升的机会更大。
由于数据集正负比例尚可,没有使用focal loss
实际上一直有考虑将病种信息编码并作为特征之一,但是考虑到存在OOV的病种,是一大问题。如果使用增强后(包含OOV病种的数据)数据,然后将类别信息编码为one-hot形式,然后与bert模型输出pool进行concat然后再dropout接fc也是思路之一,但是后面一段时间一直纠结数据去了。
尝试了特征工程,效果不是特别好。具体表现为,使用ernie得到的pool结果作为特征,在训练集上五折可以得到96+的oof acc,但是在验证集上仍然只有94左右的acc,严重不对齐,遂放弃。
尝试了使用textrank提取两个query中的keyword及其pr值,然后设计公式来使两个query的(keyword,pr)二元组列表交互来产生特征,效果也很一般。也尝试过一些其他chip2019 top1解决方案中的特征,都不太好。
尝试了将待预测数据中的病名替换为已知病名来进行增强,效果比较差。事实证明,病名与其病理之间存在较强联系。
尝试了根据已知标签比例修正logits转为标签的阈值,效果也不好。
尝试使用多轮伪标签,效果也不好。
尝试使用多次迭代的伪标签,每次使用预测信心最高的60%测试集样本加入训练集,效果更差。。。实际上根据测试,每次预测信心最高的60%测试样本的正确率为99+,基本相当于训练样本了。推测是因为加入大量同类型(简单)样本改变了数据集结构导致模型性能下滑。
尝试了将病种名直接拼接进问句对,效果很一般
尝试了将两个query中的最长公共子字符串去掉,效果下跌比较严重。
有一个想法是在预测时对测试数据进行pgd和fgm扰动(单纯扰动),感觉会有挺好的效果
通过判别模型来筛选增强数据
multidrop
通过kl散度来判别与原始分布的距离
阅读过本文的人还看了以下文章:
基于40万表格数据集TableBank,用MaskRCNN做表格检测
《深度学习入门:基于Python的理论与实现》高清中文PDF+源码
2019最新《PyTorch自然语言处理》英、中文版PDF+源码
《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码
PyTorch深度学习快速实战入门《pytorch-handbook》
【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》
李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材
【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类
如何利用全新的决策树集成级联结构gcForest做特征工程并打分?
Machine Learning Yearning 中文翻译稿
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程
不断更新资源
深度学习、机器学习、数据分析、python
搜索公众号添加: datayx
机大数据技术与机器学习工程
搜索公众号添加: datanlp
长按图片,识别二维码