word2vec生成词向量原理

假设每个词对应一个词向量,假设:

1)两个词的相似度正比于对应词向量的乘积。即:$sim(v_1,v_2)=v_1cdot v_2$。即点乘原则;

2)多个词$v_1sim v_n$组成的一个上下文用$C$来表示,其中$C=sum_{i=1}^{n}v_i$。$frac{C}{|C|}$称作上下文C的中心向量。即加和原则;

3)在上下文$C$中出现单词$A$的概率正比于能量因子$e^{-E(A,C)},where E=-Acdot C$。即能量法则(可参看热统中的配分函数)。

因此:

[p(A|C)=frac{e^{-E(A,C)}}{sum_{i=1}^Ve^{-E(v_i,C)}}=frac{e^{Acdot C}}{sum_{i=1}^Ve^{v_icdot C}}~~~~(1)]

其中$V$是整个词汇空间。

$ref{1}$的分母计算是非常耗时的,下面推导比较方面快速的计算$ref{1}$的方法。

把整个词汇空间分成两部分$G$和$H$,同时在下面的公式中$G$和$H$也表示各自的词向量中心,并且设$A$存在于$G$中,则:

[p(A|C)=p(A|G,C)cdot p(G|C) ~~~~(2)]

where,

[p(G|C)=frac{e^{Gcdot C}}{e^{Gcdot C}+e^{Hcdot C}}=frac{1}{1+e^{(H-G)cdot C}}~~~~(3)]

and,

[p(A|G,C)=frac{e^{Acdot C}}{sum_{win G}e^{wcdot C}}~~~~(4)]

引入$sigmoid$函数$sigma(x)=1/(1+e^{-x})$,则

[p(G|C)=sigma(-(H-G)cdot C)=sigma((G-H)cdot C)]

$p(G|C)$只是简单的计算两部分向量之差,不能再简化了。

另外,根据上述定义,很容易得到这个关系$p(G|C)=1-(H|C)$,因为$C$要么落在$G$要么落在$H$。

观看$ref{4}$,则知$p(A|G,C)$是另一个版本的$p(A,C)$,只是词汇空间从$V ightarrow G$而已。然后我们继续拆分$G$递归的计算下去,最后只需要计算各兄弟部分的向量差而已。这是一个典型的二叉树,划分规则在开始就可确定,如果考虑查询效率的话,就是一个霍夫曼树。其中每个叶子节点表示一个单词,每个中间节点$G~ or~ H$的向量为所有子向量的中心。

展开来就是:

[p(A|C)=prod sigma((G_i-H_i)cdot C)]

那么问题来了,这个词向量是怎么搞出来了?学习词向量哪家强?

现在我们这里有一堆的语料,一行一行分好词的,语料那是相当的多,以至于它涵盖了自然语言中的所有正确句子,每个单词在它所在的位置都是恰到好处。现在每个单词我们有一个对应的词向量,我们怎么来衡量这批词向量的好坏呢。

这批词向量张成一个自然语言的空间(从线性代数来说这样描述可能不太准确),它自己规定的自然语言空间,在这个空间中,它可以导出给定语料在它的空间中出现的概率。熟悉吧,这就是语言模型。

我们可以根据词向量计算出来每个单词在它的位置出现的概率,然后这整个语料在这个向量空间中出现的概率就等于每个词在其位置出现概率的乘积。

即,

[p(T)=prod p(w_i|Context_i)~~~~(5)]

 $T$为整个语料样本,$Context_i$为单词$i$的上下文,理论上是扣除该单词后剩下的所有单词包括位置。当然了,我们只考虑它的前后$c$个邻居。

我们的目标是使$ref 5$最大化,实际中是加$log$加负之后的最小化。怎么以高效率优化这个目标函数呢,这是一个典型的运筹学问题,而且还是非线性规划。我要翻一下运筹学的教材了。

原文地址:https://www.cnblogs.com/wuseguang/p/4081207.html