首页 > > > 4.2Doc2Vec技术
前言
上文我们讲述了如何将一个词变成一个向量,并且引入了Word2vec模型,它使得词在向量化之后变得稠密并且具有语义特征。但是在自然语言处理中,我们要处理的并非词,而通常是一篇文档。说到这里,聪明的同学可能就会想到,既然Word可以变成Vector,那么文档是不是也可以变成Vector呢?这是一个自然而然的想法。比如我们很自然地会想到,既然每个词都是一个向量,我们把一句话或者一篇文章所有词汇的向量做个加和,再平均一下,是不是就可以描述这句话或者这篇文章所描述的内容呢。理论上这样做确实有一定的道理,这相当于求这句话或者这篇文章在空间的“重心”位置。当然在此之上是可以继续使用kNN,欧氏距离等等这些概念来做进一步的算法模型的。不过,本节我们介绍一种比刚刚这种求重心的效果更好一些的效果,可以把文章句子转化成为一个向量——源于论文《Distributed Representations of Sentences and Documents》所介绍的一种方法,俗称Doc2Vec,与Word2Vec一并成为目前业界比较流行的解决方案。
Doc2vec又叫Paragraph Vector是由Tomas Mikolov基于word2vec模型提出的。我们上节说过,word2vec里预测词向量时,预测出来的词是含有词义的,比如上文提到的词向量'海南'会相对于'小明'离'珠海'距离更近些。那么同理,我们只要构造和word2vec相同的结构,按理也能训练出具有语义关系的句向量或者说文档向量。构建一个句子向量有很多种方法,今天我们接着word2vec来介绍下Doc2vc,看下Doc2vec是怎么训练一个句子向量的。
Doc2Vec的训练方法很简单,如果上文CBOW的过程基本理解的话,这个过程也没问题,我们看着图来说基本就可以知道了。

比如现在我们有1000篇文章,用这1000篇文章来做一个Doc2Vec的训练,那么就要构造这样一个方式。这里跟CBOW训练方式类似,不过不是“夹心饼——不是用两边的词预测中间的词,而是用前面的词直接预测后面的词,比如这个文档中有一句话“中国是亚洲强国”,首先将每篇文章的ID和语料库中的所有词初始化为一个K维的向量(K是所有词的数量+文档的数量,示例中是5维),然后我们按照CBOW的方式用前面三个词去预测最后一个词,不同的是,这里我们把文章ID带上了。比如,上图的这个文档,在训练Word2vec的时候,我们的输入是“中国”,“是”,“亚洲”这三个词的one-hot向量,而我们这里是多加了一个文章ID的向量去一起训练它。这里一共是4个向量(红色的是文章ID,橙色的词),用这个4个向量乘以一个W矩阵,就会得到4个稠密向量。然后,把它们做个平均(或者首尾相接),最后再用softmax函数对输出进行映射去预测出“强国”的one-hot向量。
在这个训练过程中,文章的ID与其他三个词同时参与了训练。因此在训练的过程中文章ID这个稠密向量(红色部分)一定能学到一些东西。至于能学到什么东西呢?从直观的角度来看,要预测“强国”这个词,除了要参考它前面的“中国”,“是”,“亚洲 ”这三个词以后,还要参考文章向量,这个向量可以理解为这篇文章的背景知识或话题是什么。只不过这个话题描述出来是一个稠密且连续的向量而不是一个“军事”、“文化”、“经济”这种硬邦邦的排他性标签。
值得一提的是,这个文章的向量,在同一篇文章里面的训练是不变的,也就是说在同一篇文章每次滑动取若干词训练的过程中,每次训练的输入层是共享同一个文章向量的,这就意味着在每次训练中不仅仅是参考预测词前后几个词的特征,而之前训练过的词特征也能考虑进来,这样训练出来的向量表达的主旨会越来越准确。那么这个训练的目的就得到了,就是靠这种无监督的大量文章的输入,最终学到对文章背景与话题的描述能力。
既然我们训练完了模型,那么下面来说下Doc2vec是如何做预测的。这里的预测有两种,一种就是参与训练的文章向量预测,另一种是未参与训练的文档向量预测。第一种情况很简单,跟word2vec是一样的,我们只要用文章ID去矩阵中查到它的向量描述即可。然而,对于一篇没见过的文章,这种方法是行不通的。因为新来的文章并没有参与one-hot编码,自然也找不到对应的文章ID。不过也没关系,模型我们已经训练好了,只要利用现有的模型反推前面的文章向量即可。

那么就让这篇待预测的文档输入模型,用一个同等大小的滑动窗口去滑动输入。比如有

到

一共1000个词汇,那就应该从输入

预测

,输入

预测

,一直到

预测

。不同的是,这次的预测,W矩阵和Softmax函数直接用训练好的,不对它们进行更新。而误差产生的根源,我们理解只来自于文章向量,只要文章向量准确的话,预测就是准确的。所以在这个迭代的过程中我们对文章向量做梯度下降来更新它,把它更新到误差最低的值,图中用

来表示它的梯度。
不过这里有两个细节需要注意一下:
一个是,在预测的过程中文档的向量应该初始化成什么?初始化很偏斜的话估计会对迭代的结果有影响的。具体每个人在实现的过程中可能方法是不同的。可以是一个全0的向量,可以是一个全1的向量,也可以是一个以原来训练时用的所有文档向量的平均值初始化。
另一个,是在预测的过程中应该迭代多少次。如果按照刚刚我们描述的过程,那么肯定是越长的文档迭代次数越多,那么预测出来就越准,因为更新的机会多。短文档出来就差一些,因为更新的机会少。不过这也讲道理啊,文章越短所能描述的信息越有限,越不容易说清楚要讲什么话题。
Doc2vec模型可以在分类任务中使用,也可以用来做文档的摘要。总之每个文档都可以得到一个向量来描述它的内容,而且这个向量是连续的稠密的。如果你从来没有接触过这类向量的话,可以这样想象,不论是Word2Vec还是Doc2Vec,最后生成的稠密向量都是类似:[2.35,1.23,2.43,...,0.133]这种形式的,有几百维,每个维度都是某一种特征属性,只不过人无法阅读,但是在空间中有几何意义可以加减,这样就可以了。如你对本节有疑问,欢迎在讨论区与我讨论。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69954080/viewspace-3126556/ ,如需转载,请注明出处,否则将追究法律责任。