自从Mikolov在他2013年的论文“Efficient Estimation of Word Representation in Vector Space”提出词向量的概念后,NLP领域仿佛一下子进入了embedding的世界,Sentence2Vec、Doc2Vec、Everything2Vec。词向量基于语言模型的假设——“一个词的含义可以由它的上下文推断得出“,提出了词的Distributed Representation表示方法。相较于传统NLP的高维、稀疏的表示法(One-hot Representation),Word2Vec训练出的词向量是低维、稠密的。
在上一篇文章里,我们用onehot将词转换成向量的形式,如下所示:
假设有二、三、四元词进行onehot,我们可能得到的特征为:
feature1=[01,10]
feature2=[001,010,100]
feature3=[0001,0010,0100,1000]
而如果依照上面的特征,我们发现会出现正交的情况,那么根据余弦相似度的关系,a⋅b=∣a∣∣b∣cosθ\boldsymbol{a}\cdot \boldsymbol{b}=\left| \boldsymbol{a} \right|\left| \boldsymbol{b} \right|\cos \thetaa⋅b=∣a∣∣b∣cosθ,这将导致任何一对词的余弦相似度为0,而它得到的特征也将是离散稀疏的。
word2vec介绍关于word2vec,我们知道的CBOW(Continuous Bag-of-Words Model)和Skip-gram (Continuous Skip-gram Model),都是它的两种训练模式。而负采样(Negative Sample)和层次softmax(Hierarchical Softmax)则是两种加速训练的方法。
跳字模型(skip-gram)在跳字模型中,词典索引集V={0,1,…,∣V∣−1}\mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\}V={0,1,…,∣V∣−1}。假设给定一个长度为TTT的文本序列,设时间步ttt的词为w(t)w^{(t)}w(t)。假设给定中心词的情况下背景词的生成相互独立,当背景窗口大小为mmm时,跳字模型的似然函数即给定任一中心词生成所有背景词的概率
∏t=1T∏−m≤j≤m, j≠0P(w(t+j)∣w(t)), \prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(w^{(t+j)} \mid w^{(t)}),t=1∏T−m≤j≤m, j=0∏P(w(t+j)∣w(t)),
m为窗口大小,比如说m=2也就是滑窗大小为5,T为文本序列的总长度,上式也为给定中心词的极大似然估值。而在之前的softmax章节中提到过,若要使得整个联合概率最大化,这个联合概率最大化就等价于最小化这个损失函数,那么上式就能等价于:
−1T∑t=1T∑−m≤j≤m, j≠0log P(w(t+j)∣w(t)) -\frac{1}{T} \sum_{t=1}^{T} \sum_{-m \leq j \leq m,\ j \neq 0} \text{log}\, P(w^{(t+j)} \mid w^{(t)})−T1t=1∑T−m≤j≤m, j=0∑logP(w(t+j)∣w(t))
我们可以用vvv和uuu分别代表中心词和背景词的向量。换言之,对于词典中一个索引为iii的词,它在作为中心词和背景词时的向量表示分别是viv_{i}vi和uiu_{i}ui。而词典中所有词的这两种向量正是跳字模型所要学习的模型参数。为了将模型参数植入损失函数,我们需要使用模型参数表达损失函数中的中心词生成背景词的概率。设中心词 wcw_{c}wc 在词典中索引为