【论文阅读】句向量总结、文本相似度计算 刺骨的言语ヽ痛彻心扉 2023-01-17 08:52 114阅读 0赞 # 句向量 # 不定长的句子用定长的向量表示,为NLP下游任务提供服务。 对于word embedding,训练完以后每个词对应一个向量,可以直观地判断embedding的好坏。 但是,对于sentence embedding,它的评测是没有ground truth的。只能将sentence embedding送入下游任务,根据在下游任务的表现来评测其质量。 换句话说,其实不存在单独的sentence embedding算法,只有嵌入在NLP系统中的sentence embedding模块。 ## 应用 ## * 语义搜索:通过句向量相似性,检索语料库中与query最匹配的文本 * 文本聚类:文本转为定长向量,通过聚类模型可无监督聚集相似文本 * 文本分类:表示成句向量,直接用简单分类器即训练文本分类器 ##### 问答系统 ##### ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpX2ppYW95YW5n_size_16_color_FFFFFF_t_70] ##### 对话系统 ##### ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3JLCqTFA-1619582897695)(/Users/didi/Library/Application Support/typora-user-images/image-20210428115444006.png)\]][img-3JLCqTFA-1619582897695_Users_didi_Library_Application Support_typora-user-images_image-20210428115444006.png] ##### 信息检索匹配 ##### ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vGfpUaQR-1619582897696)(/Users/didi/Library/Application Support/typora-user-images/image-20210428115457033.png)\]][img-vGfpUaQR-1619582897696_Users_didi_Library_Application Support_typora-user-images_image-20210428115457033.png] ## 脉络 ## NLP获得句向量的方式可大致分为两种: 1. 从词向量间接获取句向量 早期使用one-hot表示词,使用词袋表示文本,TF-IDF引入了单词的频率,上述方法可以归结为基于统计的词袋模型。2017年SIF算法提出用平滑倒词频获取所有词的权重,随后抹去共现信息。基于词向量获取句向量的方法,计算简便快速,却忽略了词本身的含义、词序对句子的影响。 1. 直接获取句向量 2013年,Mikolov提出了word2vec模型,其中包含CBOW和skip-gram模型,掀开了词向量表达的新篇章。2014年,Mikolov又提出了Doc2Vec,借鉴word2vec模型的思想,包含PV-DM和PV-DBOW结构。2015年,基于skip-gram思想的skip-thought模型问世,模型根据输入句,预测其上下文,产生句向量副产物。2018年,quick-thought改进了skip-thought训练慢的问题,将生成任务改为分类任务。同年,InferSent将句向量获取定义为有监督的任务,模型在自然语言推理数据集上训练,随后将训练好的模型当做特征提取器获得句子向量。同样是2018年,谷歌提出Universal Sentence Encoder,将句向量的获取定义为多任务学习,利用Transformer和DAN提取通用句子表征。2019年,Sentence-bert提出使用孪生网络学习句向量的表示。2020年,Bert-flow利用flow模型校正了 bert出来的句向量分布,从而使计算出的cos相似度更为合理。2021年,苏剑林认为bert-flow中的flow是不必要的,介绍了基于简单的线性变换以及降维便能媲美bert-flow的bert-whitening模型。没多久,陈丹琦的SimCSE仅仅使用两次dropout就超越了前人的模型。 ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mwfANScr-1619582897697)(/Users/didi/Library/Application Support/typora-user-images/image-20210428120108187.png)\]][img-mwfANScr-1619582897697_Users_didi_Library_Application Support_typora-user-images_image-20210428120108187.png] 接下来是对上述模型的详细介绍。 ### 1.从词向量间接获取句向量 ### 句子是由一个个词组成,较简便的思路是,直接从由词向量生成句向量。本章将介绍以下几种手段,分别是:累加法、平均法、TF-IDF加权平均法以及SIF法。 #### 1.1 累加法、平均法、TF-IDF加权平均法 #### 这类方法可以归结为基于统计的词袋模型。累加法就是将句子中所有非停用词的词向量叠加。平均法就是在累加法的基础上除以非停用词的个数。TF-IDF由词频TF和逆文档频率IDF相乘而得,用到了单词在句子中出现的频率以及在整个文档中出现的频率,可以重点关注语料库中不常出现的词。经过TF-IDF加权平均得到的句向量公式可以是: V\_sent = TF-IDF\_0 \* V\_0 + TF-IDF\_1 \* V\_1 + TF-IDF\_2 \* V\_2 + …+ TF-IDF\_n \* V\_n. #### 1.2 SIF加权平均 #### 这类方法可以归结为基于词向量的词袋模型。 SIF(Smooth Inverse Frequency)首先使用**平滑倒词频**求出所有词的权重。然后移去所有句子向量组成的矩阵的第一个主成分上的投影,抹去句子的共现信息。 下图为算法过程。 ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gnNH0qCp-1619582897697)(SIF.png)\]][img-gnNH0qCp-1619582897697_SIF.png] SIF可以看做针对TF-IDF的改进,在大部分数据集上都比完全平均或直接使用TF-IDF加权平均效果要好。 ### 2. 直接获取句向量 ### 由词向量获取句向量的方法,忽略了词序对句子的影响。本文将介绍以下几种手段,分别是Doc2Vec、skip-thought、quick-thought、InferSent、Universal Sentence Encoder、Bert。 #### 2.1 Doc2Vec #### ##### PV-DM ##### ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-acZLSqvF-1619582897697)(PV-DM.png)\]][img-acZLSqvF-1619582897697_PV-DM.png] 类似于word2vec模型的**CBOW模型**,在此基础上添加了paragraph id。paragraph id和词一样通过embedding矩阵得到唯一的对应向量。然后与当前上下文的词向量以拼接或average pooling的方式进行融合,输入到softmax层,预测窗口中间的词。 ##### PV-DBOW ##### ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j127q1rZ-1619582897698)(PV-DBOW.PNG)\]][img-j127q1rZ-1619582897698_PV-DBOW.PNG] 类似于word2vec的**skip-gram模型**,利用paragraph id对应的向量来预测文本中的任意词汇。在预测时,paragraph vector随机初始化,经过随机梯度下降迭代,求得句子向量。 #### 2.2 skip-thought #### ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S96Q9DWe-1619582897699)(skip-thought.png)\]][img-S96Q9DWe-1619582897699_skip-thought.png] 顾名思义,沿用了skip-gram的思想。在skip-gram中,是以中心词去预测上下文,而skip-thought,输入三个连续的句子,使用encoder-decoder模型,输入中间的句子,让模型预测上一个句子和下一个句子,最后的副产物是句向量。 它适合具有连贯性的数据集,但是seq2seq的架构导致训练速度慢。 #### 2.3 quick-thought #### ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y13cbIES-1619582897700)(quick-thought.png)\]][img-Y13cbIES-1619582897700_quick-thought.png] 为了解决skip-thought训练慢的问题,quick-thought应运而生。quick-thought将skip-thought的预测行为改进成**分类问题**。 模型的输入为一个句子s以及一个候选句子集合。集合中包含句子s的**上下文句子t**、以及不是s上下文的句子。模型对句子s以及候选句子集合编码,输入到分类器中,判断句子是否为s的上下文句子t。 相比skip-thought,训练速度大大提升,但是适用场景仍然有限。他俩都需要连贯的数据集,不能对单句求embedding。关于他们的跨界应用可以是,利用他们对一段文本提取embedding,然后对embedding进行kmeans聚类,无监督地获取文本摘要。 后面介绍的模型都是有监督的。 #### 2.4 InferSent #### ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zbwH5Jnr-1619582897700)(infersent1.png)\]][img-zbwH5Jnr-1619582897700_infersent1.png] InferSent是Facebook于2018年提出的**有监督**句向量模型。作者使用自然语言推理NLI数据集来学习句子表示,认为此任务需要推理句子间的语义关系,对模型要求较高,能很好地迁移到其他任务。 模型使用siamese结构,两个句子共用一个encoder,分别得到u和v的文本向量表达。然后使用三种计算方式,向量拼接\[u,v\],向量相乘u\*v,向量相减|u-v|,来帮助后面的全连接层提取向量间的交互信息,最后跟一个3-class分类器。 #### 2.5 Universal Sentence Encoder #### ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M4gATfws-1619582897701)(multi-task.png)\]][img-M4gATfws-1619582897701_multi-task.png] 将句向量的获取定义为多任务学习,综合利用无监督训练数据和有监督训练数据,进行多任务训练,从而学习一个通用的编码器。 无监督训练数据包括QA以及wiki百科和web news,有监督训练数据是SNLI。 模型使用了Transformer和DAN两种编码器,但是共享相同的sentence embedding,以此来保证迁移学习的性能。 小孩子才做选择,我全都要。 #### 2.6 Bert #### ##### 文本相似任务 ##### 搜索bert句向量的相关论文,都是建立在文本相似任务上的,所以后面都在这个任务上进行介绍。 目前,简单的对glove求平均,sentence-bert,bert-flow,bert-whitening都是比较主流的办法。这两天刷新SOTA的是陈丹琦的SimCSE-bert模型。 ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AvgHVXyN-1619582897701)(/Users/didi/Library/Application Support/typora-user-images/image-20210428115744140.png)\]][img-AvgHVXyN-1619582897701_Users_didi_Library_Application Support_typora-user-images_image-20210428115744140.png] ##### 2.6.1 Sentence-bert ##### 使用bert获取句向量,我们自然而然想到的是用CLS作为句向量的表达。但是sentence bert论文提到,如果是**无监督**的任务,直接使用CLS甚至还不如用glove对token embedding取平均。 这篇论文是专门针对文本相似度任务提出的,因此设计了这样的孪生网络结构。 ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RNtVq8Qv-1619582897702)(sentence bert1.png)\]][img-RNtVq8Qv-1619582897702_sentence bert1.png] 分类任务:句子A和句子B分别输入到bert,得到两句话的句子向量u和v,将u、v、和二者按位求差|u-v|进行拼接,类似于CV的扩大感受野,乘以可训练矩阵W后,送入softmax进行分类。 回归任务,计算两个向量的余弦相似度。 作者还设计了triplet目标函数,对于目标句子a,有positive句子p以及negative句子n,函数的目标是尽可能控制a与p的距离远大于a与n的距离。 作者做了大量的实验,认为平均池化操作效果最优。sentence-bert达到了当时的句向量SOTA。 ##### 2.6.2 Bert-flow ##### 根据sentence-bert的实验结果,平均词向量的embedding效果优于CLS对应的embedding,因此bert-flow的实验也都在平均embedding的基础上进行。为了解决bert语义不平滑的问题,将句向量的分布转化为高斯分布。从各向异性变成各向同性。 ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YzeXp17v-1619582897704)(./bert-flow.png)\]][img-YzeXp17v-1619582897704_._bert-flow.png] ##### 2.6.3 Bert-whitening ##### 得到句向量后,对矩阵进行PCA白化操作,使得每个维度均值是0,协方差矩阵是单位阵,然后保留k个主成分。 [https://kexue.fm/archives/8069][https_kexue.fm_archives_8069] ##### 2.6.4 SimCSE Bert ##### ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ji2kaNOc-1619582897704)(/Users/didi/Library/Application Support/typora-user-images/image-20210428115908582.png)\]][img-Ji2kaNOc-1619582897704_Users_didi_Library_Application Support_typora-user-images_image-20210428115908582.png] 陈丹琦提出,两个变体,分别是无监督和有监督的模型。主要区别就是正负样例的构造上。 对于无监督,引入dropout给输入加入噪声。正例,用bert对句子编码两次得到两个向量,负例就是随机采样batch里的另一个输入。 对于有监督,在多种数据集实验后,发现NLI数据最有利于学习句子的表示。对应正例就是NLI数据集中蕴含关系的句子对,负例是NLI数据集中矛盾关系的句子对。 目前这个方法在文本相似任务上刷到了SOTA。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpX2ppYW95YW5n_size_16_color_FFFFFF_t_70]: /images/20221021/971969b7d4884773be0d29736851ce01.png [img-3JLCqTFA-1619582897695_Users_didi_Library_Application Support_typora-user-images_image-20210428115444006.png]: /images/20221021/e0f925dd782449a7a2b7b72bff67a284.png [img-vGfpUaQR-1619582897696_Users_didi_Library_Application Support_typora-user-images_image-20210428115457033.png]: /images/20221021/0ee57516c6294b5b9bde6c8b4c4969fd.png [img-mwfANScr-1619582897697_Users_didi_Library_Application Support_typora-user-images_image-20210428120108187.png]: /images/20221021/204bd0b852f4473aa6fa700c4183e153.png [img-gnNH0qCp-1619582897697_SIF.png]: /images/20221021/454e4dfdf5684b4296bd2be304b06572.png [img-acZLSqvF-1619582897697_PV-DM.png]: /images/20221021/50cac44cf1dc442b8174abd6cb9e297e.png [img-j127q1rZ-1619582897698_PV-DBOW.PNG]: /images/20221021/34d180af3d3c40c1b1f7c415bb3669fd.png [img-S96Q9DWe-1619582897699_skip-thought.png]: /images/20221021/a4447f4899f84a418ee92386d9bdbc9d.png [img-Y13cbIES-1619582897700_quick-thought.png]: /images/20221021/96f33f858da5434987fa22e20556ba7f.png [img-zbwH5Jnr-1619582897700_infersent1.png]: /images/20221021/73d43d4e34364e8eb3dea5719d250a6a.png [img-M4gATfws-1619582897701_multi-task.png]: /images/20221021/9b6ade3b5488445aa08d4830f3b5950a.png [img-AvgHVXyN-1619582897701_Users_didi_Library_Application Support_typora-user-images_image-20210428115744140.png]: /images/20221021/3f99a00e77a840be99b75f075654a0ef.png [img-RNtVq8Qv-1619582897702_sentence bert1.png]: /images/20221021/cab4f0b859cd48f5b24b1927f10544d8.png [img-YzeXp17v-1619582897704_._bert-flow.png]: /images/20221021/926bca6919594576920568ef2d836ed7.png [https_kexue.fm_archives_8069]: https://kexue.fm/archives/8069 [img-Ji2kaNOc-1619582897704_Users_didi_Library_Application Support_typora-user-images_image-20210428115908582.png]: /images/20221021/f18ac3769dc84b39a7e9729903f8ac9d.png
还没有评论,来说两句吧...