赞
踩
本文主要对句向量的发展和relate work介绍一下,可以看作一个简单的综述内容,句向量在NLP中有着很重要的作用,同时在许多NLP实际任务中会类似得到word embedding一样得到中间产物句向量 sentence embedding。下面将从最开始的dec2vec,以及word embedding组合的到的句向量分析,到sentence bert,以及bert-flow,bert-whitening,到最近的对比学习得到的句向量 SimCSE(EMNLP 2021,SimSCD(ACL 2022) 进行分析比较,
句向量概念类似于词向量,就是把句子语义投影到一个n维向量空间上。
我们研究任何东西都会有motivation,不会为了论文而研究,句向量的应用场景一般有语义检索,文本聚类,文本分类,除了这些直接的应用场景外,在其他NLP任务中,中间产物句向量的好坏,很大程度会影响任务结果的好坏,比如seq2seq任务中的中间语义向量c,长文本NLP任务对多个句向量再进行attention,选择重要句子,对把握整篇长文本NLU和NLG也很重要。
在ngram,word2vec,glove构造出word embedding后,那sentence embedding就可以之间表现为多个word embedding的累加,平均等操作处理。但由于其对word在sentence中的位置没有清晰表示,导致sentence embedding效果较差。
使用tf-idf权重对特征词进行加权表示句子向量
类似word2vec,可以分为PV-DM和PV-DBDW两种方式
doc2vec目前在gensim中集成
简单示例代码链接 zhangxs131/sentence_embedding (github.com)
bert为首的MLM,LM等基于词的预训练模型,主要得到更好上下文的语义表示,但由于预训练策略针对填词和预测词的,故对生成句子向量,会有各向异性等问题。
bert模型中直接使用每个词都attention到的CLS向量表示,即可用于表示句子向量,也是目前一般中最常用的方法。
对bert中word embedding进行池化,联结得到句向量。
sentence-bert就是简单修改bert,不同长度的文本获得同一长度的句向量,通过对比实验,对比CLS-pooling,average-pooling,max-pooling,然后基于bert在三个训练目
最后才bert,roberta基础上实验,在STS数据集上mean-pooling效果好些
针对bert得到向量表达具有各向异性的问题(向量分布不均匀,充斥在一个狭窄锥形空间内),因此直接使用bert encode得到句子表示进行cos或dot是无法很好衡量出两个句子相似度的,因为bert向量不是基于一个标准正交基得到的。
在bert得到向量的锥形区域内,高频词在头部,低频词在尾部,高频词和低频词之间的语义相似度计算困难,影响向量对句子的表达。
针对上述问题,打算将setence embedding向量,进行变换transfrom,使得向量分布形成高斯分布,即在bert后加一个后处理过程,通过训练得到这一transform过程模型
与bert-flow类似,考虑针对sentence embedding进行向量转换,直接进行一个白化操作,来矫正向量空间分布。
为了达到与bert-flow相同效果,我们知道正态分布均值为0,协方差矩阵为单位阵,那么我们执行变换
也就是白化操作。
其中均值
协方差矩阵 :
根据协方差矩阵得到变换矩阵W,简化了flow模型,并提高了效果。
SimCSE作为21年EMNLP的一篇论文,很有借鉴加载,主要思路是模型中dropout作为一个embedding扰动器,来实现数据增强,两个带有dropout相同encoder后得到的嵌入表示作为正样本对来进行对比学习,为后面Rdropout等灵活使用dropout的模型提供灵感。
SCD: Self-Contrastive Decorrelation for Sentence Embeddings, 这是ACL22的一篇论文,在我上一篇博客中主要进行了讲解。作者主要思路使用dropout rate高的向量表示来构造负样本对,同时结合类似bert-flow,bert-whitening进行去相关的后处理操作,这两个目标联合构成的损失函数作为训练目标,达到了不错的效果。
目前句向量表示,为了达到各向同性而进行的向量变换,和为了解决对比训练过程正负样本对问题,而继续努力,未来工作希望有更多发展。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。