NLP中的文本呈现--BOW&Paragraph Vector

词袋模型(BOW)

我们知道,一种最直接的单词呈现方式就是one-hot encoding,以及在文本建模时基于此的词袋模型(BOW),不可否认的是,这是一种非常直接的呈现形式,但是这种方法有两个非常大的问题。
1.文本中的语序无法体现,比如‘我爱你’ 和 ‘你爱我’ 在 BOW中的的vector是完全一样的,这显然不够合理。当然,bag-of-n-gram-word 模型可以适度地缓解这个问题,但是同时又回带来高维度的求解问题以及特征矩阵过于稀松(非常多的0)。
2.单词语义上的相似性无法体现,比如’good’ 和 ‘nice’, 以及 ‘good’ 和 ‘bad’, 第一组词的语义相近,第二组完全相反,但是通过one-hot encoding 却完全无法体现。

Paragraph Vector

基于BOW的种种弊端,google的两位大佬在2014的paper–Distributed Representations of Sentences and Documents中提出了Paragraph Vector,其实就是用一个低维dense向量来表示一个段落或句子,用到的具体方法就是Doc2vec,是不是听起来和word2vec有点像?事实也确实如此,因为word2vec也是由这两位发明的,而且Doc2vec方法也很大程度上借鉴了word2vec。

因此,这里我先复习一下word2vec。从定义上来说,word2vec就是一群用来产生词向量的相关模型组合而成的工具,两个主要模型分别是CBOW 和 skip-gram。同时需要强调的一点是无论是哪个模型,尽管它们都使用了神经网络,但是他们都不能算是一个深度神经网络的模型,因为除了input和output layer之外,它们只使用了一个hidden layer。

好,那我们先从CBOW说起。先上图:
在这里插入图片描述

总的来说,CBOW通过一个中心词周围的词来预测中心词。具体的思路如下:
1.假设我们需要中心词前后各m个词来预测中心词t。首先我们需要的是这2m个词的one-hot encoding。
然后拿这2m个词分别通过一个参数矩阵映射。这个矩阵称为input word matrix,我们把它记做V,shape=(n,|V|), 其中n代表词向量(embedding)的维度,|V|代表corpus中总的vocabulary数。假设在预测某个中心词的时候,我们恰好用到了第i个vocabulary,那么这个单词通过V映射后得到的(n,1)dim的矩阵就是这这单词的embedding结果。我们再仔细思考一下这这个参数矩阵的意义,我们的input是一个one-hot encoding,比如[0,0,0,1,0…,0],假设它为第i个单词,第i位为1,其余均为0,那么这样的一个vector与V相乘后的结果本质上就等于是V第i个column,又因为我们通过这个矩阵映射得到的就是这第i个词的词向量,那么其实我们就可以理解为这个V就是我们需要的corpus中|V|个单词的词向量集合!我们训练神经网络的过程,就是词向量不断更细迭代的过程,我们最后需要的就是经过多次迭代后的这个矩阵。OK,我们回到我们的思路…

2.当我们得到2m个单词的one-hot encoding之后,分别用V去乘这2m个one-hot encoding,根据我上面对V的解释,很容易理解的,我们得到这特定2m个词的词向量(当然在训练开始阶段,这并不是最终结果)

3.我们对这个2m个词向量作平均得到t_hat,作为t的近似。
这里必须要提的一点是这个思路是基于一个非常经典的假设,也是:在一段话中,意思相近的词往往一起出现–You shall know the meaning of a word by the company it keeps。
所以我们可以用中心词t附近的词来近似它。这里我个人的想法是用加权平均,距离中心词更近的词应该被分配更大的权重。

4.将本轮训练得到的中心词t的词向量t_hat与一个U矩阵相乘得到一个score vector z, z = Ut_hat∈ R|V|。
这里的U是output word matrix,shape=(|V|,n),相当于 V的transpose。这一步的意思是说,通过t与corpus中其余的词的词向量作dot product,可以看到说哪些词的语义和t相近,那么z中这一维的值就会高。

5.通过使用softmax 函数,得到将z转化为每一维表示概率。
y_hat= softmax(z) ∈ R|V|.

6.将y_hat和 真实t的one-hot encoding 作比较,来check模型的训练程度。
OK,现在我们已经清楚了模型的运作方式,但是如果我们想要训练我们的模型,当然需要的是定义目标函数,这里我们自然想要的是最小化y_hat与y的距离,那么距离用什么来度量呢? 这里我们用cross-entropy。
在这里插入图片描述
考虑到y的特殊性,仅有一个维度为1,因此,H(y_hat,y)可以进一步简化为
在这里插入图片描述
然后通过SGD不断对每个词进行词向量优化。

关于Skip-gram model, 逻辑上与CBOW相反,通过给定中心词,来预测周围词。大体上的思路与CBOW十分类似,这里就不再展开了。

扫描二维码关注公众号,回复: 12389787 查看本文章

这里再提一下,关于CBOW和skip-gram model 在参数优化上的问题,其中一个比较大的问题就是 由于 softmax 的normalization 需要进行|V|维的sum,这是一个非常大的计算量,因此就这一点,有两个非常著名的优化思路,分别是 Negative sampling 和 Hierarchical Softmax,感兴趣的朋友可以阅读一下我在参考文献中列出的一些文章,这里就不再展开了。

那到上面为止,我以CBOW为例介绍了word2vec的原理,下面我们开始进入doc2vec的部分。和word2vec一样么,doc2vec也有两组训练方式,其中一种叫做PV-DM(Distributed Memory Model of paragraph vectors),与上面我提到的CBOW十分类似。下面我们来看一看。
先贴出原文Distributed Representations of Sentences and Documents中的图:
在这里插入图片描述
相较于CBOW, PV-DM在输入层不仅包含词向量,也包含一个段落向量。每一个unique段落通过一个D matrix映射为一个段落向量,同时每一个unique单词通过一个W matrix 映射为一个词向量,这部分和CBOW是一致的。然后在average/concatenate时,我们不仅取词向量,同时也将生成的段落向量包含在内。然后用得到的向量来预测我们的target word。如上图所示。
OK,现在我们再来仔细思考一下这个paragraph vector,它不仅可以理解为是一个额外的词向量。同时它更可以被理解为是一个记忆。具体来说,在每一次训练中,我们都是滑动截取段落某一部分的时候,但是paragraph vector 却是共享的,用来充当段落剩余部分的一个代表。在同一个段落的多次训练中,paragraph vector会被重复训练,在不断但训练中,它会越来越精确地趋紧段落的主旨。
接下来,当我们通过随机梯度下降(SGD)等算法完成训练的时候,我们可以将每个段落训练得到的paragraph vector 作为后续机器学习的特征来使用,比如用来解决一些分类问题。但是,这里有个问题是,如何去得到extra paragraph 的对应的paragraph vector呢?比如,测试集数据。这里我们的思路是,通过将extra paragraph表示的vector添加到matrix D中,保持词向量矩阵W以及网络尾部softmax参数不变的情况下,同样使用梯度下降来训练extra paragraph对应的paragraph vector的值。

当然,如同word2vec中包含CBOW和skip-gram一样,Doc2vec同样包含两种模型,除了上述例子中的PV-DM,另一种PV-DBOW(Distributed Bag of Words of paragraph vector),类似于skip-gram,这里就不再仔细展开了,感兴趣的朋友可以阅读一下原作者的paper,链接会在参考中提供。

那么以上就是我对NLP中关于文本呈现的一个基本总结,从基本的词袋模型到引入embedding思想的word2vec以及doc2vec,因为最近在做于NLP相关的project,就顺便回顾总结了一下基本的理论,也希望能帮到有需要的朋友。

参考:1.https://cs.stanford.edu/~quocle/paragraph_vector.pdf–Distributed Representations of Sentences and Documents
2. https://www.pianshen.com/article/9749374313/

猜你喜欢

转载自blog.csdn.net/weixin_44607838/article/details/109280203
今日推荐