每天给你送来NLP技术干货!


作者 | 周俊贤

整理 | NewBeeNLP

这篇跟大家讨论相关的技术,主要包括BERT-avg、BERT-Whitening、SBERT、SimCES四个。

为了方便,还是从狭义的语义匹配的场景出发,输入一对句子,输出这对句子相似性(回归,0~1)。

BERT-avg

BERT-avg做法很简单,「直接拿预训练后的预训练模型来做相似度匹配」,因为默认经过预训练后的模型含有知识,能够编码句子的语义。

但假如不经过fine-tuning的话,不能单纯把它们拼接起来作为输入,而是两个句子要分别输入BERT模型。具体的,我们可以采用

  • CLS token的的最后一层embedding计算余弦相似度;

  • 最后一层序列的输出求平均,再求余弦相似度(通常,做分类的时候,通常求max效果会较好,做语义的时候求mean效果较好);

  • 把第一层和最后一层的输出加起来后做平均(有研究表明开始几层,主要蕴含词汇信息,靠任务的层主要蕴含语义信息,把它们拼接起来,让两种信息得到融合)。

但实质上,这种效果并不好。原因在于「各向异性」

什么叫各向异性?这里引入知乎某答主的回答。

我理解的是输出的每个token是768维的(即向量空间的基向量由768个768维的向量组成),embedding的数值取决于当前选的坐标系,假如当前坐标系非标准正交基,则会出现空间上是正交的向量(空间正交不依赖于坐标系,无论你取哪个作为基底,在空间中它们就是正交),但在该坐标系下计算出的投影不为0。

BERT-Whitening

论文全称:《Whitening Sentence Representations for Better Semantics and Faster Retrieval》

项目代码:https://github.com/bojone/BERT-whitening

解决各向异性有BERT-flow、BERT-Whitening等方法,它们的目标都是通过基底变换,把当前的坐标系变换到标准正交基。其中BERT-Whitening尤为简单,「本质上就是对语料数据求特征值分解,从而达到把当前坐标系变换到标准正交基的目的」

特征值分解的好处还在于能降维,大家想想PCA的原理,假如目前是768维的向量空间,经过正交标准变换后,有一些方向的特征值是很小的,可以把这些维度抛弃,达到节约存储空间,提高计算效率的目的。

上图为步骤,把当前任务的语料,分别一句句地输入到预训练模型中得到各自的embedding,然后对embeddings做特征值分解,得到变换矩阵,然后存起来。应用时,输入新的句子,把它们输入预训练模型,得到句子embedding,再用存起来的变换矩阵u和W做变换,这时候得到的embedding就是标准正交基表示的embedding。

SimCSE

论文全称:《SimCSE: Simple Contrastive Learning of Sentence Embeddings》

项目代码:https://github.com/princeton-nlp/SimCSE

上面提到的BERT-avg和BERT-whitening都是无监督的方法,这里提到的SimCSE有无监督和有监督两种模式,其中的无监督模式是当前无监督的SOTA方法。

SimCSE的核心思想是当前较火的对比学习,如下图所示。

  • 无监督学习:如上图左,同一个句子输入模型两次,由于有dropout随机性影响,两次的输出不一样。「当dropout较小时,可以认为两个输出的embedding语义是相似的」。借鉴这种思想,训练目标就很简单了,例如一个batch里面有16个句子,其中每个句子分别输入模型两次,得到和,其中同一个句子的输出是相似的,即是相似的,拉近它们的余弦距离,而和是不一样的语义,目标是拉大它们之间的距离,训练函数如下:

  • 有监督学习:如上图右,不同于无监督学习通过dropout制作语义相同的句子对,论文中的有监督学习用的是NLI数据集,NLI数据集,针对推理前提(primise)与推理假设(hypothesis)之间是否存在逻辑关系,人工标注了三种标签entailment蕴含、contradiction矛盾、neutral中立,如下图为一些示例展示

    本来NLI的任务是输入一个句子对,输出它们的label是【entailment、contradiction、neutral】中的一个。SimCSE里作了点小改动,label为entailment的句子对作为语义相近的样本,目标拉近它们的余弦距离,而label为contradiction的句子对则作为语义不同的句子,要拉远它们的距离。损失函数如下

  • 这里再介绍一下论文里重要的一些细节:

  • dropout效果是最好的:无监督训练时,除了用dropout生成语义相同的句子对,论文里还采用过如

    等等,最后发现dropout效果是最好的,而且最容易实现。

    • Crop:随机删掉一段span

    • Word deletion:随机删除词

    • MLM:用BERT预训练任务之一,用一些随机token或【MASK】token代替原序列的某些token

  • 解决各向异性:论文里一章数据证明了对比学习的目标能有效平滑(论文里叫flatten)句子embedding矩阵的特征值分布。

    从线性代数的角度讲,特征值分布不均匀,代表这个矩阵所表示的线性变换在某些方向上变化大,某些方向上变化小,导致各向异性,而平滑特征值可以使得这个线性变换在各个方向的变化均匀化,有效减缓各向异性。

    Pooling策略:以往的经验,编码句子embedding时最好用最后一层的输出求平均,或第一层加最后一层的输出求平均,但论文里发现,用CLS token最后一层的输出作为embedding效果差不多,所以论文里采用这种CLS,毕竟较为简单;

    uniformity and alignment:

    从下图可以看出,训练完的SimCSE无论是uniformity和alignment都表现不俗。

    • alignment表示对齐,则语义相同的句子在句子embedding的向量空间中已经方向相同,

    • uniformity即均匀性,表示不同句子在句子embedding的向量空间中应该尽可能分布均匀。

SBERT

论文全称:《Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks》

项目代码:https://github.com/UKPLab/sentence-transformers

SBERT是近年工业上应用很广泛的方法,思想很简单,就是如上图左边得双塔模型,有的地方称为Siamese network(孪生网络)和Bi-Encoder。

有的朋友会疑问,这几年句子相似度的算法竞赛,发现都没见到这种双塔模型的身影,常常是上图右边这种Cross-Encoder的结构。原因是,双塔模型相对Cross-Encoder结构效是稍差的,但落到工业应用上,它的优点就是快很多!

很简单,回想上一篇博客检索式机器人的场景,假设现在知识库中有500个候选问题,现在传来一个用户的问题,Cross-Encoder结构要把用户问题和500个候选问题,分别拼接后输入模型,相当于要做500次前向计算。

而双塔模型则只需要把500个候选问题的embeddings提前算好存储起来,当有新问题时,只需要算这个问题的embedding,然后用新问题的embedding与500个embeddings做矩阵计算就OK了,相当于只进行了一次前向计算!

所以检索的一种方法是,首先用SBERT做检索,然后用Cross-Encoder做精排。

论文中的一些一些细节:

  • 预测时,SBERT是对BERT的输出做pooling来得到固定维度的句子embedding。作者实验了三种做法:包括使用CLS token的embedding、求句子序列的输出求mean、对句子序列的输出求max。实验发现,mean效果是最好的,个人经验是,做分类任务时,max效果更好,求语义表征的时候,mean效果更好。

  • 训练的损失函数

使用哪种损失函数依据手头数据集的形式,但无论采用哪种方式进行训练,预测时,用的都是两个句子分别输入encoder,得到输出后求pooling得到u和v,再求余弦相似度从而得到句子对的相似度。

  • Classification Objective Function:如上图的左边,当训练集是分类数据集时,采用优化交叉熵损失。值得注意的是,这里的concatenation可以采用多种方式,如(u,v)、(|u-v|)及图中的(u, v, |u-v|)等等,论文实验证明,|u-v|是影响最大的因子。强调一下,concatenation只有在训练采用交叉熵损失才考虑,预测时,用的只有u和v。

  • Regression Objective Function:如上图右边,采用平方损失。

  • Triplet Objective Function:三元组损失,当训练的数据集是如NLI这种三元组数据集时(即包含原句、与原句语义相同的句子、与原句矛盾的句子组成一个三元组),就可以采用这种目标函数,损失计算如下

Semantic Textual Similarity库

库地址:https://www.sbert.net/examples/training/sts/README.html#training-data

该库发布了用不同数据训练的SBERT模型可供直接调用(不过没看到中文的,只看到个多语言的),也封装了用你自己数据训练SBERT模型、Cross-Encoder模型的API,以及训练完后如何调用的API。库里还列举了SBERT的使用场景,如下图,包括计算句子的embedding、计算语义相似度、语义搜索、检索重排、聚类等等应用,每个应用都有示例代码。

总而言之,这个库对工业应用十分友好,建议做做成的同学充分掌握,业务上就能快速实现闭环。


投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

记得备注呦

整理不易,还望给个在看!

NLP语义匹配 | 经典前沿方案整理相关推荐

  1. 【NLP】NLP 语义匹配:经典前沿方案整理

    作者 | 周俊贤 整理 | NewBeeNLP 上一篇文章,讨论了语义匹配的语义场景,NLP 语义匹配:业务场景.数据集及比赛 这篇跟大家讨论相关的技术,主要包括BERT-avg.BERT-White ...

  2. NLP 语义匹配:业务场景、数据集及比赛

    作者 | 周俊贤 整理 | NewBeeNLP 大家好,这篇文章想跟大家讨论一下语义匹配的应用场景.实际上无论是NLP的哪个技术,我认为接触场景,思考这个技术跟具体场景是怎么结合的?这技术有哪些场景能 ...

  3. 【每周NLP论文推荐】 介绍语义匹配中的经典文章

    欢迎来到<每周NLP论文推荐>.在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的. 语义匹配也是NLP中比较基础的任务,它的主 ...

  4. 【自然语言处理(NLP)】基于ERNIE语言模型的文本语义匹配

    [自然语言处理(NLP)]基于ERNIE语言模型的文本语义匹配 作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资 ...

  5. 语义匹配(一)【NLP论文复现】Sentence-BERT 句子语义匹配模型的tensorflow实现以及训练Trick

    Sentence-BERT 句子语义匹配模型的tensorflow实现以及训练trick 论文模型回顾 建模与训练 模型代码部分 数据处理 训练 模型训练Trick trick1 warm up 代码 ...

  6. 从DSSM语义匹配到Google的双塔深度模型召回和广告场景中的双塔模型思考

    ▼ 相关推荐 ▼ 1.基于DNN的推荐算法介绍 2.传统机器学习和前沿深度学习推荐模型演化关系 3.论文|AGREE-基于注意力机制的群组推荐(附代码) 4.论文|被"玩烂"了的协 ...

  7. 视频与图片检索中的多模态语义匹配模型 ——原理、启示、应用与展望

    前言 三多前笔者在<万字长文漫谈视频理解>[1]一文中,曾经将自己对视频理解的认识进行过简单总结,幸而获得了朋友们的认可,能让读者认可是笔者最为骄傲的成就.现在看来文中观点有不少纰漏狭隘之 ...

  8. 丁香园在语义匹配任务上的探索与实践

    前言 语义匹配是NLP领域的基础任务之一,直接目标就是判断两句话是否表达了相同或相似意思.其模型框架十分简洁,通常包含文本表示和匹配策略两个模块,因而很容易扩展到相关应用场景,如搜索.推荐.QA系统等 ...

  9. 智能问答系统:问句预处理、检索和深度语义匹配技术

    更多干货内容敬请关注「平安寿险PAI」(公众号ID:PAL-AI),文末有本期分享内容资料获取方式. 智能问答系统是人机交互的核心技术之一,常见的应用场景主要是智慧客服.通过构建该系统,机器人可以快速 ...

  10. 【NLP-语义匹配】详解深度语义匹配模型DSSM

    所谓语义匹配,就是在语义上衡量文本的相似度,在产业界有很多的应用需求.例如,在FAQ场景中需要计算用户输入与标问之间的相似度来寻找合适的答案.本文介绍一种经典的语义匹配技术,DSSM,主要用于语料的召 ...

最新文章

  1. Linux 常用命令之系统信息
  2. 研究发现大部分企业没有在云端采用Office 365
  3. MYSQL:多表联合查询的例子
  4. WEB Struts2 中OGNL的用法
  5. Linux-NFS——配置过程
  6. 多类线性分类器算法原理及代码实现 MATLAB
  7. 时间java_Java 日期时间
  8. Java编程:普里姆算法(已知起点求最小生成树)
  9. 大前端(全栈)学习路线指南
  10. 中职计算机专业学Excel,2013年中职计算机应用专业中文Excel电子表格处理实际操作练习.doc...
  11. Linux设备驱动之字符设备(三)
  12. linux内存寻址解析 (一)
  13. Linux----UnZip命令
  14. 二维码上可以用精密光纤激光打标机打吗?
  15. 设计-前端设计尺寸与规范
  16. redis突然宕机数据会丢失吗
  17. r 选取从小到大的数据_R语言第二章数据处理⑥dplyr包(1)列选取
  18. 几个数拼接生成最大数(java实现)
  19. js时间与当前时间比较
  20. 有关Steam上CSGO游戏闪退

热门文章

  1. php enum 数字类型插入失败的解决办法
  2. 宏定义中#和##的用法
  3. 企业中MySQL高可用集群架构三部曲之MM+keepalived
  4. 大熊君JavaScript插件化开发------(实战篇之DXJ UI ------ ItemSelector)
  5. 现在在做的项目的一些感想.
  6. 【leetcode】二分查找经典题目
  7. 线性规划中的单纯形法与内点法(原理、步骤以及matlab实现)(二)
  8. HDU 1269 迷宫城堡 (强连通分量,常规)
  9. [HNOI2016]序列(莫队,RMQ)
  10. [ZJOI2014]力