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都有着两个词向量:

  • vww为中心词时所对应的词向量
  • uww为文本词时所对应的词向量

Word2vec的基本想法是这样的:

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

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

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

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

L(θ)=i=1TmjmP(wt+j|wt;θ)

注意:

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

  • j0

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

J(θ)=1TlogL(θ)=1Ti=1TmjmlogP(wt+j|wt;θ)

注意:

  • 运用了公式logab=loga+logb
  • j0

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

自然地,在定义完毕后,我们考虑:如何计算P(wt+j|wt;θ)

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

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

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

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

P(o|c)=exp(uoTvc)WVexp(uWTvc)

其中:

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

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

以下内容 Upd on April-4th

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

应该如何表示其词向量?

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

实际上非常简单:

vbank=α1vbank1+α2vbank2+α3vbank3

其中:

  • αi=fif1+f2+f3,系数就是不同词义的词出现的频率

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