作者:DOTA

好久不打比赛,周末看到“全球人工智能技术创新大赛”已经开打了一段时间,前排分数冲的有点凶,技痒的我看到了一道熟悉的赛题——小布助手对话短文本语义匹配,由于在搜索推荐系统的一些任重中,文本语义匹配子任务也是经常会遇到的一个问题,于是乎掏出那根...咳咳..沉睡了很久的GPU,翻出了祖传代码,跑了一波Baseline...

赛题题型不新鲜,在Baseline的的基础上参考了一些思路做些炼丹技巧上的操作,3次提交之后顺利冲进排行榜首页。针对短文本语义匹配,本文帮大家梳理一波方案技巧。

P.S. 发稿之前,看了一眼排行榜,分数已经被大家刷上去了,参加人数还蛮多,有兴趣的同学可以去战一波...

赛题背景

意图识别是对话系统中的一个核心任务,而对话短文本语义匹配是意图识别的主流算法方案之一。本赛题要求参赛队伍根据脱敏后的短文本query-pair,预测它们是否属于同一语义,提交的结果按照指定的评价指标使用在线评测数据进行评测和排名,得分最优者获胜。

数据及评估指标

数据

训练数据包含输入query-pair,以及对应的真值。初赛训练样本10万,复赛训练样本30万,这份数据主要用于参赛队伍训练模型,为确保数据的高质量,每一个样本的真值都有进行人工标注校验。每行为一个训练样本,由query-pair和真值组成,每行格式如下:

  • query-pair格式:query以中文为主,中间可能带有少量英文单词(如英文缩写、品牌词、设备型号等),采用UTF-8编码,未分词,两个query之间使用\t分割。

  • 真值:真值可为0或1,其中1代表query-pair语义相匹配,0则代表不匹配,真值与query-pair之间也用\t分割。

评估标准

比赛的评估标准由性能标准和效果标准两部分组成,初赛采用效果标准,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,便是这份高效利用自己时间的体现,简单、有效、奥卡姆剃刀...

参考资料

  • https://tianchi.aliyun.com/notebook-ai/detail?postId=101624

  • https://tianchi.aliyun.com/notebook-ai/detail?postId=102057

  • https://kexue.fm/archives/8213

  • https://kexue.fm/archives/7234

  • kaggle竞赛宝典 系列文章


往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑
本站qq群851320808,加入微信群请扫码:

【NLP】ALL in BERT:一套操作冲进排行榜首页相关推荐

  1. ALL in BERT:一套操作冲进排行榜首页

    好久不打比赛,周末看到"全球人工智能技术创新大赛"已经开打了一段时间,前排分数冲的有点凶,技痒的我看到了一道熟悉的赛题--小布助手对话短文本语义匹配,由于在搜索推荐系统的一些任重中 ...

  2. NLP新秀:BERT的优雅解读

    恰逢春节假期,研究了一下BERT.作为2018年自然语言处理领域的新秀,BERT做到了过去几年NLP重大进展的集大成,一出场就技惊四座碾压竞争对手,刷新了11项NLP测试的最高纪录,甚至超越了人类的表 ...

  3. 【NLP】Google BERT详解

    版权声明:博文千万条,版权第一条.转载不规范,博主两行泪 https://blog.csdn.net/qq_39521554/article/details/83062188 </div> ...

  4. NLP突破性成果 BERT 模型详细解读 bert参数微调

    https://zhuanlan.zhihu.com/p/46997268 NLP突破性成果 BERT 模型详细解读 章鱼小丸子 不懂算法的产品经理不是好的程序员 ​关注她 82 人赞了该文章 Goo ...

  5. 韩国小哥哥用Pytorch实现谷歌最强NLP预训练模型BERT | 代码

    乾明 编译整理自 GitHub  量子位 报道 | 公众号 QbitAI 新鲜代码,还热乎着呢. 前几天,谷歌发布了一篇论文,介绍了一个超强的NLP预训练模型BERT. 不仅在SQuAD中摧枯拉朽,全 ...

  6. 一张图带走一套操作 分享最新网络营销学习路线图-千锋

    一张图带走一套操作 分享最新网络营销学习路线图-千锋 学习网络营销,进入互联网行业是一个不错的选择,但是,有很多新手自学网络营销时,根本不知道从哪儿入手学习,怎么系统性地学习.网络营销岗位的薪资高.就 ...

  7. 【NLP笔记】Bert浅析

    作者:20届 ERIC 写在前面:本人刚刚入门NLP,希望通过记录博客来巩固自己的知识,增进对知识的理解. 在之前的博客,我们进行了CRF的原理探寻以及借助CRF工具包实现各类序列标注任务,如中文分词 ...

  8. win8修改炉石服务器,炉石传说:新的炸服者出现了,这套操作下来就可以成功让炉石服务器成功崩溃...

    原标题:炉石传说:新的炸服者出现了,这套操作下来就可以成功让炉石服务器成功崩溃 最近炉石传说的福利还是很给力的啊,先是登陆送5个卡包,随后就是送竞技场门票加一个200金币的传说任务,然后,乱斗一开两个 ...

  9. 【NLP】中文BERT上分新技巧,多粒度信息来帮忙

    文 | ???????????????? 自然语言处理实在是太难啦!中文尤其难! 相比于英文,中文是以词作为语义的基本单位的,因此传统的中文 NLP 都需要先进行分词.分词这步就劝退了很多人,比如&q ...

最新文章

  1. 5,ORM组件XCode(动手)
  2. Docker的使用(五:Docker中的网络与数据管理)
  3. 也议GetLastKnownLocation!!(独家理解)
  4. 【Python植物大战僵尸军团来袭】“大家快醒一醒、一大波僵尸来了”
  5. 3高并发服务器:多路IO之epoll
  6. java中队列的类是什么意思_java中LinkedList集合类实现栈和队列要注意什么?
  7. 从FTP下载文件带进度条
  8. 三种水平居中布局~详细
  9. ACL访问控制 getfacl 、setfacl 命令
  10. IT软件开发人员必去的10个社区
  11. Vivado HLS教程
  12. Java +Vue 实现滑动拼图验证码(Java篇 )
  13. 笔记本vmware利用无线网卡上网设置
  14. 《Linux内核 学习笔记》--- 第二章 内存管理 2.9 mmap
  15. Unity-使用UPR资源检测工具AssetChecker-Win进行本地资源检测
  16. 荣耀轻薄本MagicBook 14使用体验分享 性能拉满续航无敌
  17. 几种简单的文本数据预处理方法
  18. C 递归 详解(通俗易懂)
  19. Windows:直接使用命令运行一个程序
  20. ipqc的工作流程图_品质部各人员工作流程图

热门文章

  1. StandardContext
  2. 馒头,国庆节快乐啊!!~~~!
  3. vue城市三级联动组件 vue-area-linkage
  4. 我就是我,不一样的browser
  5. PLSQL 的简单命令之四
  6. 《ASCE1885的信息安全》の使用Crypto++的MD5算法对字符串进行哈希
  7. 超全荧光定量PCR应用常见问题
  8. kylin源码调试_Apache Kylin 命令注入漏洞调试分析(CVE-2020-1956)
  9. python处理字符_常用python字符串处理
  10. windows下的守护进程C++