Skip to content

WenRichard/DIAC2019-Adversarial-Attack-Share

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 

Repository files navigation

DIAC2019-Adversarial-Attack-Share

目录

  • 比赛背景
  • 数据
  • 评价指标
  • 资料区
  • Trick区
  • 完整思路区
  • 疑惑区
  • Top N 解决方案

如何准确的判别用户的输入是否为给定问题的语义等价问法 是比较有意思的任务,也具有很大的挑战性,感谢主办方提供这一赛道!比赛前期也有参与,个人主要将一些比较传统的模型进行实验对比,但是成绩并不理想(不过80),再加上计算资源紧缺,也就放弃了。相比于传统ESIM模型,裸BERT-Base就可以到86分左右。因此,目前看来,BERT算是一个起跑线了,哭瞎,贫穷的孩子不配玩比赛啊 TT 。引用张俊林老师一句话,快0202年了,放弃幻想,全面拥抱BERT吧。

声明:
本项目主要搬运大佬们的前排解决方案,真的非常感谢 沐鑫hanyan大白pengbo 等大佬们的无私分享!非常感谢!非常感谢!


比赛背景

虽然近年来智能对话系统取得了长足的进展,但是针对专业性较强的问答系统(如法律、政务等),如何准确的判别用户的输入是否为给定问题的语义等价问法仍然是智能问答系统的关键。举例而言,“市政府管辖哪些部门?”“哪些部门受到市政府的管辖?” 可以认为是语义上等价的问题,而 “市政府管辖哪些部门?”“市长管辖哪些部门?” 则为不等价的问题。

针对问题等价性判别而言,除去系统的准确性外,系统的鲁棒性也是很重要、但常常被忽略的一点需求。举例而言,虽然深度神经网络模型在给定的训练集和测试集上常常可以达到满意的准确度,但是对测试集合的稍微改变(Adversarial Attack)就可能导致整体准确度的大幅度下降。

如以下样例:

origin example -adversarial example
检察机关提起公益诉讼是什么意思 监察机关提起公益诉讼是什么意思
检察机关提起公益诉讼是什么意思 检察机关发起公益诉讼是什么意思
寻衅滋事一般会怎么处理 寻衅兹事一般会怎么处理
什么是公益诉讼 请问什么是公益诉讼

右列数据是左列数据出现一些错别字或者添加一些无意义的干扰词产生的,并不影响原句的意思,但是这样的微小改动可能会导致完全不同结果。从用户的角度而言,这意味着稍有不同的输入就可能得到完全不一样的结果,从而严重降低用户的产品使用体验。


数据

1. 数据详情

本次大赛提供的是一个 法律领域 的问句等价性数据集,该数据集为我们在实际项目中开发系统所使用的数据集。除去该数据集外,参赛选手可以使用数据增强后的数据集或从其他渠道获得的无等价性标注的数据集。 参赛选手不得使用人工进行标注的数据。

训练集根据在实际项目中的数据情况,以问题组的形式提供,每组问句又分为等价部分和不等价部分,等价问句之间互相组合可以生成正样本,等价问句和不等价问句之间互相组合可以生成负样本。我们提供 6000组问句 的训练集, 每组平均有三个等价问句和3个不等价问句 。验证集和测试集则以问句对的格式提供,其中验证集有5000条数据。测试集中除了人工标注的样本外,还会有大量adversarial example。

训练集用于模型的学习,比赛期间选手可以提交验证集的预测结果,但最终成绩由测试集的预测结果决定,由于 测试集中会有大量adversarial example ,因此最终在测试集上的成绩可能会与验证集上不同。(测试集将于比赛结束前24小时发布,具体可参考时间轴页面。)

训练数据集: DIAC2019 , 提取码:ayvx
测试集: 抽样样例, 提取码:k4im

2. 数据格式

train_set.xml
训练集以XML文件提供,用于训练模型。XML文件中内容格式如下:
训练集

每一个Questions标签中为一组数据,其中EquivalenceQuestions标签内的问句之间互为等价关系,NotEquivalenceQuestions标签内的问句与EquivalenceQuestions为不等价关系。EquivalenceQuestions之间的问句互相组合可以生成正样本(label为1),EquivalenceQuestions和NotEquivalenceQuestions之间的问句互相组合可以生成负样本(label为0),具体需要生成多少正样本多少负样本由参赛选手自行决定。

dev.set.csv
验证集数据格式如下:
验证集


评价指标

本次比赛的评测标准为 Macro F1 值。Macro F1等于每个类别的F1的均值。
Macro F1 = (F1_正样本 + F1_负样本) / 2


资料区


Trick区

A榜Trick汇总

  1. 对抗训练 + fgm + epsilon 1e-6
  2. ZEN模型,score: 89.04
  3. test 数据输入 neo4j 就会发现神奇的图特征 leak
  4. 一种很差的leak,dev_set中,a-b b-c ,像这种左右(即b)都只出现一次的,a,b,c之间都是等价的,那其他和a、b、c在一起的都不是等价的
  5. 对付这种不平衡样本,用凯明大神的focal loss, focal loss直接把正样本召回率拉起来,6fold+focal loss,score为92+;单fold,score只能到91
  6. 去掉dropout也有提升
  7. focal loss的gamma和alpha取多少合适? (gamma2,alpha 1)效果较好,gamma1和4都不好,别的没试过, alpha设为1保留疑问
  8. 蒸馏学习,单模,score:91

B榜Trick汇总

  1. 关于测试集抽样样例: 用一个单模简单测了一下测试集抽样样例,20条正常样本(问题A + 问题B)准确率100%,20条对抗样本(问题A + 问题B')错了7条,准确率65%,整体准确率82.5%。模型对对抗攻击样本保持标签不变的误判较多。10条保持label不变的对抗样本错4条,另10条label改变的样本错3条;另一个模型对抗样本错误分别是6条和3条。建议关注如何增强模型对句子中词同义替换、错别字攻击后保持标签不变这种情况的判别鲁棒性。
  2. bert做特征初始化,把bert向量静态化(通过三元组共享权重,训练后的向量可以起个名字叫向量空间静态化,像word2vec,但效果比word2vec好)可以用聚类或分类

数据预处理Trick汇总

1. Pycorrector
直接使用pycorrector当做数据增强用,扩展正例数据,比正反翻译收益好很多。正反翻译引入噪声太多,pycorrector修正后数据参与训练扰动很小。pycorrector的纠错能力并不好,造成在推理的时候纠错,性能下降,纠错能力不好反过来可以作为数据增强使用,毕竟只改了里面几个字,不会直接影响句子的意思。

2. Contributor[B榜,单模为0.76左右]
以下数据预处理code

方案一
original sentence pairs:[q11, q21, label]
augment sentence pairs:[q11, q21, q12, q22, label]
用A,B,C等替换句子对中相同的名词和代词,不替换动词,因为替换动词会破坏句子结构,得到q12,q22
【samples】:
q11:大气污染的为害有哪些?
q21:大气污染会产生什么危害?
q12:A的为害有哪些?
q22:A会产生什么危害?

方案二
original sentence pairs:[q11, q21, label]
augment sentence pairs:[q11, q21, q12, q22, q3, label]
q12:q11的词与q21的词的差集;q22:q21的词与q11的词的差集;q3:q11的词与q21的词的交集
【samples】:
q11:消费者投诉举报电话是多少?
q21:消费者协会电话你知道是多少吗?
q12:投诉|举报电话?|
q22:协会|电话|
q3:消费者|


完整思路区(赛前)

A榜思路汇总

思路1: 对应trick 1,2
模型:用chinese-wwm-ext-base
郭大代码:https://github.com/guoday/CCF-BDCI-Sentiment-Analysis-Baseline
加入对抗:代码比较简单加入5行就行,大家可以参考:http://fyubang.com/2019/10/15/adversarial-train/

思路2: score: 89.04
zen模型,中文n-gram:https://github.com/sinovation/ZEN ,中文n-gram
只是用来学习,大佬可以试试,没有调到90,到时可以通知一下,相互学习

思路3: score: 91
图解2018年领先的两大NLP模型:BERT和ELMo这篇文章采用多层cls分类,验证过的单折91,这代码很像bert出来前一个很流行的框架compare-aggregate

思路4: score: 90.8
纯BERT+large模型 有数据增强,例如pingyin,同义词替换,随机插入等部分。5-Fold 90.8

B榜思路汇总

思路1:
先进行文本纠错,然后使用三元组triplet loss进行训练,模型进行权重共享,计算余弦相似度并设定相应margin阈值输出结果。但是pycorrector的纠错效果有点惨,目前是有错再纠,只要拼音,句子长度相同的,可能会好点;另一个思路可以用纠错样本作为对抗样本,但是也是需要人为去判断,比较麻烦。


疑惑区

  1. 比赛数据中的leak到底是啥?期待比赛结束后大佬们的解释
  2. 测试集两个句子颠倒顺序放到模型里预测会有很大差别;颠倒顺序训练就没差别,不颠倒顺序训练差别就很大;但是颠倒顺序训练的效果没有不随机颠倒好??

Top N 解决方案

Rank version1 version2 Model Source
5 python 3.7 pytorch 1.3.1 bert+fgm (roberta) DIAC2019-DQD-Based-on-Adversarial-Attack
6 - - bert Adversarial Attack的问题等价性判别比赛第6分享

留言请在Issues或者email [email protected]

About

DIAC2019基于Adversarial Attack的问题等价性判别比赛

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published