《NLP中有什么比较好的sentence/paragraph embedding方法 ?》

 

https://www.zhihu.com/question/299549788/answer/516572794html

 

NLP中有什么比较好的sentence/paragraph embedding方法 ?

如题,困扰我一直的问题。据我所知,fasttext能够直接拿文本做为输入,有的人拿词向量直接平均做为文本向量,可是有什么比较好的方法呢,请教各位,谢谢~git

 

12 个回答

默认排序
等 158 人赞同了该回答

nlp小萌新也来凑个热闹...github

下面大概是我看过的一些论文和资料,附上连接和一些开源实现...web

 


 

简单的作法拿预训练的词向量求平均:

如今常见的词向量好比word2vec、glove、fasttext...:算法


还有一个有意思的工做power mean word embeddings:论文Concatenated Power Mean Word Embeddings as Universal Cross-Lingual Sentence Representations以及代码网络

......app

还有一些词向量工做好比:框架

  1. Dependency-Based:利用 dependency-based contexts而不是常见的linear contexts,这种embedding可以更多学到functional similarity。论文Dependency-Based Word Embeddings以及代码

  2. Dict2vec:利用 natural language dictionaries构建单词对,以便语义相关的单词更接近。论文Dict2vec : Learning Word Embeddings using Lexical Dictionaries以及代码

  3. PARAGRAM word vectors:利用来自PPDB的短语对构建参数化释义模型。论文From Paraphrase Database to Compositional Model and Back以及代码


想提一下这三个工做是由于感受它们都是使用额外的外部数据来学习或改进表示~~并无对太大的算法创新~~机器学习

 

或者拿预训练的词向量加权平均:

权重好比tfidf、sif权重wordpress

 

权重也能够联合train:

好比论文:Learning Sentence Representation with Guidance of Human Attention

 


 

 

其余sentence embedding:

不少方法利用预训练词向量经过各类设计的编码器(encoder),而后经过一些任务来训练~~

国外有个叫John Wieting的博士一直在作这一块工做,看他近些年发表的工做就能看出来:

而后~~

 

我感受sentence embedding包括通用的和特定任务的~~

 


 

而后就是目前很火的语境词向量(Contextualized Word Embeddings):

感受这种思想相似CV里面的先预训练model~~

 


 

最后最后~~

推荐个框架:Flair以及目前最全中文词向量~~请各位大佬笑纳~~

​赞同 158​​11 条评论
​分享
​收藏​喜欢
收起​
 
等 13 人赞同了该回答

首先我要吐槽一下 知乎匹配的这个书 是什么鸡毛

其次,具体的回答先留坑

​赞同 13​​10 条评论
​分享
​收藏​喜欢
收起​
等 36 人赞同了该回答

每周一答。方法不是最新的,但求提供一些结构化的思考。

sentence embedding(SenVec) 在 word embedding 之上,须要进行一步额外的“语义压缩”,即将“不定长“的文本序列转换为“固定维度”的向量。word embedding 已经完成了文本空间到向量空间的转换,接下来要考虑的就是如何把这 n 个词各自的向量,揉到一块儿。

题主会以为没有思路,多是由于你把它看成了一个“独立任务”—— 已经肯定的数据集、已经肯定的评价指标、已经肯定的训练方式。实际上,它并非这样的。

换个角度想一想,若是你已经计算出了 SenVec,你要如何评价它的质量呢?你想要的“比较好”,是如何衡量的?这个任务是没有 ground truth 的对吧,你只能经过 SenVec 在下游任务中的表现,来评测其质量 —— 好比情感分析、机器翻译、句法树生成、下句预测、答案排序等等。

换句话说,其实并不存在单独的 sentence embedding 算法,只有嵌在 NLP 系统中的 sentence embedding 模块。咱们一般把这种模块,叫做 encoder(认识了吧)。

WordVec 训练完以后,每一个词对应一个向量,存起来随用随查。但 SenVec 可不是这样一个查找表,咱们真正须要的是一个“网络”,输入文本序列,输出其向量化表示。因此,把特定 NLP 任务的 encoder 拿出来就好了。

以上是思路,接下来是方法论

计算 SenVec 有两个核心问题。

  1. encoder 结构,也就是公众号常常推的“三大特征抽取器”—— RNN \ CNN \ Transformer。具体来讲,RNN 使用双向 BiLSTM 的形式,各个时刻的隐层进行最大池化(BiLSTM-max)的效果比直接取最后时候的隐层(BiLSTM-last)效果好。CNN 的经典版本是 TextCNN,即把词向量 stack 成矩阵,把这个矩阵当成“图像”。进阶版为 FairSeq 中使用的 Gated ConvNet。Transformer 也有单向和双向两种版本。以上的这些,各个开源框架里都有能够直接调用的封装,不须要本身实现。
  2. 训练任务,也就是我上面说的“NLP系统”。不一样训练任务获得的 SenVec,所携带的语义信息各有侧重。因此,这一步须要结合本身能够得到的训练数据以及应用场景来作。须要句法信息,那就用生成句法树的任务;须要文本语义,那就用机器翻译任务;须要上下文推理,那就用 SkipThought。若是没有太多监督数据,先自编码再解码重建,也是能够的。

固然,若是不想这么复杂,把句子里全部词的 embedding 作 average(或者 sum,效果差很少),也是能够的。

Paragraph Embedding 是另外一个问题,等我本身理解了再来答。

=____=
赞扬
尚未人赞扬,快来当第一个赞扬的人吧!
​赞同 36​​10 条评论
​分享
​收藏​喜欢
收起​
8 人赞同了该回答

无监督学习方法

最直接最简单的思路就是对一个句子中全部词的word embedding进行组合。这种方法最明显的缺点是没有考虑词序信息,可是足够简单高效。复杂一点的方法是在无标签语料上训练句子表示学习模型,基本思想都是在无标签训练数据上设计监督学习任务进行学习。下面是一些总结:

  • 词向量的平均或加权平均是一个简单有效的baseline,基于SIF词向量加权平均的在一些任务上甚至比复杂模型的效果好。
  • Paragraph Vector模型足够简单,而且可以编码文档级文本,可是对于sentence embedding,其效果相较于其余方法不具竞争力。
  • Skip-Thought,FastSent和Quick-Thought都是基于句子连贯性设计任务:
    • 基于encoder-decoder的Skip-Thought模型最复杂,在监督类型评测上比FastSent模型效果好,但在非监督类型评测上,FastSent要好于Skip-Thought。
    • Quick-Thought做为一个三者中最新的模型,其复杂度介于FastSent和Skip-Thought之间,但在大多数任务上的效果比其余两个模型都好。
  • 相较于Skip-Thought,FastSent和Quick-Thought,SDAE模型与利用n-grams的Sent2Vec模型的优势是只须要输入单个句子。此外,Sent2Vec模型效果比SDAE模型好一些。

监督学习方法

基于监督学习方法学习sentence embeddings能够概括为两个步骤:

    • 第一步选择监督训练数据,设计相应的包含句子编码器Encoder的模型框架;
    • 第二步选择(设计)具体的句子编码器,包括DAN、基于LSTM、基于CNN和Transformer等。

Sentence Embedding的质量每每由训练数据和Encoder共同决定。Encoder不必定是越复杂越好,须要依据下游任务、计算资源、时间开销等多方面因素综合考虑。

以上是我近期阅读sentence embedding相关论文的总结,更详细的介绍记录在个人两篇博客中:

  1. 将句子表示为向量(上):无监督句子表示学习(sentence embedding)
  2. 将句子表示为向量(下):基于监督学习的句子表示学习(sentence embedding)
​赞同 8​​添加评论
​分享
​收藏​喜欢
收起​
等 30 人赞同了该回答

前段时间由于完成做业的关系,看了些文章资料,整理了一篇《关于句子表征的学习笔记》文章出来,这里偷个懒直接粘贴,主要是一些经典模型和算法的浅薄认知,但愿能对你们有所帮助。若是有谬误缺漏,烦请指正。

本文结构

  • 1. 基线模型
    • 1.1. 词袋模型
      • 1.1.1. 基于统计的词袋模型
      • 1.1.2. 基于词向量的词袋模型
      • 1.1.3. 词袋模型的根本问题
    • 1.2. PV-DM / PV-DBOW 模型
    • 1.3. 基于 RNN/CNN 的模型
  • 2. 无监督模型
  • 3. 监督模型
  • 4. 多任务学习
  • 5. Reference

1. 基线模型

1.1. 词袋模型

1.1.1. 基于统计的词袋模型

在词向量技术未出现前,句子表征通常采用基于统计的词袋模型。

以 “I like you and you like me.” 和 “I love you and you love me.” 为例,词表为 {I, like, you, and, me, love},词表大小为 6。

  • 在基于 One-hot 的词袋模型中,两句的向量表示分别为: [公式] ​
  • 在基于词频 / TF-IDF 的词袋模型中,向量中的每一个元素再也不仅是 0 1,而是更换为词频 / TF-IDF,以词频为例,上例的表示为: [公式] ​。
  • Term Frequency–Inverse Document Frequency (TF-IDF) 是一种用于信息检索与数据挖掘的经常使用加权技术。
  • 其中 TF 意为词频 Term Frequency,指单词在文档中的出现频率;IDF 意为 逆文本频率指数 Inverse Document Frequency ,指单词在语料库的全部文档中出现的频率的倒数。
  • TF-IDF 认为词的重要性随着它在文件中出现的次数成正比增长,但同时会随着它在语料库中出现的频率成反比降低。

此外,为了引入语序信息,还经过在词表中增长 n-grams 项对词表进行扩展,可是这样会使得词表更大,向量也会更加的稀疏。

上述方法存在于高维、稀疏、离散的表示以及词袋模型弱化语序的问题,效果不佳。

1.1.2. 基于词向量的词袋模型

这类模型也被称为 word-wise 模型,基于词向量进行提取、组合,造成高阶特征。 最多见的方法是将一句话中的每一个词的词向量求平均,做为句子表征。例如:Word2Vec, GloVe, FastText 等。

这样的模型能为许多下游任务提供强的基线,具备简单高效的优势。

很快,人们意识到简单求均值的方法过于粗糙,便提出了不少加权求平均的方法,例如以词频、TF-IDF 等为权重。

SIF加权平均词向量

A Simple but Tough-to-Beat Baseline for Sentence Embeddings ICLR 2017

该模型以平滑倒词频 (smooth inverse frequency, SIF) 做为权重进行加权平均获得句子向量,即认为频率越低的词在在句子中的重要性更大。最后令每一个句子向量都减去其在,全部句子向量组成的矩阵的第一个主成分(principal component)上的投影,即抹去全部句子的共有信息,增大每一个句子向量之间的距离。

Power Mean 均值模型

Concatenated Power Mean Word Embeddings as Universal Cross-Lingual Sentence Representations arXiv 2018

本模型经过引入“幂均值” (Power Mean) 来改进加权平均的方法,幂均值公式以下:

[公式]

  • 记句子 ​ [公式] , [公式] 为每一个词的词向量
  • [公式] ​ 时即为直接求平均的模型,​ [公式] 实际上指的是 max /min 操做,即对每一个维度求取全部单词中的最大/最小值做为这一维度的值

模型将不一样 p 值获得的不一样的句子向量拼接起来做为句子表征,保留了不一样 p 值获得的不一样的信息。

此外,除了拼接不一样的 p 值的向量,模型还拼接不一样 word embedding 算法获得的向量。

从上图中的实验结果中能够看出,这确实如做者所言,是一个 hard-to-beat 的 baseline。

1.1.3. 词袋模型的根本问题

词袋模型存在两个主要的缺点:忽略词序和语法。

因为词袋模型缺失了语序信息,在对语序较为敏感的下游任务中效果不佳,如情感分析 sentiment analysis:

I like this movie because it doesn't have an overhead history. Positive
I don't like this movie because it has an overhead history. Negative.

don’t 的位置不一样,决定了这两句话的情感取向是一正一负的,但在词袋模型中,这两句话获得的句子表征倒是一致的。

1.2. PV-DM / PV-DBOW 模型

Distributed Representations of Sentences and Documents ICML 2014

word2vec 的做者 Mikolov 将 CBOW 和 Skip-gram 这两个 word embedding 的训练方法应用到 sentence embedding 中。

PV-DM 的全称是 Distributed Memory Model of Paragraph Vectors。与 CBOW 相似,也是经过上下文预测下一个词。但在输入层处维护了一个文档 ID 映射到一个向量的表格,目的是将当前文档的向量以及上下文向量联合输入模型,并让模型预测下一个词,训练结束后,对于现有的文档,即可以直接经过查表的方式快速获得该文档的向量,而对于新的一篇文档,那么则须要将已有的表格添加相应的列,而后从新走一遍训练流程,只不过此时固定好其余的参数,只调整表格便可,收敛后即可以获得新文档对应的向量了。

PV-DBOW 的全称则是 Distributed Bag of Words version of Paragraph Vector。和 Skip-gram 相似,经过文档来预测文档内的词。训练时随机采样一些文本片断,而后再从这个片断中采样一个词令 PV-DBOW 模型来预测这个词,借助这一分类任务做为训练方法。

两个模型的优势是它们不只能获取句子向量,也能获取文档级别向量,弱点在于:为了获取新文档的向量,须要从新训练一遍流程,而且因为模型主要是针对文档向量预测词向量的过程进行建模,其实很难去表征词语之间的更丰富的语义结构,因此这两种获取文档向量的方法都未能大规模应用开来。

1.3. 基于 RNN/CNN 的模型

天然而然的,咱们能够利用 RNN (LSTM/GRU等) 来克服词袋向量的语序问题,以最后一个隐状态做为整个句子的 Embedding,或者对每一时间步的隐状态进行平均、max/min或者加权平均。

基于 RNN 的 Sentence Embedding 每每用于特定的有监督任务中,缺少可扩展性/迁移性(transferrable),即便在某个task中能够效果不错,也须要在新的任务中须要从新训练,可是因为 RNN 自己难以并行训练的缺陷,开销较大。

A Convolutional Neural Network for Modelling Sentences ACL 2014

Kalchbrenner 提出的 TextCNN 将 CNN 成功应用到 NLP 中。TextCNN 使用卷积核提取局部特征,利用 CNN 能够提取句子中相似 n-gram 的局部信息,并经过整合不一样大小的 n-gram 特征做为整个句子的表示。

网络结构简单,参数数目少,计算量少,训练速度快,经过引入已经训练好的词向量依旧有很不错的效果。

TextCNN 的一个缺点是须要人工指定卷积核的尺寸,而这个超参数对结果的影响很大。

2. 无监督模型

Skip-Thought Vectors NIPS 2015

借鉴 Skip-gram 的思想,Skip-thoughts 直接在句子间进行预测,也就是将 Skip-gram 中以词为基本单位,替换成了以句子为基本单位。具体作法就是选定一个窗口,遍历其中的句子,而后分别利用当前句子去预测和输出它的上一句和下一句。这里的 Decoder 能够看做是以 Encoder 输出为条件的神经语言模型。不过和普通框架不同的是,Skip-thoughts 有两个 Decoder。

此外,因为 Skip-thoughts 模型的词表规模每每是远小于现实中的词表,为了让模型可以对任意句子进行编码,受论文 Exploiting similarities among languages for machine translation 的启发,训练 word2vec 与 Skip-thoughts 的 encoder 端的词向量矩阵之间的线性映射模型,若是待编码的句子中的某个词不属于 Skip-thoughts 词表,则首先在 word2vec 词表中进行查询获得对应的 word2vec 词向量,再经过线性模型映射为 Skip-thoughts 模型的 encoder 对应空间的词向量。

An efficient framework for learning sentence representations ICLR 2018

Google Brain的 Logeswaran 等人认为 Skip-thoughts 的效率过低,且没法在大规模语料上很好的训练。他们提出了一种简单且有效用于学习句子表示的框架 Quick-thoughts —— 将生成任务改成分类任务。

训练时,输入一个句子以及其候选句子集合,集合中包含一个与句子出如今同一上下文窗口中的句子做为正例,其他不出如今同一上下文窗口中,记为负例。将这些句子输入模型,让模型判断这些句子对是不是同一个上下文窗口中。模型的 Encoder 有两个如上图所示,分别是 ​,测试时,给定待编码句子 ​ ,经过该模型获得的句子表示是句子编码器和候选句子编码器的链接 ​。

有趣的是,模型使用的分类器很是简单,其输入为向量内积,即 ​ ,如上图所示,计算出四个句子的句子向量并分别算出向量内积后,输入到 softmax 层进行分类。这是为了引导模型着重训练句子编码器,从而得到更好的句子向量。

3. 有监督模型

Deep Unordered Composition Rivals Syntactic Methods for Text Classification ACL 2015

论文首先提出了 NBOW (Neural Bag-of-Words) 模型,即直接将文本中全部词向量的平均值做为文本的表示,而后输入到 softmax 层进行文本分类。

随后讨论了 Recursive neural networks (RecNNs) 这类基于句法结构进行句子表征的方法,尽管在有些状况下有很是好的效果,可是其不适合长文本以及不规范文本 (如口语) 而且十分依赖于句法树的准确性,训练时间很长,效果通常。

因而,在 NBOW 的基础上提出了Deep Averaging Networks (DAN) ,经过增长多个隐藏层来增长网络的深度,训练速度快,效果不错,可是模型显然没有考虑单词之间的顺序,缺陷难以免。

A Structured Self-attentive Sentence Embedding ICLR 2017

本文再也不使用一维向量做为句子表征,而是使用二维矩阵做为句子表征,以解决句子被压缩成一维向量时的信息损失,而且为此对损失函数加以改进。

假设模型的输入是一个含有 n 个 Token 的句子,LSTM 的隐层维度为 h,那么通过 BiLSTM 获得 ​ [公式] ,再如上图右侧的所示,经过简单前馈神经网络生成 self-attention 权重:

[公式] 其中 [公式] ,从而获得句子中每一个单词的权重。但如此获得的 [公式] ​ 仍是一种一维向量的句子表征。做者认为该向量表示一般集中在句子中的特定组成上,就像一个相关的词或短语的特殊集合,只会反映在句子语义的一个方面或一种组成。

然而,特别是对于长句,一个句子能够有多种组成来共同组成整个句子的总体语义。因此咱们须要执行屡次 attention,因而将 ​ [公式] 升级为矩阵 ​ [公式] ,公式变为

[公式] 因而最终的句子向量也就变为了 [公式] ​,即二维句子表征。

Supervised Learning of Universal Sentence Representations from Natural Language Inference Data EMNLP 2017

InferSent 认为从 NLI (Natural Language Inference NLI) 是一个理解任务,涉及推理句子间的语义关系) 数据集中训练获得的句向量也适合迁移到其余 NLP 任务中。例如将训练好的模型当作特征提取器,以此来得到一个句子的向量表示,再将这个句子的表示应用在新的分类任务上,来评估句子向量的优劣。框架结构以下图所示:

这个框架最底层是一个 Encoder,也就是最终要获取的句子向量提取器,输入是一对句子,分别是前提 premise 与假设 hypothesis,而后将获得的句子向量经过一些向量操做后获得句子对的混合语义特征,最后接上全链接层并作数据集上的三分类任务 (entailment 蕴含, contradiction 矛盾, neutral 中性) 。

论文对比了7种不一样的句子编码器,主要包括 RNN 与 CNN,其中 RNN 包括取LSTM/GRU最后一个隐状态,BiGRU,BiLSTM的 mean/max pooling 以及 self-attention,公式以下。取得效果最优的是 BiLSTM+maxpooling 做为编码器。

[公式] InferSent 模型的成功,使学界开始探索经过不一样的监督任务,丰富并加强句子表征,提高其在下游任务中的效果。

4. 多任务学习

Universal Sentence Encoder EMNLP 2018

Google 于 2018 年初发布的通用句子编码器,综合利用无监督训练数据和有监督训练数据,进行多任务训练,从而学习一个通用的句子编码器。无监督训练数据包括问答(QA)、维基百科和网页新闻等,有监督训练数据为SNLI。多任务模型设计以下图所示,其中灰色的 encoder 为共享参数的句子编码器。SNLI 上的训练模型与Facebook 推出的 InferSent 相似。共享编码器使得模型训练时间大大减小,同时还能保证各种迁移学习任务的性能,力求为尽量多的应用提供一种通用的句子编码器。

论文对比了 DAN 和 Transfomer 这两种编码器。Transformer 模型在大部分任务上的表现都优于简单的 DAN 模型,而且处理短句子时只稍慢一些。DAN模型也能具备很不错的表现,而且相较于Transformer模型,当句子较长时训练时间和内存的开销都更小。

Learning General Purpose Distributed Sentence Representations via Large Scale Multi-task Learning ICLR 2018

微软在论文中提出了利用四种不一样的监督任务来联合学习句子的表征,这四种任务分别是:Natural Language Inference, Skip-thougts, Neural Machine Translation 以及 Constituency Parsing。

做者认为,通用的句子表征应该经过侧重点不一样的任务来联合学习到,而不是只有一个特定任务来学习句子表征。因此模型将同时在多个任务和多个数据源上进行训练,而且共享句子表征。

实验的具体作法是,先用联合学习的方法在上述四个任务上进行训练,训练结束后,将联合学习的模型做为特征提取器提取句子表征,而后直接接上全链接层做为分类器,而且同时冻结特征提取器中的参数,而后在新的分类任务上训练分类器。做者发现不少任务上简单分类器都要超过当时的最好结果,而且他们还发现联合训练中不一样的任务对于句子表征中的不一样方面有不一样的贡献。

Reference

NLP的巨人肩膀

句子嵌入

https://www.cnblogs.com/llhthinker/p/10335164.html

​赞同 30​​2 条评论
​分享
​收藏​喜欢
收起​
1 人赞同了该回答
self-attention算是一种吧。
​赞同 1​​添加评论
​分享
​收藏​喜欢
5 人赞同了该回答

没空去把具体的论文连接拿过来了,直接摆关键词好了,按照时间顺序,建议阅读如下工做,就能借鉴或者思考出比较好的sentence embedding的方法

  • Paragraph Vectors
  • Skip-Thought Vectors
  • SDAE, FastSent
  • Quick-Thought
  • ELMo
  • BERT(这篇工做感受上其实吸取了上述一些工做的精华)
​赞同 5​​添加评论
​分享
​收藏​喜欢
3 人赞同了该回答

几个pre-trained sentence encoder:

CBoW

Skip-Thought (Kiros et al., 2015)

InferSent (Coneau et al., 2017)

DisSent (Nie et al., 2017)

GenSen (Subramanian et al., 2018)

​赞同 3​​1 条评论
​分享
​收藏​喜欢
1 人赞同了该回答

基于Self-Attention和BiLSTM的文本Embedding,亲测序列长度500都没问题

论文 《A Structured Self-attentive Sentence Embedding》

代码github/EmbolismSoil/SelfAttentiveSentenceEmbedding-TF

​赞同 1​​4 条评论
​分享
​收藏​喜欢
1 人赞同了该回答

就算是bert也无法对付语法和拼写杂乱的社交网络,最终仍是要本身训练embedding。。。

​赞同 1​​添加评论
​分享
​收藏​喜欢
2 人赞同了该回答
  1. 从word vector到sentence vector的方法。
  2. 基于distributed的思想,就像word2vec同样,一个word的向量表达由它周围的contexts来展示。
  3. 从多任务中学习。
  4. 从对话中学习等等。

详细的总结见下方连接。

天然语言处理中句向量

​赞同 2​​添加评论
​分享
​收藏​喜欢

BERT啊

​赞同​​添加评论
​分享
​收藏​喜欢
 
写回答
相关文章
相关标签/搜索