词向量

one-hot

在Word2vec出现之前,在nlp中最常用的是one-hot(独热)编码,先来解释一下什么是独热的编码:假设我们数据集为,“今天天气特别晴朗”,“六月的天气是多变的”,对应词库{“今天”,“天气”,“特别”,“晴朗’,“六月”,“是”,“多变”}。

那么每个词对应的one-hot词向量就是:

今天:{1,0,0,0,0,0,0}

天气:{0,2,0,0,0,0,0}

特别:{0,0,1,0,0,0,0}

晴朗:{0,0,0,1,0,0,0} 等等

这样我们可以看出one-hot编码的一些特点:

1、词向量的维度是和词库的大小一致

2、每一维的位置代表词的位置(不是词在文中的位置,是词在词库中的位置)只有对应位置有值,、值的大小代表该词在文本出现的次数,其他位置为0;

这样我们可以看出one-hot编码的一些缺点:

1、稀疏的表示

我们的数据集往往有成千上万的词,根据one-hot编码的特点每个词的词向量都有上万维,而且只有其中一维有值,其他位置为0。

2、这种对编码对词表达的能力很弱,基本上没有包含词义在里面。

word2vec

我们先不谈word2vec的原理,先看一下由word2vec计算出来的词向量有什么特点:

今天:{0.235,0.145,0.287,0.264}

天气:{0.113,0.212,0.185,0.235}

特别:{0.825,0.213,0.212,0.336}

晴朗:{0.32,0.655,0.412,0.251}

第一、每一个维度都有值,是稠密的表示

假设现在有一个八维的词向量那么使用one-hot编码只能表示8个词,而使用word2vec的这种表示方式可以表示无数个词

第二 word2vec计算出的词向量包含词义信息,也就是词义相近,那么词向量之间的距离相近

相对于one-hot,我们一般称word2vec的这种编码方式为分布式的编码

word2vec详解

想要了解word2vec首先要明白它的一个基本原理:在一句话中对于每个词与其他词之间有这么一种现象:两词离得越近,词义相似度越高。例如:

”我们在训练一个非常有意思的nlp模型。”这一句话中,“我们”和“nlp”这两个词的相似度要小于“nlp”与“模型”之间的相似度,这也就说明一个词的含义是与周围几个词有很大的关系。所以根据这种关系我们设计里两个模型:

Skip-gram:利用当前单词预测周围单词。

CBOW:利用周围单词预测当前单词。

当前比较流行的是使用Skip-gram模型,所以下面重点介绍这种模型的原理

Skip-gram

Skip-gram的主要思想是:根据当前词预测周围词,还是举个例子说明吧:

现在有这样的一句话:”我们在训练一个非常有意思的nlp模型”,假设对“训练”这个词进行计算,那么计算过程就是,如图(1),计算周围词出现的概率:p()p(我们|训练)p()p(在|训练)p()p(一个|训练)p()p(非常|训练)p()...p(有意思|训练)...并且要把这个概率最大化,也就是MLE的思想(不了解的同学先去了解一下MLE)。
Word2vec详细解释(内含推导)

对于每个词我们都进行这样的计算,假设我们考虑周围2个单词那么这句话的计算流程就是:

p()p(在|我们)p()p(训练|我们)p()p(我们|在)p()p(训练|在)p()p(一个|在)p()p(我们|训练)p()p(在|训练)p()p(一个|训练)p()...p(非常|训练)...

我们一般把当前词叫做中心词,周围的词叫做上下文词(context),那么我们把计算流程写成数学公式就是:

argmaxwTextccontext(w)p(cw;θ)argmax\prod _{w\in Text}\prod _{c\in context(w)}p\left( c|w;\theta\right)

进行简单的转化为:

argmaxwTextccontext(w)logp(cw;θ)argmax\sum _{w\in Text}\sum _{c\in context(w)}\log p\left( c|w;\theta\right)

也就是说我们输入大量的数据集到模型进行训练,不断的最大化目标函数,优化参数。在这里我们的参数是:θ\theta

简单介绍一下θ\theta

θ\theta是有两个矩阵组成UUVV,也就是θ=[U,V]\theta=[U,V]

UU表示的是每个词作为中心词时的词向量如图(2):
Word2vec详细解释(内含推导)
由图(2)可知每一行都代表这每个词的词向量,也就是我们在训练时不断优化每个词对应的词向量。K表示的是词向量的维度,V表示词库的大小。

V和U是一模一样的,也是个矩阵,每一行代表着单词作为上下文时的向量
Word2vec详细解释(内含推导)
具体最后θ\theta是用UU还是VV我们一会再说

根据上面的解释我们了解了skip-gram的目标函数是:

argmaxwTextccontext(w)logp(cw;θ)argmax\sum _{w\in Text}\sum _{c\in context(w)}\log p\left( c|w;\theta\right)

也就是最大化训练数据的当前词与上下文词之间的概率

以计算p()p(在|我们)为例:

就是最大化“我们”作为中心词,“在”作为上下文词的概率,“我们”作为中心词时的词向量为:VV_{(我们)},“在”作为上下文词的词向量为UU_{(在)},我们知道两个向量的内积表示向量之间的关系:而模型的目的是最大化此时的“我们”和“在”之间的关系。因此也就是最大化VV_{(我们)}UU_{(在)}的内积:p()p(在|我们)是一个概率的形式,所以我们还要除以“我们”作为中心词时所有可能发生的情况。:

p()=VUdVUdp(在|我们)=\dfrac {V_{(我们)}\cdot U_{(在)}}{\sum_d V_{(我们)}\cdot U_{(d)}}

dd表示在词库中除了“在”其他所有词

由于这样计算出的数字比较大,再改变一下形式:

p()=e(VU)de(VUd)p(在|我们)=\dfrac {e^{(V_{(我们)}\cdot U_{(在)})}}{\sum_d e^{(V_{(我们)}\cdot U_{(d)})}}

最后我们在扩展到所有词的情况:

p(cw;θ)=e(VwUc)de(VwUd)p\left( c|w;\theta\right)=\dfrac {e^{(V_{(w)}\cdot U_{(c)})}}{\sum_d e^{(V_{(w)}\cdot U_{(d)})}}

代入目标函数:

argmaxwTextccontext(w)loge(VwUc)de(VwUd)argmax\sum _{w\in Text}\sum _{c\in context(w)}\log \dfrac {e^{(V_{(w)}\cdot U_{(c)})}}{\sum_d e^{(V_{(w)}\cdot U_{(d)})}}

==argmaxwTextccontext(w)VwUclogde(VwUd)argmax\sum _{w\in Text}\sum _{c\in context(w)} V_{(w)}\cdot U_{(c)}-\log \sum_d e^{(V_{(w)}\cdot U_{(d)})}

目标函数既然有了,下面就是采用最常用的随机梯度下降法求梯度,然后优化参数。一会做一个求梯度的过程。

当然,这里还有一个问题哈:从公式中可以看出每计算一个词的概率时,都得计算中心词与词库中所有的词的一个内积,这样计算量是非常大的。下面我们讲一下解决方式

目标函数的转化

上面讲到skip-gram的目标函数是最大化p(cw;θ)p\left( c|w;\theta\right)现在我们换一种思维方式,也就是p(D=1w1,w2)p( D=1|w_1,w_2)p(D=0w1,w2)p( D=0|w_1,w_2),他们表示的是什么意思呢?

p(D=1w1,w2;θ)p( D=1|w_1,w_2;\theta)指的是w1,w2w_1,w_2是上下文词的概率

p(D=0w1,w2;θ)p( D=0|w_1,w_2;\theta)指的是w1,w2w_1,w_2不是上下文词的概率

那么我们的目标就是 :
w1,w2w_1,w_2作为上下文词时,最大化p(D=1w1,w2;θ)p( D=1|w_1,w_2;\theta)
w1,w2w_1,w_2不是上下文词时,最大化p(D=0w1,w2;θ)p( D=0|w_1,w_2;\theta)

根据概率的性质:p(D=1w1,w2;θ)+p( D=1|w_1,w_2;\theta)+p(D=0w1,w2;θ)p( D=0|w_1,w_2;\theta)=1

这里我们采用逻辑回归来做目标函数:

p(D=0w1,w2;θ)=11+e(UwiVwi)p( D=0|w_1,w_2;\theta)= \dfrac{1}{1+e^{(-U_{wi}\cdot V_{wi})}}

因此我们的目标函数可以写成:

argmax(w.c)Dp(D=1wi,ci;θ)(w.c)Dp(D=0wi,ci;θ)argmax\prod _{(w.c)\in D}p( D=1|w_i,c_i;\theta)\prod _{(w.c)\in \overline {D}}p( D=0|w_i,c_i;\theta)

DD表示ww作为中心词时上下文词的集合,我们称为正样本

D\overline {D}表示ww作为中心词时不是其上下文词的集合,我们称为负样本

将公式展开为:

argmax(w.c)D11+e(UwiVwi)(w.c)D(111+e(UwiVwi))argmax\prod _{(w.c)\in D}\dfrac{1}{1+e^{(-U_{wi}\cdot V_{wi})}}\prod _{(w.c)\in \overline {D}}(1-\dfrac{1}{1+e^{(-U_{wi}\cdot V_{wi})}})

化简:

argmax(w.c)Dlogσ(VwUc)+(w.c)Dlogσ(VwUc)argmax\sum _{(w.c)\in D}\log\sigma (V_{w}\cdot U_{c})+\sum _{(w.c)\in \overline {D}}\log\sigma (-V_{w}\cdot U_{c})

负采样

在这里我们考虑一个问题:DDD\overline {D}在数据集中的分布问题,其实很明显我们可以看出随着数据集的增加D\overline {D}要远大于DD,也就是负样本要比正样本多的多,y也就是在计算(w.c)Dlogσ(VwUc)\sum _{(w.c)\in \overline {D}}\log\sigma (-V_{w}\cdot U_{c})时比较麻烦。因此我们使用的是负采样。

负采样:也就是在执行一次正样本的计算时,我们不是计算全部的D\overline {D}集合中的数据,而是随机的选取一部分,这样就可以减少大量的计算量。当然D\overline {D}集合中的数据有很多都是噪音,所以减少一部分的计算结果也不会太差。

因此目标函数转变成:

argmaxφ(θ)=argmax \quad \varphi(\theta)=argmax(w.c)D[logσ(VwUc)+dN(w)logσ(VwUd)]argmax\sum _{(w.c)\in D}[\log\sigma (V_{w}\cdot U_{c})+\sum _{d\in N(w)}\log\sigma (-V_{w}\cdot U_{d})]

cc: 表示ww作为中心词时的上下文词
N(w)N(w): 表示从词库中随机采样出的不是ww的上下文词的集合
dd: 表示从词库中随机采样出的不是ww的上下文词

求参数梯度

ok既然我们已经得出了目标函数,那么下一步就是优化参数这里采用的是梯度下降法,所以我们分别来计算对参数UcU_cUdU_dVwV_w的梯度

求参数UcU_c的梯度结合逻辑回归的公式:

φ(θ)Uc=σ(VwUc)[1σ(VwUc)]Vwσ(VwUc)=[1σ(VwUc)]Vw\dfrac {\partial \varphi(\theta) }{\partial U_c}=\dfrac {\sigma (V_{w}\cdot U_{c})\cdot[1-\sigma (V_{w}\cdot U_{c})]\cdot V_w}{\sigma (V_{w}\cdot U_{c})}=[1-\sigma (V_{w}\cdot U_{c})]\cdot V_w

同理求参数UdU_d的梯度:

φ(θ)Ud=σ(VwUd)[1σ(VwUd)]Vwσ(VwUd)=[σ(VwUd)1]Vw\dfrac {\partial \varphi(\theta) }{\partial U_d}=\dfrac {\sigma (V_{w}\cdot U_{d})\cdot[1-\sigma (V_{w}\cdot U_{d})]\cdot -V_w}{\sigma (V_{w}\cdot U_{d})}=[\sigma (V_{w}\cdot U_{d})-1]\cdot V_w

求参数VwV_w的梯度:

φ(θ)Vw=σ(VwUc)[1σ(VwUc)]Ucσ(VwUc)+dN(w)σ(VwUd)[1σ(UsUd)]Udσ(VwUd)\dfrac {\partial \varphi(\theta) }{\partial V_w}=\dfrac {\sigma (V_{w}\cdot U_{c})\cdot[1-\sigma (V_{w}\cdot U_{c})]\cdot U_c}{\sigma (V_{w}\cdot U_{c})}+\sum _{d\in N(w)}\dfrac {\sigma (V_{w}\cdot U_{d})\cdot[1-\sigma (U_{s}\cdot U_{d})]\cdot -U_d}{\sigma (V_{w}\cdot U_{d})}

=[1σ(VwUc)]Uc+dN(w)[σ(VwUd)1]Ud=[1-\sigma (V_{w}\cdot U_{c})]\cdot U_c+\sum _{d\in N(w)}[\sigma (V_{w}\cdot U_{d})-1]\cdot U_{d}

随机梯度下降法:

for (w,c)D(w,c)\in D 先从正样本里面获得集合:

\quad\quadww进行负采样获得集合N(w)N(w)
\quad\quad更新参数:

\quadUc=Uc+ηφ(θ)Uc\quad U_c=U_c +\eta\dfrac {\partial \varphi(\theta) }{\partial U_c}

\quadUd=Ud+ηφ(θ)Ud\quad U_d=U_d +\eta\dfrac {\partial \varphi(\theta) }{\partial U_d}

\quadVw=Vw+ηφ(θ)Vw\quad V_w= V_w +\eta\dfrac {\partial \varphi(\theta) }{\partial V_w}

评估

我建议是将词向量映射到二维空间里,看看相似的单词是否会聚在一起。

缺点:

1、我们只是计算周围的单词与当前词之间的关系,并没有考虑到上下文的信息

2、在实际应用中,输入词库以外的词还是无法计算,要么删掉,英文可以采用字符拼接的方式。

相关文章: