向量语义学习笔记(一):word embeddings 与 skip-gram 算法

向量语义基于一个假说distributional hypothesis: 语义相似的词所处的上下文也相似。因此,我们可以用一个词语所处的环境来表示它的语义。那怎样表示词语所处的环境呢?一个简单的思路就是用词频。比如,考虑digital这个单词,我们将它的“环境”限定为它前后的各四个单词,可以叫做 \pm4\word window。

... ... computer peripherals and personal digital assitants. These devices usually... ...

对语料中所有digital的\pm4\word window 进行统计,得出词频统计。

上图表示,在语料集所有digital的window中aardvark出现了0次,computer出现了1670次,data出现了1683次。因此我们可以以这样一个向量来表示digital: [0,...,1670,1683,...],向量次元素个数是词语的总数。将单词表示为向量称作word embeddings, 将词语用向量表示出来后我们就可以计算词语的语义相似度了。根据文章开头提到的假说,词语语义越相近,它们所处的上下文也越相近,因此它们的向量表示也相似。比如digital与imformation的window中computer与data的词频都很大,如果将表示digital的向量和表示information的向量点乘起来,结果也会比较大。因此,我们可以用点乘来表示两个单词向量之间的语义相近度。点乘结果越大,两个单词语义越相近。

点乘 (v,w) = v\cdot w = \sum_{i = 1}^{N}{v_{i}w_{i}} = v_{1}w_{1}+v_{2}w_{2}+...+v_{N}w_{N}

如果一个语料集中有50000个单词,那么前面介绍的这种表示方法,每个单词向量都会有50000维,实际上很多维都是0。而下面介绍的skip-gram算法就可以将单词表示为低维的、密集的向量,这有很多好处,比如:

  1. 低维向量相比于高维向量计算更快
  2. 低维向量包含更少的参数,有利于避免过拟合

skip-gram是word2vec算法的一种,另一个是CBOW,与skip-gram原理相似。skip-gram的目标是训练一个分类器,给定元组(t,c),其中t是目标单词(我们想要学习这个单词的向量表示),c是t的上下文单词,这里的上下文就是前面所说的window。比如 \pm2 word window:

... lemon, a [tablespoon of apricot jam, a] pinch... . c1 c2 t c3 c4

分类器返回c是t的上下文单词的概率:

P(+|t,c)

因为jam是apricot的上下文单词,所以我们希望分类器返回的 P(+|apricot,jam) 尽可能大。相应地,c不是t的上下文单词的概率表示为

P(-|t,c) = 1- P(+|t,c)

根据前面提到的假说,单词的相似度越大,越可能出现在相同的上下文环境中。因此可以用单词的相似度(这里是点乘)来计算c是t的上下文单词的概率。由于点乘结果不在0到1之间,需用sigmoid函数转化为概率。设单词t,c的初始化向量表示分别为t,c,概率P的计算公式为:

P(+|t,c) = \frac{1}{1+e^{-t\cdot c}}

相应地可以计算出P(-|t,c)的概率。

但这样计算出的概率只是一个单词的概率,但是在window中有多个上下文单词。skip-gram假定这些概率是相互独立的,因此多个单词的概率计算公式为:

P(+|t,c_{1:k}) = \prod_{i=1}^{k}\frac{1}{1+e^{-t\cdot c_{i}}}

学习过程中,通过不断调整向量t和c,使得正样本的概率尽可能大,负样本的概率尽可能小。最后对于一个单词,会学习到两个向量t和c, skip-gram选择的是t向量作为最终的单词向量。

skip-gram还有其它一些trick,比如负样本的选取,这里就不展开了,可以参考论文《word2vec parameter learning explained》和《speech and lauguage proccessing》chapter6

发布于 2019-11-01 19:13