携手创作,一同成长!这是我参与「日新计划 8 月更文应战」的第12天,点击查看活动概况

这一节咱们来聊聊不定长的文本向量,这儿咱们暂不考虑有监督模型,也便是任务相关的句子表征,只看通用文本向量,依据文本长短有叫sentence2vec, paragraph2vec也有叫doc2vec的。这类通用文本embedding的运用场景有很多,比方核算文本类似度用于内容召回, 用于聚类给文章打标等等。前两章咱们讨论了词向量模型word2vec和Fasttext,那最简单的一种得到文本向量的办法,便是直接用词向量做pooling来得到文本向量。这儿pooling可以有很多种, 例如

  • 文本一切单词,词向量 average pooling
  • 文本一切单词,词向量 TF-IDF weighted average pooling
  • 文本提取关键词,词向量 average pooling
  • 文本提取关键词,词向量 weighted average pooling

想了解细节的可以看下REF[3,5],但基于word2vec的文本向量表达最大的问题,也是词袋模型的限制, 便是向量只包括词共现信息,忽略了词序信息和文本主题信息。这个问题在短文本上问题不大,但对长文本的影响会更大些。于是在word2vec发表1年后还是Mikolov大大,给出了文本向量的另一种解决方案PV-DM/PV-DBOW。下面比如的完整代码见 github-DSXiangLi-Embedding-doc2vec

模型

PV-DM 练习

在CBOW的基础上,PV-DM加入了paragraph-id,每个ID对应练习集一个文本,可所以一句话,一个段落或者一条新闻对应。paragraph-id和词一样经过embedding矩阵得到仅有的对应向量。然后以concat或者average pooling的方法和CBOW设定窗口内的单词向量进行交融,经过softmax来猜测窗口中间词。

无所不能的Embedding3 - word2vec->Doc2vec[PV-DM/PV-DBOW]

这个paragraaph-id详细做了啥嘞?这儿需求回忆下word2vec的word embedding是如何经过back propogation得到的。不清楚的可以来这儿回忆下哟无所不能的Embedding 1. Word2vec模型详解&代码实现

第一步hidden->output更新output embedding矩阵,在CBOW里h只是window_size内词向量的均匀,而在PV-DM中,hh包括了paragraph-id映射得到的文本向量,这个向量是整个paragraph共享的,所以在窗口滑动的时候会保留部分paragraph的主题信息,这部分信息会用于output embedidng的更新。

vw′j(new)=vw′j(old)−⋅ej⋅hv_{w^{‘}j}^{(new)} = v_{w^{‘}j}^{(old)} – \eta \cdot e_j \cdot h

第二步input->hidden更新input embedding矩阵, 前一步学到的主题信息会反过来用于input embedding的更新,让同一个paragraph里的单词都学到部分主题信息。而paragraph-id自身对应的向量在每个滑动窗口都会被更新一次,更新用到之前paragraph的信息和窗口内的词向量信息。

vwI(new)=vwI(old)−⋅∑j=1Vej⋅vw′jv_{w_I}^{(new)} = v_{w_I}^{(old)} – \eta \cdot \sum_{j=1}^V e_j \cdot v_{w^{‘}j}

之前有看到把paragraph-id对应向量的信息说成上下文信息,但感觉会有点高估PV-DM的作用,由于这儿仍旧停留在词袋模型,并没有考虑真实考虑到词序信息。只是经过不同paragraph对应不同的向量,来区分相同单词在不同主题内的词共现信息的差异,更近似于从概率到条件概率的改变。而paragrah-id对应的vector,感觉更多是以比较奥妙的方法得到的加权的word embedding。

PV-DBOW练习

PV-DBOW和Skip-gram的结构近似,skip-gram是中间词猜测上下文, PV-DBOW则是用paragraph对应向量来猜测文本中的任意词汇。和上面的PV-DM比较,也便是进一步省掉了window内的词汇,所以长处便是练习所需内存占用会更少。

无所不能的Embedding3 - word2vec->Doc2vec[PV-DM/PV-DBOW]

作者表示大都情况下PV-DM都要比PV-DBOW要好。不过二者一同运用,得到两个文本向量后做concat,再用于后续的监督学习作用最好。

模型猜测

doc2vec和word2vec一个显着的差异,便是对样本外的文本向量是需求从头练习的。以PV-DM为例,在infer阶段,咱们会把单词的input embedding,output embedding,以及bias都freeze,只对样本外的document embedding进行练习,因此doc2vec的猜测部分是相对耗时的,由于也需求必定数量的epochs来保证样本外的document embedding收敛。这个特色部分降低了doc2vec在实际运用中的可用性。

Gensim实践

这儿咱们基于Gensim供给的word2vec和doc2vec模型,咱们分别对搜狗新闻文本向量的建模,比照下二者在文本向量和词向量类似召回上的差异。

练习集测验集比照

上面说到Doc2vec用PV-DM练习会得到练习集的embedding,对样本外文本则需求从头练习得到猜测值。基于doc2vec这个特色,咱们来比照下同一个文本,练习的embedding和infer的 embedding是否存在差异。代码里咱们默许样本内文本可以经过传入tag得到,这个和gensim的TaggedDocument逻辑共同,而样本外文本需求直接传入分词tokens。所以只需把练习样本从token传入,再按类似度召回最类似的文本即可。这儿infer的epochs和练习epochs共同.

无所不能的Embedding3 - word2vec->Doc2vec[PV-DM/PV-DBOW]

在以上的结果中,咱们发现同一文本,样本内和样本外的cosine类似度高达0.98,尽管infer和练习embedding不完全共同,但显着高于和其他文本的类似度。这个测验不能用来衡量模型的准确性,但可以作为sanity check。

文本向量比照

咱们比照下Doc2vec和Word2vec得到的文本向量,在召回类似文本上的体现。先看短文本,会发现word2vec和doc2vec体现相对共同,召回的类似文本共同,由于对短文本来说上下文信息的影响会小。

无所不能的Embedding3 - word2vec->Doc2vec[PV-DM/PV-DBOW]

在长文本上(文本太长不方便展现,详见JupyterNotebook),word2vec和doc2vec差异较显着,但在随机选取的几个case上,并不能显着感知到doc2vec在长文本上的优势,当然这或许和模型参数选择有关。

对此更有说服力的应该是Google【Ref2】对几个文本向量模型在wiki和arivx数据集的召回比照,他们分别比照了LDA,doc2vec,average word embedding和BOW。 尽管doc2vec在两个数据集的准确度都是最高的。。。算了把accuracy放上来大家自己感触下吧。。。doc2vec的优势真的并不显着。。。再一看呦呵最佳embedding size=10000,莫名有一种大力出奇迹的感觉。。。

无所不能的Embedding3 - word2vec->Doc2vec[PV-DM/PV-DBOW]

无所不能的Embedding3 - word2vec->Doc2vec[PV-DM/PV-DBOW]

词向量比照

考虑咱们用的PV-DM建模在练习文本向量的一同也会得到词向量,这儿咱们比照下在相同corpus,相同参数的word2vec和doc2vec得到的词向量的差异。

考虑北京今年雨水多到的让我以为到了江南,咱们来看下下雨类词汇召回的top10类似的词,由上到下按词频从高到低排序。

无所不能的Embedding3 - word2vec->Doc2vec[PV-DM/PV-DBOW]

比较简单发现关于高频词,Doc2vec和word2vec得到的词向量类似度会更挨近,也比较符合逻辑由于高频词会在更多的doc中呈现,因此遭到document vector的影响会更小(被均匀)。而相对越低频的词,doc2vec学到的词向量表达,会带有更多的主题信息。如果说word2vec是把语料里一切的document混在一同练习得到general的词向量表达,doc2vec更类似于学到conditional的词向量表达。所以脱离当时语料,doc2vec的词向量实用价值比较玄学,由于不太说的清楚它到底是学到的了啥。

全体看来PV-DM/DBOW没有特别眼前一亮的感觉,不过毕竟是14年的论文了,这只是文本表征的冰山一角,后面还能扯出一系列的encoder-decoder,transformer框架啥的。预知后事如何,咱慢慢往后瞧着~

欢迎留言吐槽以及评论哟~

无所不能的embedding系列 github.com/DSXiangLi/E… 无所不能的Embedding1 – Word2vec模型详解&代码实现 无所不能的Embedding2 – FastText词向量&文本分类


Reference

  1. Quoc V. Le and Tomas Mikolov. 2014. Distributed representations of sentences and documents. [Google]
  2. Andrew M Dai, Christopher Olah, Quov. 2015. Document Embedding with Paragraph Vectors[Google]
  3. Sanjeev Arora, Yingyu Liang, and Tengyu Ma. 2017. A simple but tough-to-beat baseline for sentence embeddings .
  4. Han Jey Lau and Timothy Baldwin. 2016. An Empirical Evaluation of doc2vec with Practical Insights into Document Embedding[IBM]
  5. Craig w. 2019. Improving a tf-idf weighted document vector embedding.tripAdvisor
  6. radimrehurek.com/gensim/mode…
  7. zhuanlan.zhihu.com/p/50443871
  8. www.bookstack.cn/read/huaxia…
  9. supernlp.github.io/2018/11/26/…
  10. d0evi1.com/paragraph2v…