Word2Vec

本篇 Blog 结合了课程 Stanford CS224n 以及本人自己对 Word2Vec 的理解。

首先是传统NLP中的一些概念:

one-hot编码:每个词都是向量,这个向量中只有一个维度的值为1,其与都为0。向量的维度是由单词的个数决定的。

  • 例:有\(hotel\),\(car\),\(money\),\(book\)四个词,于是:\(hotel = [1,0,0,0]\)\(moeny = [0,0,1,0]...\)

  • 但是我们不难发现的是,字典里有很多单词,这就使每个词向量的维度过于大了。

这样的弊端使Distributional semantic开始被现代深度学习所利用。

Distributional semantic:一个词的含义是由频繁地出现在它身边的词所赋予的。

Word Vector(Embedding):单词在空间中的分布,每个维度坐标的大小是取决于经常出现在本词附件的词所赋予的。这就导致语义、类型相似的词语在空间里的分布很接近。这是因为它们在文本中附近的词语可能很相似。

  • 比如:remain和become,e.g.He remains angry,He becomes angry...

介绍了上述概念之后,我们开始接触著名的Word2vec

首先,顾名思义,2vec指的是文本中的每一个单词\(w\)都有着两个词向量:

  • \(v_w\)\(w\)为中心词时所对应的词向量
  • \(u_w\)\(w\)为文本词时所对应的词向量

Word2vec的基本想法是这样的:

  • 训练集是一个非常庞大的文本,我们go through这个文本中的每一个单词:将每一个词都作为中心词(\(c\)),并且将其周围的词作为文本词(\(o\))。使用每个词的词向量来计算概率,从而进一步得到损失函数。
  • 运用梯度下降的算法,逐步调整词向量,使损失函数最小化。

下面开始介绍Word2vec具体的公式以及实现:

上图展示了into作为中心词时的情况。对于文本中的每一个词,都有一个固定大小的window,其刻画的是所谓“中心词附近的文本词”。我们需要计算每个中心词附近文本词出现的条件概率\(P(w_{t+i}|w_i)\)

于是,考虑全局文本,我们定义Likelihood

\[L(\theta)= \prod \limits_{i=1}^T\prod_{-m\leq j\leq m}^{}P(w_{t+j}|w_t;\theta)\]

注意:

  • \(\theta\)是一个极大的列向量,它是文本中每一个单词的中心词词向量和文本词词向量的拼接,因此它表示的是所有需要调整的参数

  • \(j\neq 0\)

类似地,我们定义损失函数\(J(\theta)\),损失函数\(J(\theta)\)应当与Likelihood关系很紧密。同时,我们也应当避免随着文本量的增大而导致的损失函数增大,这是不公平的,于是,我们考虑平均的思想。

\[J(\theta) = -\frac{1}{T}\log_{}{L(\theta)} = -\frac{1}{T}\displaystyle\sum_{i=1}^{T}\displaystyle\sum_{-m\leq j\leq m}^{}\log_{}{P(w_{t+j}|w_t;\theta)}\]

注意:

  • 运用了公式\(\log_{}{ab} = \log_{}{a}+\log_{}{b}\)
  • \(j\neq 0\)

结合上面的Likelihood损失函数公式,我们发现:降低损失函数,实际上就是在增加Likelihood

自然地,在定义完毕后,我们考虑:如何计算\(P(w_{t+j}|w_t;\theta)\)

不妨先提出观点:两个词向量的点积具有描述这两个词相似性的天然属性。

  • 这个观点实际上不难理解,当某两个词向量在某个维度的正负性相同时,这表示着它们在此维度具有一定的相似性,同时它们的点积在此维度被提高;相反,如果它们在某个维度的正负性相反,说明它们在这个维度的相似性较低,因此它们的点积在此维度被削弱。

同时,考虑到概率函数的非负性,我们使用Softmax函数。

综上所述,针对中心词\(c\)以及它附件的文本词o

\[P(o|c) = \frac{exp(u_o^Tv_c)}{\textstyle\sum_{W\in V}^{}exp(u_W^Tv_c)}\]

其中:

  • \(V\)是文本中所有的单词的集合

到此,Word2vec的思想、概念以及公式以及介绍完毕,降低损失函数\(J(\theta)\)的梯度下降的算法将不在这里赘述。

以下内容 Upd on April-4th

提出一个疑问:如果一个单词具有多种意思,例如:bank,pike...

应该如何表示其词向量?

解决方法由 TACL 2018 中的论文 Linear Algebraic Structure of Word Senses,with Applications to Polysemy 提出。

实际上非常简单:

\[v_{bank} = \alpha_1 v_{bank_1} + \alpha_2 v_{bank_2} + \alpha_3 v_{bank_3}\]

其中:

  • \(\alpha_i = \frac{f_i}{f_1+f_2+f_3}\),系数就是不同词义的词出现的频率

  • 我们可能会认为,这个词向量只是不同词向量实现的一种微妙的平衡,但是事实上这种方法的结果非常好。