01-word2vec

Word2Vec介绍

Word2Vec是一个将单词转换成向量形式的工具。可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度。(Word Embedding是根据该word在句中的上下文来决定的)可以提高模型的泛化能力。


1.在应用中充当语言模型

2.什么是语言模型?

我说的一句话中,后一个词出现的概率总是和前一个出现的概率是相关的。

如 我 = p(w1),今天=p(w2|w1)=“我”出现的情况下,“今天”出现的概率

3.存在的问题

最后一个词的概率,如果句子过长会导致计算量过大,同时后一个词和前一个词组合的可能性越多,那么计算量也会增大。


4.一种解决办法-N-gram


之前是后一个词出现的概率只和前一个词有关,这样会导致数据稀疏和参数空间太大。

现在在改进之后,后一个词出现的概率会和前N个词有关。

4.1例子:下面以 I want Chinese food 为例

如这里统计了一个语料库,以1-gram为例。i 出现的次数是2533,eat 在i后面出现的次数是9,那么概率为 9 / 2533 ≈ 0.0036.


4.2N-gram模型参数的量级

N代表语料库词的个数,n代表是依赖前几个词。通常会让n=2或3。


5.词向量(word to vector)

人类认识词,但是计算机认识0和1,那么这时候就需要使用一种方法(如One-hot编码)转换这些词让计算机来识别这些词。但是这样的方法过于简单,现在需要的词向量需要能够代表存在一种潜在的含义。



向量就是一些值的排列,可以让它的值的范围在-1到1之间,同时也可以向量的维度,向量的维度与向量的复杂程度呈正相关。

在语料库中,词和词之间是有一定的距离的。

此前提到的词向量在向量空间生成的时候要代表一定的含义就是,意思相似的词,他们之间的距离应该是相近的。(即生成的向量空间和真实的语言越相关,那么计算机所生成的语言也会越相关。or 两个词上下文相似,则它们的语义也相似)

6.词向量在神经网络模型中的应用(2003)

鉴于N-gram等模型的不足,2003年,Bengio等人发表了一篇开创性的文章:A neural probabilistic language model。在这篇文章里,他们总结出了一套用神经网络建立统计语言模型的框架(Neural Network Language Model,以下简称NNLM),并首次提出了word embedding的概念(虽然没有叫这个名字),从而奠定了包括word2vec在内后续研究word representation learning的基础。




7.Word2Vec:CBOW 含有一定层次的Softmax

Word2Vec实际上是两种不同的方法:Continuous Bag of Words (CBOW)Skip-gram。CBOW的目标是根据上下文来预测当前词语的概率。Skip-gram刚好相反:根据当前词语来预测上下文的概率(如下图所示)。这两种方法都利用人工神经网络作为它们的分类算法。起初,每个单词都是一个随机 N 维向量。经过训练之后,该算法利用 CBOW 或者 Skip-gram 的方法获得了每个单词的最优向量

7.1CBOW简介


预测的概率值越大越好。

7.2为什么要用Hierarchical Softmax模型?

因为CBOW最后OUTPUT得到的词向量维度太高,此时利用Hierarchical Softmax模型作为CBOW的输出层OUTPUT,来解决高纬度问题并保证词向量都完备没有丢失。它利用哈夫曼树构造多个二分类,让词向量达成了这种分层的思想。


取一个适当大小的窗口当做语境(上下文),输入层读入窗口内的词,将它们的向量(K维,初始随机)加和在一起,形成隐藏层K个节点。输出层是一个巨大的二叉树,叶节点代表语料里所有的词(语料含有V个独立的词,则二叉树有|V|个叶节点)。而这整颗二叉树构建的算法就是Huffman树。这样,对于叶节点的每一个词,就会有一个全局唯一的编码,形如"010011",不妨记左子树为1,右子树为0。接下来,隐层的每一个节点都会跟二叉树的内节点有连边,于是 对于二叉树的每一个内节点都会有K条连边,每条边上也会有权值。

7.3哈夫曼树


构造目的和带权路径最短:让不同的节点能够有优先级,如高频使用的单词让它们的带权路径长度尽量小。

7.3.1哈夫曼树的构造以及哈夫曼编码


权重小的节点置于左边;哈夫曼编码左为0,右为1,则D的哈夫曼编码为0,A的哈夫曼编码为111。

Hierarchical Softmax 就是利用这种分层的思想,将优先级更高的向量放在前面。

7.4CBOW模型

7.4.1Logistic回归模型


其实Softmax就是一个多分类的逻辑回归,由多个逻辑回归组合在一起。

7.5CBOW原理

7.6CBOW参数含义约定

7.7CBOW求解实例


右为正例。左为负例。将刚才CBOW的θ数量级压缩成log级别,都压缩到了非叶子节点上。形成了四条决策路径,四个sigmoid。

7.7CBOW求解目标函数


根据上面的实例和约定好的参数含义,利用最大似然函数得到目标函数,这里用到log函数的公式对目标函数进行了展开。目标函数的目标让其中的概率p值越大越好。

7.8CBOW梯度上升求解最优参数

既然要让目标函数得到最大值(极值),那么就是一个梯度上升的问题。

对函数进行求导,那么导数点为极值点。η为学习率, x_w为投影层向量

似然函数是由很多的θ参数决定的,那么似然函数对它求偏导即可解决θ的更新问题。



x_w参数对于目标函数也有一定影响,那么也可以对x_w投影层词向量进行更新,同理,似然函数对齐求偏导。



Google出品的word2vec,它认为每个词向量v(w)都与和向量X_w是相关的,那么直接将X_w的更新量整个应用到每个单词的词向量上去。好处是所有的词向量更新会有整体的趋势,分配的空间是类似的,保证属于上下文的逻辑。

即沿着最大最好的优化目标,提出梯度上升的解决方案,用这种方案不断的优化更新θ和X_w,最终得到每个词的词向量v(w)。

7.8总结

对于语料库中的某个词w_t,对应着二叉树的某个叶子节点,因此它必然有一个二进制编码,如"010011"。在训练阶段,当给定上下文,要预测后 面的词w_t的时候,我们就从二叉树的根节点开始遍历,这里的目标就是预测这个词的二进制编号的每一位。

即对于给定的上下文,我们的目标是使得预测词的二 进制编码概率最大。形象地说,我们希望在根节点,词向量和与根节点相连经过 logistic 计算得到 bit=1 的概率尽量接近 0,在第二层,希望其 bit=1 的概率尽量接近1,这么一直下去,我们把一路上计算得到的概率相乘,即得到目标词w_t在当前网络下的概率P(w_t),那么对于当前这个 sample的残差就是1-P(w_t),于是就可以使用梯度下降法训练这个网络得到所有的参数值了。显而易见,按照目标词的二进制编码计算到最后的概率 值就是归一化的。

Hierarchical Softmax用Huffman编码构造二叉树,其实借助了分类问题中,使用一连串二分类近似多分类的思想。例如我们是把所有的词都作为输出,那么“桔 子”、“汽车”都是混在一起。给定w_t的上下文,先让模型判断w_t是不是名词,再判断是不是食物名,再判断是不是水果,再判断是不是“桔子”。

但是在训练过程中,模型会赋予这些抽象的中间结点一个合适的向量,这个向量代表了它对应的所有子结点。因为真正的单词公用了这些抽象结点的向量,所 以Hierarchical Softmax方法和原始问题并不是等价的,但是这种近似并不会显著带来性能上的损失同时又使得模型的求解规模显著上升。

没有使用这种二叉树,而是直接从隐层直接计算每一个输出的概率——即传统的Softmax,就需要对|V|中的每一 个词都算一遍,这个过程时间复杂 度是O(|V|)的。而使用了二叉树(如Word2vec中的Huffman树),其时间复杂度就降到了O(log2(|V|)),速度大大地加快了。

现在这些词向量已经捕捉到上下文的信息。我们可以利用基本代数公式来发现单词之间的关系(比如,“国王”-“男人”+“女人”=“王后”)。这些词向量可 以代替词袋用来预测未知数据的情感状况。该模型的优点在于不仅考虑了语境信息还压缩了数据规模(通常情况下,词汇量规模大约在300个单词左右而不是之前 模型的100000个单词)。因为神经网络可以替我们提取出这些特征的信息,所以我们仅需要做很少的手动工作。但是由于文本的长度各异,我们可能需要利用 所有词向量的平均值作为分类算法的输入值,从而对整个文本文档进行分类处理。

然而,即使上述模型对词向量进行平均处理,我们仍然忽略了单词之间的排列顺序对情感分析的影响。即上述的word2vec只是基于词的维度进行"语义分析"的,而并不具有上下文的"语义分析"能力。

同时,Word2Vec是对于每个local context window单独训练,没有利用包含全局共现矩阵global co-currence中的统计信息;它对多义词无法很好的表示和处理,因为使用了唯一的词向量。

8.用负采样模型Negative Sampling来分类,进而训练word2vec的网络模型

利用Hierarchical Softmax 分层来训练Word2Vec中的参数,······可能有些啰嗦和计算量过大,现在用另一种方法。

比如有一个句子 我今天想打___.

给定上下文的语境下去预测词,给定正样本是 球, 负样本是除球之外的词,比如 人、动物、气球等等。



假设output映射出了10w个词向量,规定一个词向量为正样本,那么负样本就会有很多,那么我们该如何选择恰当的负样本?




得到似然目标函数。

利用似然函数对θ和X_w参数进行求偏导.



最终得到了优化好的v(w),此时就是我们想要的词向量。

9.Skip-gram和CBOW使用场景

根据样本量的大小,如果数据量大的话使用Skip-gram,反之使用CBOW。


10.工具


Python 使用gensim即可。

11.实战:word2vec工具训练中文模型

Python的话可用jieba完成分词,生成分词文件wiki.zh.text.seg,然后接着用word2vec工具训练。

https://www.zybuluo.com/hanxiaoyang/note/472184

你可能感兴趣的:(01-word2vec)