Skip-gram模型理解
文章:Distributed Representations of Words and Phrases and their Compositionality
地址:https://doi.org/10.48550/arXiv.1310.4546
词嵌入(word embedding)
词嵌入技术顾名思义,就是把一堆词语映射(嵌入)到同一个空间中,不同的词处于不同位置,这些位置特征(向量)即词向量。通俗的说,词嵌入就是把不同的词转化成不同的向量。
one-hot向量
在word2vec被提出之前,人们常常用one-hot来表示词语的向量。那么如何用onehot表示词语呢?
举个例子,假设我们的语料库中只有一条句子“今天天气真好”。接下来我们会根据语料库中词的种类来创建一个词库:{今,天,气,真,好},今的词向量就可以表示为[1,0,0,0,0],同时天的词向量就可以表示为[0,1,0,0,0]。
这种方法虽然可以用来表示词语,但是同时有很多缺点:
- 无法准确表示词语之间的关系
- 在语料库非常大时,词向量的维数会非常的高,并且非常稀疏(大部分为0)
因此人们为了能够寻找一种能够更好的体现词语之间的关系,提出了word2vec模型,让nlp技术进入了词嵌入的时代,为后面的研究打下了坚实的基础。
Skip-gram模型
word2vec模型中,有skipgram和CBOW两种模型,两种模型结构分别如下图:

相关链接:https://rohanvarma.me/Word2Vec/
从上面的图中,我们可以直观的看出两种模型之间的区别,CBOW主要靠中心词的上下文来预测中心词,而skip-gram则依靠中心词来预测他的上下文。本文主要介绍skip-gram模型。
训练目标
skip-gram模型的训练目标:预测文本中某个字周围可能出现的词
我们在看一篇文章时,若是将一个词的周围几个词盖住让我们猜测,我们也能够大致的猜出被盖住部分原有的词语,因为文章中每个词语与其周围的词之间都是有关系的,也可以说,每个词都决定了和它相邻的词。skip-gram模型就是以此为动机来进行训练的。
为了完成上面的训练目标,skip-gram模型有一个长度为2c+1的滑动窗口(上图为5),这个窗口会在语料库中滑动,每滑动以此,被窗口包括在内的2c+1个词就会被用与模型的训练。窗口中心的词作为已知的词,而中心词前c个和后c个词则被盖住,我们需要通过已知的词来预测被盖住的词。我们不需要对文本做任何标记 ,也就是说这是一个非监督算法。
举个例子:
此时在我们滑动窗口内的句子为“今天 的 天气 很 好”
此时窗口长度为5,那么在窗口中心的词即“天气”,我们希望机器能够通过“天气”来预测“今天,的,很,好”这四个词语(称为背景词)。机器只会用数据说话,所以它会将他的预测表示成条件概率形式:P(今天,的,很,好∣天气)
我们假设四个被预测的之间是相互独立的,那么公式可以变成:P(今天∣天气)P(的∣天气)P(很∣天气)P(好∣天气),我们需要做的就是让这个概率尽可能的大。
优化目标
skip-gram模型的优化目标:
$$
\sum_{t=1}^T \sum_{-c \leq j \leq c, j \neq 0} \log P\left(w_{t+j} \mid w_t\right)
$$
这个式子即上面式子的归纳,T为文本长度,c为上下窗口大小。还是拿上面那句话来举例,假设我们的整个语料库为:“今天 的 天气 很 好”,但是这次我们把上下窗口大小设为3(c=1),依次滑动窗口,并将各窗口的式子相乘
$$
MaxP(的∣今天)P(今天∣的)P(天气∣的)P(的∣天气)P(很∣天气)P(天气∣很)P(好∣很)P(很∣好)
$$
此式子经过整理后就可以变成:
$$
\prod_{t=1}^{\mathrm{T}} \prod_{-\mathrm{c} \leq \mathrm{j} \leq \mathrm{c}, \mathrm{j} \neq 0} \mathrm{P}\left(\mathrm{w}{\mathrm{t}+\mathrm{j}} \mid \mathrm{w}{\mathrm{t}}\right)
$$
由于概率的连乘会导致最终的乘积非常小,因此我们考虑对式子的每一项进行log处理,使得乘积变大的同时还不会改变其单调性。处理之后,我们就可以得到一开始的优化目标。
接下来我们对式子的单项来进行讨论,为了对其有更好的理解,我们将单式改为以下形式:P(c∣w;θ)
c表示要预测的上下文词,w代表中心词,θ 代表模型参数,也可以理解成词向量,在预测词和中心词确定的情况下,概率由θ影响,我们优化也主要对它进行优化。
对于θ,我们可以这么理解:
它由两个矩阵u和v构成,u为上下文矩阵,v为中心词矩阵,两个矩阵的大小都为∣ V ∣ × n,其中∣ V ∣表示词库大小,n表示我们训练出来的词向量的维度。这两个矩阵,就是我们要训练的参数。在skip-gram中,每个词都被表示成两个d维向量分别保存在上下文矩阵和中心词矩阵中,在相应的时候取出来用。

假设我们的中心词为w,要预测的背景词为c,那么我们要求的给定中心词生成背景词的条件概率就可以表示成如下形式:
$$
\mathrm{P}(\mathrm{c} \mid \mathrm{w} ; \theta)=\frac{\mathrm{e}^{\mathrm{u}{\mathrm{c}} \cdot \mathrm{v}{\mathrm{w}}}}{\sum_{\mathrm{c}^{\prime} \in \mathrm{V}} \mathrm{e}^{\mathrm{u}{\mathrm{c}^{\prime} \cdot \mathrm{v}{\mathrm{w}}}}}
$$
uc表示u矩阵第c行的向量,vw则表示v矩阵的第w行向量,分别可以看做词c的上下文向量和词w的中心词向量。我们对这两个向量的内积做softmax运算就可以得到上式的条件概率。
c’表示除了当前上下文之外的词库中的词
两个向量之间越相似,点乘的结果就越大,从而归一化之后得到的概率值也就越大,因此关系越紧密的词的向量会越相似