word2vec

在NLP任务中,需要将自然语言交给计算机来处理,但是计算机无法直接理解人类的语言,所以首先要将语言数字化。词向量提供了一种很好的将语言数字化的方法。

一种最简单的词向量表示方法是onehot representation,即onehot编码。但是这种词向量的表示有一定的缺点,如维数灾难,无法表示词之间的相似性。

另一种词向量是Distributed Representation,其基本思想是:通过训练将某种语言中的每一个词映射成一个固定长度的短向量。所有这些向量构成词向量空间,而每一向量则可视为该空间中的一个点,可以根据两个向量的距离来判断它们之间的相似性。word2vec就是一种Distributed Representation。

word2vec模型是由Mikolov于2013年提出的。由word2vec模型学习的单词向量已经被证明具有语义的意义,并且在各种NLP任务中都很有用。当提到word2vec算法或模型的时候,指的是其背后用于计算word vector的CBoW模型和Skip-gram模型,它们只是浅层神经网络,并不是深度学习算法。

本文主要介绍原始的continuous bag-of-word(CBOW)和skip-gram(SG)模型,同时介绍了对以上两种模型训练的优化算法,包括hierarchical softmax和negative sampling。

Continuous Bag-of-Word Model(CBoW)

One-word context

首先考虑最简单的情况,上下文只有一个词,即给定上下文中的一个词,来预测目标词汇。图1展示了只考虑上下文只含有一个词的神经网络模型。

只考虑含义一个词的上下文

假设词汇量大小为 V ,则输入层和输出层的神经元个数都为V。隐层的神经元个数为 N ,即用长度为N的向量来表示一个词。相邻层之间的神经元是全连接的,输入采用one-hot编码方式。

输入层与隐含层之间的权重矩阵为 WV×N={wki} ,用 vw 表示输入的那个词与隐含层连接的权重,因此 vw W 矩阵的其中一个行向量。若输入一个词,假设xk=1,对于任意的 kk xk=0 ,可得

h(N×1)=(W(V×N)T)(N×V)x(V×1)=(WT(k,))(,k):=((vwI)T(1,N))(N,1)(1)

本质上就是将 W 的第k行作为 h vwI就是输入词 wI 的向量表示。注:这里采用的激活函数为线性激活函数,所以直接将输入层的权重之和传入到下一层。

隐含层与输出层之间的权重矩阵为 WN×V={wij} ,对于词典里的每一个词,定义一个score uj ,即输出层的输入值

u(V×1)=(W(N×V)T)(V×N)h(N×1)uj=(W(N×1)T)(1×N)h(N×1)=vwjTh(2)

其中, vwj W 的第 j 列。

通过softmax来得到输入词的后验分布,即

p(wj|wI)=yj=eujVj=1euj(3)

其中 yj 为输出层第 j 个神经元的输出。

将式(1)和式(2)代入(3)式可得

p(wj|wI)=evwjTvwIVj=1evwjTvwI(4)

vw vw 是词 w 的两种表示。vw来自输入层和隐含层之间的权重矩阵 W vw来自隐含层和输出层之间的权重矩阵 W

vw :输入向量。

vw :输出向量。

一般可以选取任意一个作为词向量。

简单分析一下模型的计算量,由于输入层是onehot编码的,所以输入层与隐含层之间的计算量并不大。整个模型的大部分计算量都集中在隐藏层和输出层之间的计算,以及输出层的softmax运算。因此,后续将有对这一部分优化的描述。

更新隐含层和输出层之间的权重 W

对于一个样本,训练的目标是使得(4)式最大,即最大化期望输出的条件概率( j 为输出层期望输出的词的index值)

maxp(wO|wI)=maxyjmaxlogyj=maxujlogj=1Veuj(5)(6)

其中(6)式由(5)式代入(3)得到。

令损失函数为

E=logp(wO|wI)=logj=1Veujuj(7)(8)

因此,问题转化为了最小化损失函数 E

对(8)式中的E求关于第 j 个节点的输入uj的偏导数得

Euj=yjtj:=ej(9)

其中,当 j=j 时, tj=1 ,否则 tj=0

wij 求导,得到隐藏层和输出层之间权重的梯度

Ewij=Eujujwij=ejhi(10)

其中 hi 为隐藏层第 i 个神经元的输出。

所以,通过采用随机梯度下降法,可以得到以下的参数更新方式

wij(new)=wij(old)ηejhi(11)

vwj(new)=vwj(old)ηejh, j=1,2,,V(12)

其中 η>0 为学习率。

注:按照上面的权重更新方式,必须计算词典中每一个词的概率 yj ,然后比较 yj tj 的大小关系。

更新输入层和隐含层之间的权重 W

E关于 hi 的偏导数

Ehi=j=1VEujujhi=j=1Vejwij:=EHi(13)

由(1)式可得

hi=k=1VxkwkiEwki=Ehihiwki=EHixk(14)(15)

等价于张量积

EW=xEH=xEHT(16)

EW 中只有一行是非零的,其它的行都为零。

参数更新的方式为

v(new)wI=v(old)wIηEHT(17)

vwI 是唯一的偏导数不为0的行,其它行的偏导数都为0,参数值保持不变,不进行更新操作。

Multi-word context(CBoW)

如下图所示的CBoW模型,上下文存在多个词。注:输入层与隐含层之间的 C 个权值WV×N相等,即权值共享。因为是权值共享的,所以可以将CBoW看成和图1类似的情况,只是输入向量不再是onehot,而是存在多个元素为1。因此,上下文的 C 个词,先后顺序对结果没有影响,即不考虑这C个词的先后顺序。

CBoW

example

如上图所示,给定上下文”the”, “cat”, “sat”,来预测第四个词”on”。输入的词各自映射为矩阵 W 的一行。

当只考虑上下文只有一个词的情况时,是直接采用的输入向量。CBoW是将输入的上下文的向量取平均值来作为隐含层的输出,即

h=1CWT(x1+x2++xC)=1C(vw1+vw2++vwC)T(18)

C 是上下文中词的数量。

损失函数

E=logp(wO|wI,1,,wI,C)=uj+logj=1Veuj=vwOTh+logj=1VevwjTh(19)

隐含层与输出层之前参数的更新

vwj(new)=vwj(old)ηejh, j=1,2,,V(20)

对于每一个训练样本,需要将(20)式的参数更新应用于隐含层和输出层之间的每一个元素。

输入层与隐含层之间参数的更新

v(new)wI,c=v(old)wI,c1CηEHT, c=1,2,,C(21)

Skip-Gram Model

Skip-Gram Model正好跟CBoW模型相反,如图3所示。目标词现在在输入层,上下文的词在输出层。和CBoW类似,Skip-Gram的输出层权值共享,因此,也和图1类似,只是图1中输出层只有一个元素为1,而这里存在 C 个为1的元素。

Skip-Gram

同样使用wI来表示输入向量,因为输入层只有一个词(目标词),隐含层的输出便和(1)式完全一样,即

h(N×1)=(W(V×N)T)(N×V)x(V×1)=(WT(k,))(,k):=vTwI(22)

对于输出层的输出,不再只输出一个多项式分布,现在总共有 C 个多项式分布的输出

p(wc,j=wO,c|wI)=yc,j=euc,jVj=1euj(23)

其中 wc,j 为输出层的第 c 个多项式分布的第j个词。 wO,c 为期望输出的那个词。 wI 为输入的词。 yc,j 为输出层中第 c 个多项式分布的第j个词输出值。 uc,j 为输出层中第 c 个面板的输入值。由于输出层权值共享,所以

uc,j=uj=vwjTh, c=1,2,,C(24)

其中, vwj 词典中第 j 个词wj的输出向量。

参数的更新与上下文只有一个词的情况类似,即

E=logp(wO,1,wO,2,,wO,C|wI)=logc=1Ceuc,jcVj=1euj=c=1Cujc+Clogj=1Veuj

其中, ujc 为期望的第 c 个上下文词在词典中的index。

对输出层的输入求偏导

Euc,j=yc,jtc,j:=ec,j(25)

定义一个 V 维的向量EI={EI1,,EIV}作为所有上下文词的预测误差

EIj=c=1Cec,j(26)

对隐含层和输出层之间的权重 W 求偏导

Ewij=c=1CEuc,juc,jwij=EIjhi(27)

因此, W 的参数更新为

wij(new)=wij(old)ηEIjhi(28)

vwj(new)=vwj(old)ηEIjh, j=1,2,,V(29)

参数 W 的更新为

v(new)wI=v(old)wIηEHT(30)

其中 EH V 维向量

EHi=j=1VEIjwij(31)

Optimizing Computational Efficiency

对于上文所描述的模型,每个词都能有两种向量表示,输入向量 vw 和输出向量 vw 。其中,输入向量的学习是容易的,而输出向量的学习是困难的,因为为了更新 vw ,需要对词典中的每一个词都计算输出层的输入 uj ,输出层的输出 yj ,以及预测误差 ej 。当词汇量很大,或者样本数很多的时候,这种计算方式是不可行的。下面的两种方法,都针对一个样本,通过限制输出向量的个数来减小计算量。

Hierarchical Softmax

Hierarchical Softmax是一种高效的计算softmax的方式。它采用二叉树来表示词典中的词,如下图所示。 V 个词是树的叶子节点,V1个内部节点,从根节点到达指定的叶子节点,有且只有一条路径,这条路径用来估计叶子节点所表示的那个词的概率。

Hierarchical Softmax

如上图所示,黑色的线表示从根节点啊到达词 w2 的路径,路径的长度 L(w2)=4 n(w,j) 表示从根节点到达词 w 的路径上的第j个单元。

在Hierarchical Softmax模型中,没有针对词的输出向量,但是, V1 个内部节点都有一个输出向量 vn(w,j)

定义某个词作为输出词的概率为

p(w=wO)=j=1L(w)1σ([[n(w,j+1)=ch(n(w,j))]]vn(w,j)Th)(32)

其中, ch(n) n 单元的做孩子,vn(w,j)为内部单元 n(w,j) 的向量表示(输出向量)。 h 为隐含层的输出,[[x]]被定义为

[[x]]={11xx(33)

在上图中,计算 w2 为输出词的概率。在每个内部节点,行走的路径是随机的(往左和往右存在一定的概率)。定义,在内部节点 n ,向左走的概率为

p(n,left)=σ(vnTh)(34)

因此,往右走的概率为

p(n,right)=1σ(vnTh)=σ(vnTh)(35)

所以,在上图中, w2 为输出词的概率为

p(w2=wO)=p(n(w2,1),left)p(n(w2,2),left)p(n(w2,3),right)=σ(vn(w2,1)Th)σ(vn(w2,2)Th)σ(vn(w2,3)Th)(36)

现在来看内部节点的向量表示是如何更新的。首先考虑只有一个词的上下文。为了方便,对公式作适当的简写

[[]]:=[[n(w,j+1)=ch(n(w,j))]]vj:=vn(w,j)(37)(38)

对于每个训练样本,其损失函数为

E=logp(w=wO|wI)=j=1L(w)1logσ([[]]vjTh)(39)

对损失函数 E 求关于vjh的偏导

Evjh=(σ([[]]vjTh)1)[[]]=σ(vjTh)1σ(vjTh)[[]]=1[[]]=1=σ(vjTh)tj(40)

然后,对损失函数 E 求关于vj(即内部节点 n(w,j) 的向量表示)的偏导

Evj=Evjhvjhvj=(σ(vjTh)tj)h(41)

因此,更新方程为

vj(new)=vj(old)η(σ(vjTh)tj)h(42)

可以将 σ(vjTh)tj 理解为内部节点 n(w,j) 的预测误差。每个内部节点的任务是预测往左孩子走还是右孩子走。 tj=1 表示往左, tj=0 表示往右。 σ(vjTh) 表示预测结果。对于一个训练样本,如果预测结果和真实值很接近,则 vj 的变化会很小,否则, vj 会变化一个合适的大小来达到更小的预测误差。

式(42)同样可以用来更新CBoW和skip-gram的参数。

为了学习输入层和隐含层的权重,求 E 关于隐含层输出h的偏导数

Eh=j=1L(w)1Evjhvjhh=j=1L(w)1(σ(vjTh)tj)vj:=EH(43)

因此,可以用CBoW和skip-gram的更新方式来更新权重。

从更新的方程可以看出,每个训练样本的计算复杂度从 O(V) 降到了 O(log(V)) ,这可以极大地改善训练的速度。

Negative Sampling

前文曾经提到过,必须计算词典中所有词的输出向量,这给计算量带来了极大的负担。为了解决这个问题,现在只计算部分的输出向量。

期望输出的那个词必须在取样的样本中,然后再选取部分词作为负样本。

后续的计算过程与Hierarchical Softmax类似,这里不再赘述。

参考文献

[1] Rong X. word2vec Parameter Learning Explained[J]. Computer Science, 2014.
[2] Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值