Word2Vec模型

Word2Vec模型

word2vec模型在NNLM模型的基础之上演变而来,我们的最终目的都是用函数拟合出一个句子的概率,这个概率可以拆分成多个概率相乘的形式,每个位置为P(wi|context)。NNLM用四层模型,求解出了这个概率值,而word2vec模型抛弃了其中最耗时的隐层,而且投影层是上下文词语向量直接相加而不是拼接而成,直接以概率值输出。

1 基于Hierarchical Softmax模型

Hierarchical(分层)softMax有两种模型,如下:

image

1.1 CBOW模型

直接将上下文的词向量相加,然后输出。我们这里假设某个词和其上下文分别为:

w,Context(w)12c

一共有2c个上下文词语,投影层直接将每个词的词向量相加:

Xw=i=12cV(Context(w)i)

输出层为一颗霍夫曼树,根据每个词语出现的频次构成了一颗霍夫曼树。所有的非叶节点存储有一个参数向量,所有的叶节点分别代表了词典中的一个词。参数向量初始值为0。构建完huffman树之后,将对应的huffman码分配给每个单词。此外,还需要随机初始化每个单词的词向量。

image

那么CBOW模型是怎么定义条件概率的呢?对于霍夫曼树的每一层都看做是一个二分类,分类的方法是LogisticRegression,为了与作者中的论文一致,假设树的左边表示分类为0,树的右边表示分类为1(与图片中有一些出入)。那么根据逻辑回归可以知道,分类为1的概率为:

P(y=1)=f=11+ewTx=σ(wTx)

对一棵树的每个叶子节点定义一个等长的向量theta,那么对于每个叶子节点,分为右子树的概率为:

σ(XTwθwj),θwj

那么,分为左子树的概率为
1σ(XTwθwj)

写在一起,可得到每一个节点j,下一个节点被分类的概率为:

P(dwj+1|XTw,θwj)=[1σ(XTwθwj)]dwj+1[σ(XTwθwj)]1dwj+1

所以,对于题目中的足球而言,需要经历四次分类才能走到叶子节点,这里的j一共有四次取值,从1到4,那么它的概率可以定义为:

P(w|context(w))=j[1σ(XTwθwj)]dwj+1[σ(XTwθwj)]1dwj+1

那么整个语料C的所有概率,利用极大似然函数,可得到优化的代价函数为:

L(w,j)=log(wCP(w|context(w))=wCj{dwj+1log[1σ(XTwθwj)]+(1dwj+1)log[σ(XTwθwj)]}

优化的目标参数为:

wC:Xw,jlw,θwj1

对于这里的足球而言,要求解的参数为5个。求解的方式采用梯度下降法:

dL(w,j)dθwj=[1dwj+1σ(XTwθwj)]XTw

交换位置,不难求出另外一个导数:
dL(w,j)dXw=[1dwj+1σ(XTwθwj)]θwj

所以更新的策略为:

θwj=θwj+η[1dwj+1σ(XTwθwj)]XTw

这里的xw是由多个词向量相加得到的,所以这里应该更新词向量v(context(w)),把梯度贡献到每一个词的词向量上,更新的策略也很简单:

uContext(w):V(u)=V(u)+ηjdL(w,j)dXw

所以我们并不会直接更新中心词的词向量,而是更新了跟中心词相关的其他词的词向量。更新的伪代码如下:

image

1.2 skip-gram模型

与CBOW模型正好相反,skip-gram模型是用当前的中心词去预测上下文的词语出现的概率,极大似然模型为,已知中心词出现了,那么让它的上下文出现的概率最大,他所求得概率为:

P(Context(w)|w)

按照上一节的推导:

P(u|w)=jP(dwj|v(u),θuj1)

L=wCuContex(w)j{dwj+1log[1σ(VTwθwj)]+(1dwj+1)log[σ(VTwθwj)]}

这里可以仔细再理解一下softmax模型,不难发现,所有的概率值加在一起的值为1。对于CBOW模型,我们计算的是已知当前词的上下文,中心词出现的概率。那么按照我们的这种模型,给定上下文,语料中所有词语出现的条件概率加在一起是不是等于1?很明显是成立的,因为这棵树的所有叶子节点的概率加在一起肯定等于1。对于skip-gram模型,同样的,它仍然是一棵树,给定当前中心词,语料中所有词语出现的概率和肯定为1,只不过我们这里的上下文出现的概率和不是1,但是全部词语出现的概率和肯定是1。所以这里为什么称之为Hierarchical softmax。

wiCP(wi|context(w))=1,uCP(u|w)=1

2 负例采样模型

Negative Sampling模型和层次softmax模型不一样,我们首先要从softmax的思维中跳出来。这里的输出概率加和并不一定为1。负例采样模型主要是为了提高训练速度并改善词语的训练质量,输出层不再采用复杂的哈夫曼树的模型,而是利用随机负采样。我们的任务仍然是求P(wi|contex_w),思想是定义两类词语,一类是这个中心词称为正样本,另外一类是从语料中随机抽取的其他词语,称为负样本。直接定义如下概率:

P(u|context(w))={σ(XTwθu),1σ(XTwθu),if u = wif u in Negsample

对于某个词,它的上下文组成的向量X仍然不变,这个向量与上下文词语有关。用不同的方式表达两类概率。直接用下面的公式表示已知上下文,中心词出现的概率:

P(w|context(w))=σ(XTwθw)

这么定义之后,我们优化的代价函数不再是整个句子所对应的极大似然概率,而是最大化下面这个函数g,它的思想就是已知出现这么一堆上下文之后,我们要让中心词出现的概率大,正样本出现的概率大而负样本出现的概率小。通过这种模型,求解出相应的参数,我们仍然可以求出来这个概率P(wi|contex_w)。

g=[σ(XTwθw)uneg(w)1σ(XTwθu)]

同样的,取Log处理,得到我们的优化函数:

G=log(σ(XTwθw))+uneg(w)log[1σ(XTwθu)]

L=wC{log(σ(XTwθw))+uneg(w)log[1σ(XTwθu)]}

dLdθu=σ(XTwθu)Xw

dLdθw=[1σ(XTwθw)]Xw

更新的方法仍然是梯度上升法:

θu=θu+[Tσ(XTwθw)]Xw,T[0,1]

同样的,词向量更新方式仍然一样:

V(Context(w))=V(Context(w))+udL(w,u)dXw

2.1 基于skip-gram模型的负例采样算法

跟分层的softmax类似,对于skip-gram模型是要求出P(context|w),即在出现中心词的条件下每个上下文词语出现的概率。P(u|w)的定义可以按照上面的定义方式,定义u为正样本,随机抽取其他词语作为一个负样本:

uContext(w),P(u|w)=σ(XTwθu)

相应的,我们的目标g,可以定义为:

g|w,u=[σ(XTwθu)zneg(u)1σ(XTwθz)]

g|w=uContext(w)g|w,u

G=wCg(w)

对中心词的每一个上下文词语,都进行负采样,然后定义一个函数g,将这些中心词的g乘在一起。就可以得到我们这里的优化函数。

2.2 负例采样方法

采样的原则仍然是频次高的被选中的概率大,频次低的被选中的概率低。看下面两个线段,第一个线段表示假设语料中词语一共有N个词语,根据每个词语出现的频率构成这条线段,每个词出现的频率越高,当然占据的长度越长,从前到后依次往后排。第二条线段表示我们将一条线段等分为M份,每一个M对应着语料中的一个词,比如这里的m1,m2就对应着同一个词语。采样的方法为,每次随机生成一个1到M之间的数,找到这个数对应的词语就可以,如果刚好选到中心词了,那就直接跳过去。举个例子,如果我们随机到1,2,4,M-1这么几个数字,那么选的词就是第一个,第一个,第二个,第二个,和最后一个。

image

从论文中看出,一般第一条线段构造的时候,每段长度并不是直接用频次/频次的:

len(w)=count(w)3/4uCcount(u)3/4

3 FastText分析

fasttext是基于word2Vec的CBOW模型改进而来,专门为文本分类而提出的算法,目的是为了提高训练的速度。训练的时候,将每句话的标签作为信息插入到每句话中作为中心词,其他词语作为上下文。输出以所有的标签构成一颗霍夫曼树。所以,这里预测的是已知上下文的条件下,当前标签的概率最大。构建模型的时候也是让这个条件概率值最大。

主要改进的方法有两个:一个是加入了N-gram特征,一句话,我爱你,可能词袋中只有三个词语,但是模型还加入了我爱,爱你等N-gram特征。另外一个是层次化的softmax,使得时间复杂度降低为log(k)。

猜你喜欢

转载自blog.csdn.net/mybabyAnn/article/details/54630714