全球人工智能技术创新大赛短文本语义匹配方案技巧

好久不打比赛,周末看到“全球人工智能技术创新大赛”已经开打了一段时间,前排分数冲的有点凶,技痒的我看到了一道熟悉的赛题——小布助手对话短文本语义匹配,由于在搜索推荐系统的一些任重中,文本语义匹配子任务也是经常会遇到的一个问题,于是乎掏出那根...咳咳..沉睡了很久的gpu,翻出了祖传代码,跑了一波baseline...
赛题题型不新鲜,在baseline的的基础上参考了一些思路做些炼丹技巧上的操作,3次提交之后顺利冲进排行榜首页。针对短文本语义匹配,本文帮大家梳理一波方案技巧。
p.s. 发稿之前,看了一眼排行榜,分数已经被大家刷上去了,参加人数还蛮多,有兴趣的同学可以去战一波...
赛题背景
意图识别是对话系统中的一个核心任务,而对话短文本语义匹配是意图识别的主流算法方案之一。本赛题要求参赛队伍根据脱敏后的短文本query-pair,预测它们是否属于同一语义,提交的结果按照指定的评价指标使用在线评测数据进行评测和排名,得分最优者获胜。
数据及评估指标  
数据
训练数据包含输入query-pair,以及对应的真值。初赛训练样本10万,复赛训练样本30万,这份数据主要用于参赛队伍训练模型,为确保数据的高质量,每一个样本的真值都有进行人工标注校验。每行为一个训练样本,由query-pair和真值组成,每行格式如下:
query-pair格式:query以中文为主,中间可能带有少量英文单词(如英文缩写、品牌词、设备型号等),采用utf-8编码,未分词,两个query之间使用 分割。
真值:真值可为0或1,其中1代表query-pair语义相匹配,0则代表不匹配,真值与query-pair之间也用 分割。
评估标准 
比赛的评估标准由性能标准和效果标准两部分组成,初赛采用效果标准,auc 指标,具体定义如下:
其中:
rank(i):表示i这个样本的预测得分在测试集中的排序;
m:测试集中语义匹配的样本的个数;
n:测试集中语义不匹配的样本的个数。
解决方案与技巧 
在bert横行的时代,解决方案大同小异,直接梭哈bert的性价比是很高的,当所有人都会使用这套操作时,你又该怎么办呢?首先针对此类问题,分享一波炼丹小技巧。由于本赛题开赛前,将文本替换成了加密形式,有些技巧可能无法使用,但不影响学习。
数据增强
1. 标签传递
根据if a=b and a =c then b=c 的规则,对正样本做了扩充增强。
根据if a=b and a!=c then b!=c的规则,对负样本做了扩充增强。
2. 随机删除,随机替换, 随机交换
query比较短,大约有10-20个字的长度,随机删除部分。
很多query仅仅相差一个单词, 随机替换部分。
多数属于问句, 随机交换部分。
3. 同义词替换
建模思路
第一个baseline我沿用了之前计算相似度的方式对问题就行了求解,也做了模型线上的第一次提交,线上0.88的水平。具体思路如下:
1. sif sentence embedding
sif sentence embedding 使用预训练好的词向量,使用加权平均的方法,对句子中所有词对应的词向量进行计算,得到整个句子的embedding向量。
sif的计算分为两步:
对句子中的每个词向量,乘以一个独特的权重b,权重b是一个常数 a除以a与该词频率的和,这种做法的会对出现频率高词进行降权,也就是说出现频次越高,其权重也就越小;
计算句向量矩阵的第一主成分u,让每个sentence embedding减去它在u上的投影;
这里,利用该方法做召回,在验证集上的准确性要比其他两种方式效果好。
对句子中所有单词求平均得到sentence embedding;
对句子中所有单词利用idf值加权后求平均得到sentence embedding。
2. infersent
infersent相似度模型是facebook提出了一种通过不同的encoder得到sentence embedding,然后计算两个sentence embedding的差值、点乘得到交互向量,计算两者之间的相似度。
这里,对原始论文方法做了两处修改:其一是针对这个问题对3-way softmax层(entailment,contradiction,neutral)做了相应的修改变为2-way softmax;其二是中间层去掉了u和v,只使用差值和内积两种特征表征方式;同时在7中编码器:1)lstm, 2)gru, 3)bi-gru, 4)bi-lstm(mean pooling), 5)bi-lstm(max pooling), 6)self-attention, 7)cnn 中选用了bi-lstm maxpooling的方式。
开源方案
本赛题苏剑林开源了一套方案,这套方案让脱敏数据,也能使用bert。脱敏数据对于bert来说,其实就是embedding层不一样而已,其他层还是很有价值的。所以重用bert主要还是通过预训练重新对齐embedding层。
在这个过程中,初始化很重要。首先,我们把bert的embedding层中的[unk]、[cls]、[sep]等特殊标记拿出来,这部分不变;然后,我们分别统计密文数据和明文数据的字频,明文数据指的是任意的开源通用语料,不一定要密文数据对应的明文数据;接着按照频率简单对齐明文字表和密文字表。这样一来,我们就可以按照明文的字来取出bert的embedding层来作为相应的初始化。
简单来说,就是苏剑林用最高频的明文字对应的bert embedding,来初始化最高频的密文字,依此类推来做一个基本的字表对齐。对比实验表明,这个操作可以明显加快模型的收敛速度。
我的第2次提交是对该方案增加了fgm部分进行了提交测试,因为fgm带了百一的得分收益,线上0.87+的水平,跟苏兄开源时公布的0.86+得分相对一致。
fgm对抗训练
上面提到了fgm的对抗训练,其实也算是一个炼丹小技巧,这里做一下见到介绍。
对抗训练(adversarial training),顾名思义,就是在训练过程中产生一些攻击样本,早期是fgsm和i-fgsm攻击,目前当前最优的攻击手段是pgd。对抗训练,相当于是加了一层正则化,给神经网络的随机梯度优化限制了一个李普希茨的约束。
传统上认为,这个训练方式会牺牲掉一定的测试精度,因为卷积模型关注局部特性,会学到一些敏感于扰动的特征,对抗训练是一种去伪存真的过程,这是目前像素识别的视觉算法的局限性。这里苏建林在kexue.fm里实现是很简单的,详情参看引用链接。
总结
最后,第3次提交将前两次的提交的结果,做了一个简单的线性融合,线上到了当时排行榜的首页,ensemble的方式其实很多,由于时间的关系并没去堆很多模型,对此感兴趣的同学,可以去看一下《kaggle竞赛宝典》的系列文章。
比赛结束还有一段时间,感兴趣的同学可以去尝试一波。数据竞赛作为一种保持竞技状态(战斗状态)的一种方式,在工作中直接应用的层面的可能很少,但是它能带给选手的更多是一种对问题的深层次思考,一种解决问题的实战训练能力,如果你有时间,不妨一试。这次全球人工智能技术创新大赛是清华大学刘强老师负责跟的,刘老师的负责态度和对选手的正面鼓励,我想很多接触过的人都会印象深刻。哈哈哈,依稀的记得2017年首次参赛,刘老师送的清华大学百年纪念邮票。
工作之后,时间会过很快,考虑更多的可能是做一件事是否能有结果,考虑的事情多了,也就没有了当年肝肝肝的勇气。偶尔回到赛场提醒一下自己,怀念一下过去....all in bert,便是这份高效利用自己时间的体现,简单、有效、奥卡姆剃刀...
原文标题:【比赛经验】all in bert:一套操作冲进排行榜首页
文章出处:【微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。


MIPS收购或将推进处理器大融合
飞腾助力关键行业信创与数字化转型融合发展
魅族pro7真机谍照及配置大曝光,将采用Helio X30处理器?
基于FPGA的AFDX终端系统模块设计
科创板西部超导董事巨建辉介绍、履历信息
全球人工智能技术创新大赛短文本语义匹配方案技巧
机智云设备管理平台通过与华为云鲲鹏云服务兼容认证
山东济南一年淘汰30万组的铅酸电池 电动车能环保吗?
PLC应用系统设计的项目分析,硬件选型,编程要点和程序调试方法的概述
利用Ultimaker S3开发自动送货机器人,解决物流最后一英里问题
在CAM350中进行拼片处理
网管型交换机比普通交换机有哪些明显优势
特斯拉对第三方置换服务正式进行升级
在MAX-IDE中自动初始化数据段值
如何实现高速PCB的设计
应用在现代无人船技术中的水质传感器
三星S8/S8+今晚登场 所有消息都曝光价格留悬念?
真正的0月租! 小米电话卡收货开封
凯氏定氮仪的作用是什么,它都有哪些用途
关于AI机器人搭建