Skip to content

Word2vec之数学模型

📅 发表于 2017/11/03
🔄 更新于 2017/11/03
👁️ 次访问
📝 0 字
0 分钟
自然语言处理
#word2vec
#自然语言处理

Word2vec有两种模型:CBOW和Skip-gram,有两种训练方法:Hierarchical Softmax和Negative Sampling。偏数学公式推导

背景介绍

符号

  • C :语料Corpus,所有的文本内容,包含重复的词。
  • D:词典,D是从C中取出来的,不重复。
  • w:一个词语
  • m:窗口大小,词语w的前后m个词语
  • Context(w)=Cw: 词w的上下文词汇,取决于m
  • v(w): 词典D中单词w的词向量
  • k:词向量的长度
  • iw:词语w在词典D中的下标
  • NEG(w) : 词w的负样本子集

常用公式:

log(anbm)=logan+logbm=nloga+mlogblogi=1aib1i=i=1logai+logb1i=i=1iloga+(i1)logb

目标函数

n-gram模型。当然,我们使用神经概率语言模型

P(wCw) 表示上下文词汇推出中心单词w的概率。

对于统计语言模型来说,一般利用最大似然,把目标函数设为:

wCp(wCw)

一般使用最大对数似然,则目标函数为:

L=wClogp(wCw)

其实概率P(wCw)是关于wCw的函数,其中θ是待定参数集,就是要求最优 θ,来确定函数F

p(wCw)=F(w,Cw;θ)

有了函数F以后,就能够直接算出所需要的概率。 而F的构造,就是通过神经网络去实现的。

神经概率语言模型

一个二元对(Cw,w)就是一个训练样本。神经网络结构如下,W,U是权值矩阵,p,q是对应的偏置。

但是一般会减少一层,如下图:(其实是去掉了隐藏层,保留了投影层,是一样的)

窗口大小是mContext(w)包含2m个词汇,词向量长度是k。可以做拼接或者求和(下文是)。拼接得到长向量2mk, 在投影层得到xw,然后给到隐藏层和输出层进行计算。

zw=tanh(Wzw+p)yw=Uzw+q

再对yw=(y1,y2,,yK) 向量进行softmax即可得到所求得中心词汇的概率:

p(wCw)=eyiwi=1Keyi

优点

  • 词语的相似性可以通过词向量来体现
  • 自带平滑功能。N-Gram需要自己进行平滑。

词向量的理解

有两种词向量,一种是one-hot representation,另一种是Distributed Representation。one-hot太长了,所以DR中把词映射成为相对短的向量。不再是只有1个1(孤注一掷),而是向量分布于每一维中(风险平摊)。再利用欧式距离就可以算出词向量之间的相似度

传统可以通过LSA(Latent Semantic Analysis)和LDA(Latent Dirichlet Allocation)来获得词向量,现在也可以用神经网络算法来获得。

可以把一个词向量空间向另一个词向量空间进行映射,就可以实现翻译。

Hierarchical Softmax

两种模型都是基于下面三层模式(无隐藏层),输入层、投影层和输出层。没有hidden的原因是据说是因为计算太多了。

CBOW和Skip-gram模型:

CBOW模型

一共有|C|个单词。CBOW是基于上下文context(w)=cw去预测目标单词w,求条件概率p(wcw),语言模型一般取目标函数为对数似然函数:

L=wClogp(wcw)

窗口大小设为m,则cww的前后m个单词。

输入层 是上下文单词的词向量。(初始随机,训练过程中逐渐更新)

投影层 就是对上下文词向量进行求和,向量加法。得到单词w的所有上下文词cw的词向量的和xw,待会儿参数更新的时候再依次更新回来。

输出层C中选择一个词语,实际上是多分类。这里是哈夫曼树层次softmax。

因为词语太多,用softmax太慢了。多分类实际上是多个二分类组成的,比如SVM二叉树分类:

这是一种二叉树结构,应用到word2vec中,被称为Hierarchical Softmax。CBOW完整结构如下:

每个叶子节点代表一个词语w,每个词语被01唯一编码。

哈夫曼编码

哈夫曼树很简单。每次从许多节点中,选择权值最小的两个合并,根节点为合并值;依次循环,直到只剩一棵树。

比如“我 喜欢 看 巴西 足球 世界杯”,这6个词语,出现的次数依次是15, 8, 6, 5, 3, 1。建立得到哈夫曼树,并且得到哈夫曼编码,如下:

CBOW足球例子

引入一些符号:

  • pw :从根节点到达w叶子节点的路径
  • lw : 路径pw中节点的个数
  • p1w,,plww :依次代表路径中的节点,根节点-中间节点-叶子节点
  • d2w,,dlww{0,1}:词w的哈夫曼编码,由lw1位构成, 根节点无需编码
  • θ1w,,θlw1w:路径中非叶子节点对应的向量, 用于辅助计算。
  • 单词w是足球,对应的所有上下文词汇是cw, 上下文词向量的和是xw

看一个例子:

约定编码为1是负类,为0是正类。即左边是负类,右边是正类

每一个节点就是一个二分类器,是逻辑回归(sigmoid)。其中θ是对应的非叶子节点的向量,一个节点被分为正类和负类的概率分别如下:

σ(xwTθ)=11+exwTθ,1σ(xwTθ)

那么从根节点到达足球的概率是:

p(c)=j=25p(djwxw,θj1w)

CBOW总结

目标函数

从根节点到每一个单词w都存在一条路径pw,路径上有lw1个分支节点,每个节点就是一个二分类,每次产生一个概率 p(djwxw,θj1w), 把这些概率乘起来就得到了p(wcw)

其中每个节点的概率是,与各个节点的参数和传入的上下文向量和xw相关。

p(djwxw,θj1w)={σ(xwTθj1w),djw=01σ(xwTθj1w),djw=1

写成指数形式是

p(djwxw,θj1w)=[σ(xwTθj1w)]1djw[1σ(xwTθj1w)]djw

则上下文推中间单词的概率,即目标函数

p(wcw)=j=2lwp(djwxw,θj1w)

对数似然函数

对目标函数取对数似然函数是:

L=wClogp(wcw)=wClogj=2lw[σ(xwTθj1w)]1djw[1σ(xwTθj1w)]djw=wCj=2lw((1djw)logσ(xwTθj1w)+djwlog(1σ(xwTθj1w)))=wCj=2lw((1djw)logA+djwlog(1A)))

简写:

L(w,j)=(1djw)logσ(xwTθj1w)+djwlog(1σ(xwTθj1w))L=w,jL(w,j)

怎样最大化对数似然函数呢,可以最大化每一项,或者使整体最大化。尽管最大化每一项不一定使整体最大化,但是这里还是使用最大化每一项L(w,j)

sigmoid函数的求导:

σ(x)=σ(x)(1σ(x))

L(w,j)有两个参数:输入层的xw 和 每个节点的参数向量θj1w 。 分别求偏导并且进行更新参数:

θj1wL(w,j)=[1djwσ(xwTθj1w)]xwθj1w=θj1w+αθj1wL(w,j)xwL(w,j)=[1djwσ(xwTθj1w)]θj1wv(w^)+=v(w^)+αj=2lwxwL(w,j),w^cw

注意:xw是所有上下文词向量的和,应该把它的更新平均更新到每个上下文词汇中去。w^ 代表cw中的一个词汇。

Skip-Gram模型

Skip-gram模型是根据当前词语,预测上下文。网络结构依然是输入层、投影层(其实无用)、输出层。如下:

输入一个中心单词的词向量v(w),简记为vw,输出是一个哈夫曼树。单词uw的上下文单词cw中的一个。这是一个词袋模型,每个u是互相独立的。

目标函数

所以cww的上下文词汇的概率是:

p(cww)=ucwp(uw)

与上面同理,p(uw) 与传入的中心单词向量v(w)和路径上的各个节点相关:

p(uw)=j=2lwp(djuvw,θj1u)p(djuvw,θj1u)=[σ(vwTθj1u)]1dju[1σ(vwTθj1u)]dju

下文vwTθj1w简记为vwθj1w,要记得转置向量相乘就可以了。

对数似然函数

L=wClogp(cww)=wClogucwj=2lw[σ(vwTθj1u)]1dju[1σ(vwTθj1u)]dju=wCucwj=2lw((1dju)logσ(vwTθj1u)+djulog(1σ(vwTθj1u)))

同样,简写每一项为L(w,u,j)

L(w,u,j)=(1dju)logσ(vwTθj1u)+djulog(1σ(vwTθj1u))

然后就是,分别对vwθj1u求梯度更新即可,同上面的类似。得到下面的更新公式

θj1u=θj1u+α[1djuσ(vwtθj1u)]v(w)vw=vw+αucwj=2lwL(w,u,j)vw

Negative Sampling

背景知识介绍

Negative Sampling简称NEG,是Noise Contrastive Estimation(NCE)的一个简化版本,目的是用来提高训练速度和改善所得词向量的质量。

NEG不使用复杂的哈夫曼树,而是使用随机负采样,大幅度提高性能,是Hierarchical Softmax的一个替代。

NCE 细节有点复杂,本质上是利用已知的概率密度函数来估计未知的概率密度函数。简单来说,如果已知概率密度X,未知Y,如果知道X和Y的关系,Y也就求出来了。

在训练的时候,需要给正例和负例。Hierarchical Softmax是把负例放在二叉树的根节点上,而NEG,是随机挑选一些负例。

CBOW

对于一个单词w输入上下文Context(w)=Cw,输出单词w。那么词w是正样本**,**其他词都是负样本。 负样本很多,该怎么选择呢?后面再说。

定义Context(w)的负样本子集NEG(w)。对于样本(Cw,w)xw依然是Cw的词向量之和。θu为词u的一个(辅助)向量,待训练参数。

设集合Sw=wNEG(w) ,对所有的单词uSw,有标签函数

bw(u)={1,u=w0,uw

单词uCw 的中心词的概率是:

p(uCw)={σ(xwTθu),u=w正样本1σ(xwTθu),uw负样本

简写为:

p(uCw)=[σ(xwTθu)]bw(u)[1σ(xwTθu)]1bw(u)

要最大化目标函数g(w)=uSwp(uCw)

g(w)=uSw[σ(xwTθu)]bw(u)[1σ(xwTθu)]1bw(u)=σ(xwTθu)uNEG(w)(1σ(xwTθu))

观察g(w)可知,最大化就是要:增大正样本概率和减小化负样本概率

每个词都是这样,对于整个语料库的所有词汇,将g累计得到优化目标,目标函数如下:

L=logwCg(w)=wClogg(w)=wClog(uSw[σ(xwTθu)]bw(u)[1σ(xwTθu)]1bw(u))=wCuSw[buwσ(xwTθu)+(1buw)(1σ(xwTθu))]

简写每一步L(w,u)

L(w,u)=buwσ(xwTθu)+(1buw)(1σ(xwTθu))

计算L(w,u)θuxw梯度进行更新,得到梯度(对称性):

L(w,u)θu=[bw(u)σ(xwTθu)]xw,L(w,u)xw=[bw(u)σ(xwTθu)]θu

更新每个单词的训练参数θu

θu=θu+αL(w,u)θu

对每个单词更新词向量v(u)

v(u)=v(u)+αuSwL(w,u)xw

Skip-gram

H给单词w,预测上下文向量Context(w)=Cw。 输入样本(w,Cw)

中心单词是w,遍历样本中的上下文单词woCw,为每个上下文单词wo生成一个包含负采样的集合So=wNEG(o) 。即So里面只有w才是o的中心单词。

下面wo简写为o,要注意实际上是当前中心单词w的上下文单词。

So中的u是实际的w就为1,否则为0。标签函数如下:

bw(u)={1,u=w0,uw

So中的uo的中心词的概率是

p(uo)={σ(voTθu),u=wbw(u)=11σ(voTθu),uwbw(u)=0

简写为

p(uo)=[σ(voTθu)]bw(u)[1σ(voTθu)]1bw(u)

对于w的一个上下文单词o来说,要最大化这个概率:

uSop(uo)

对于w的所有上下文单词Cw来说,要最大化:

g(w)=oCwuSop(uo)

那么,对于整个预料,要最大化:

G=wCg(w)=wCoCwuSop(uo)

对G取对数,最终的目标函数就是:

L=logG=wCoCwloguSop(uo)=wCoCwloguSo[σ(voTθu)]bw(u)[1σ(voTθu)]1bw(u)=wCoCwuSo(buwσ(voTθu)+(1buw)(1σ(voTθu)))

w,o,u简写L(w, o, u):

L(w,o,u)=buwσ(voTθu)+(1buw)(1σ(voTθu))

分别对θuvo求梯度

L(w,o,u)θu=[buwσ(voTθu)]vo,L(w,o,u)vo=[buwσ(voTθu)]θu

更新每个单词的训练参数θu

θu=θu+αL(w,o,u)θu

对每个单词更新词向量v(o)

v(o)=v(o)+αuSoL(w,u)vo
总访客数:   ·   总访问量:
PLM's Blog @ 2016 - 2025