word2vec是Google开源的一款用于词向量计算 的工具,可以很好的度量词与词之间的相似性;
word2vec建模是指用CBoW模型或Skip-gram模型来计算不同 词语的向量(word vector)
CBoW是给定上下文来预测输入词、Skip-gram给定输入词预测上下文,但最终都会得到词向量矩阵W
在深入word2vec之前,首先回顾下nlp中的一个基本问题:如何计算一段文本序列在某种语言下出现的概率?(Ngram)
统计语言模型给出了这一类问题的一个基本解决框架。对于一段文本序列:它的概率可表示为:
即将序列的联合概率转化为一系列条件概率的乘积。问题变成了如何去预测这些给定previous words下的条件概率:
由于其巨大的参数空间,这样一个原始的模型在实际中并没有什么用。我们更多的是采用其简化版本——Ngram模型:
常见的如bigram模型(N=2)和tirgram模型(N=3)。事实上,由于模型复杂度和预测精度的限制,我们很少会考虑N>3的模型。我们可以用最大似然法去求解Ngram模型的参数——等价于去统计每个Ngram的条件词频。为了避免统计中出现0概率问题(一段从未在训练集中出现过的Ngram片段会使整个序列的概率为0),人们基于原始的Ngram模型进一步发展出了back-off trigram模型(用低阶的bigram和unigram代替0概率的trigram)和interpolated trigram模型(将条件概率表示为unigram、bigram、
trigram三者的线性函数)。
不过Ngram模型仍有局限性。首先无法处理N>3的词序列(实际应用中>3会发生参数空间的爆炸式增长,维度灾难问题),其次它并没有考虑词与词之间的内在联系性(只是概率的词频统计)。例如,考虑"the cat is walking in the bedroom"这句话。如果我们在训练语料中看到了很多类似“the dog is walking in the bedroom”或是“the cat isrunningin the bedroom”这样的句子,那么,即使我们没有见过这句话,也可以从“cat”和“dog”(“walking”和“running”)之间的相似性,推测出这句话的概率。然而, Ngram模型做不到。
于是,人们就自然而然的想到,能否用一个连续的稠密向量去刻画一个word的特征呢? 这样我们不仅可以去刻画词与词之间的相似度,还可以建立一个从向量到概率的平滑函数模型,使得相似的词向量可以映射到相近的概率空间上。这个稠密连续向量也被称为word的distributed representation(分布式表示)。
事实上,这个概念在信息检索(Information Retrieval)领域早就已经被广泛使用了。只不过在IR领域里,这个概念被称为向量空间模型(Vector Space Model,以下简称VSM)。
VSM是一种Statistical Semantics Hypothesis:语言的统计特征隐藏着语义的信息(Statistical pattern of human word usage can be used to figure out what people mean)。例如,两篇具有相似词分布的文档可以被认为是有着相近的主题。这个Hypothesis有很多衍生版本。其中,比较广为人知的两个版本是Bag of Words Hypothesis和Distributional Hypothesis。前者是说,一篇文档的词频(而不是词序)代表了文档的主题;后者是说,上下文环境相似的两个词有着相近的语义。后面我们会看到word2vec算法也是基于Distributional的假设。
那么,VSM是如何将稀疏离散的one-hot词向量映射为稠密连续的Distributional Representation的呢?
简单来说,基于Bag of Words Hypothesis(词袋假设),我们可以构造一个term-document(关联矩阵)矩阵A:矩阵的行Ai,: 对应着词典里的一个word,矩阵的列A:,j 对应着训练预料里的一篇文档;矩阵里的元素Ai,j代表着word wi 在文档Dj 中出现的次数(或频率)。那么我们就可以提取列向量作为word的语义向量(不过,实际应用中,我们更多的是用列向量做为文档的主题向量,即一篇文档的词频代表了文档的主题)
term-document关联矩阵:
doc 1:new home sales top
forecasts doc 2:home sales rise in july doc 3:increase in home sales
in july doc 4: july new home sales rise
类似的,我们可以基于Distributional Hypothesis(分布式特征表达猜想/上下文特征表示)构造一个word-context的矩阵。与term-document相比,矩阵的列变成了context里的word,矩阵的元素也变成了一个context窗口里word的共现次数。word-context矩阵 通过统计一个事先指定大小的窗口内的word共现次数,不仅可以刻画word的语义信息,还在一定程度上反映了word的语法结构信息。
for example:I like deep learning; I like NLP; I enjoy flying;
设置窗口的大小为1, 得到word-context矩阵:
注意,这两类矩阵的行向量所计算的相似度有着细微的差异:term-document矩阵会给经常出现在同一篇document里的两个word赋予更高的相似度;而word-context矩阵会给那些有着相同context的两个word赋予更高的相似度。后者相对于前者是一种更高阶的相似度,因此在传统的信息检索领域中得到了更加广泛的应用。
鉴于Ngram等模型的不足,2003年,Bengio等人发表了一篇开创性的文章:A neural probabilistic language model[3]。在这篇文章里,他们总结出了一套用神经网络建立统计语言模型的框架(Neural Network Language Model,以下简称NNLM),并首次提出了word embedding的概念(虽然没有叫这个名字),从而奠定了包括word2vec在内后续研究word representation learning的基础。
NNLM模型的基本思想可以概括如下:
值得注意的一点是,这里词向量也是要学习的参数。
在03年的论文中,Bengio等人采用了一个简单的前向反馈神经网络 来拟合一个词序列的条件概率
(计算Ngram概率)。整个模型的网络结构见下图:
我们将整个模型拆分成两部分加以理解:
我们可以通过最小化一个cross-entropy(交叉熵)的正则化损失函数来调整模型的参数θ:
其中,模型的参数θ包含了Embedding层矩阵C的元素,和前向反馈神经网络g里的权重。这是一个巨大的参数空间。不过,在用SGD(一种梯度下降的方法)学习更新模型的参数时,并不是所有的参数都需要调整(例如未在输入的context中出现的 词对应的词向量)。计算的瓶颈主要在softmax层的归一化函数上(需要对词典中所有的word计算一遍条件概率)。
下面给出softmax函数曲线和计算方程及计算方法:
∞
∞
(图片来自网络)
其中,Vi 是分类器前级输出单元的输出。i 表示类别索引,总的类别个数为 C。Si 表示的是当前元素的指数与所有元素指数和的比值。关于softmax详细信息,请看这个链接
然而,抛弃复杂的参数空间,我们不禁要问,为什么这样一个简单的模型会取得巨大的 成功呢?
仔细观察这个模型你就会发现,它其实在同时解决两个问题:一个是统计语言模型里关注的条件概率的计算;一个是向量空间模型里关注的词向量的表达。而这两个问题本质上并不独立。通过引入连续的词向量和平滑的概率模型,我们就可以在一个连续空间里对序列概率进行建模,从而从根本上缓解数据稀疏性和纬度灾难的问题。另一方面,以条件概率
为学习目标去更新词向量的权重,具有更强的导向性,同时也与VSM里的Distributional Hypothesis不谋而合。
一个问题是,同Ngram模型一样,NNLM模型只能处理定长的序列。在03年的论文里,Bengio等人将模型能够一次处理的序列长度N提高到了5,虽然相比bigram和trigram已经是很大的提升,但依然缺少灵活性。因此,Mikolov等人在2010年提出了一种RNNLM模型,用递归神经网络代替原始模型里的前向反馈神经网络,并将Embedding层与RNN里的隐藏层合并,从而解决了变长序列的问题。
另一个问题就比较严重了。NNLM的训练太慢了。即便是在百万量级的数据集上,即便是借助了40个CPU进行训练,NNLM也需要耗时数周才能给出一个稍微靠谱的解来。显然,对于现在动辄上千万甚至上亿的真实语料库,训练一个NNLM模型几乎是一个impossible mission。
这时候,还是那个Mikolov站了出来。他注意到,原始的NNLM模型的训练其实可以拆分成两个步骤:
而NNLM模型的计算瓶颈主要在第二步。
如果我们只想得到word的连续特征向量,是不是可以对第二步里的神经网络模型进行简化呢?
Mikolov是这么想的,也是这么做的。他在2013年一口气推出了两篇paper,并开源了一款计算词向量的工具——至此,word2vec横空出世,主角闪亮登场。
有了前边的基础,理解word2vec就变的很简单了。
首先,我们对原始的NNLM模型做如下改造:
得到的模型称之为CBOW模型(Continuous Bag-of-Words Model),也是word2vec算法的第一个模型
上边可以不看;
简单介绍下图二 CBOW参数的含义:
所以需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W‘。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量就是我们想要的词向量(word embedding)这个W矩阵(所有单词的word embedding)也叫做look up table。
详细例子,请看这里
CBoW模型依然是从context对target word的预测中学习到词向量的表达。反过来,我们能否从target word对context的预测中学习到word vector呢?答案是可以的:
关于skip-gram的详细介绍,请看这里
这个模型被称为Skip-gram模型(名称源于该模型在训练时会对上下文环境里的word进行采样)。
如果将Skip-gram模型的前向计算过程写成数学形式(只是一个softmax),我们得到:
其中,Vi 是Embedding层矩阵里的列向量,也被称为wi的input vector。Uj 是softmax层矩阵里的行向量,也被称为wi 的output vector。
因此,Skip-gram模型的本质是计算输入word的input vector与目标word的output vector之间的余弦相似度,并进行softmax归一化。我们要学习的模型参数正是这两类词向量。
然而,直接对词典里的V个词计算相似度并归一化,显然是一件及其耗时的impossible mission。为此,Mikolov引入了两种优化算法:层次Softmax(Hierarchical Softmax)和负采样(Negative Sampling)。
层次Softmax的方法最早由Bengio在05年引入到语言模型中。它的基本思想是将复杂的归一化概率分解为一系列条件概率乘积的形式:
其中,每一层条件概率对应一个二分类问题,可以通过一个简单的逻辑回归函数去拟合。这样我们对V个词的概率归一化问题,转化成了对logV个词的概率拟合问题。
我们可以通过构造一颗分类二叉树来直观地理解这个过程。未完...
参考文献:
S
原文:https://www.cnblogs.com/go-ahead-wsg/p/11603441.html