Word2Vec之Skip-Gram

本文深入解析word2vec算法,包括Skip-Gram模型、NegativeSampling和HierarchicalSoftmax优化技巧,阐述词向量计算原理,适合自然语言处理领域的研究者和实践者阅读。

一.什么是word2vec

word2vec是Google开源的一款用于(分布式)词向量计算的工具。word2vec不仅可以在百万数量级的词典和上亿的数据集上进行高效地训练,还可以得到训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。其实word2vec算法的背后是一个浅层神经网络,而且还是一个计算word vector的开源工具。当我们在说word2vec算法或模型的时候,其实指的是其背后用于计算word vector的CBoW模型Skip-gram模型。而Negative SamplingHierachical Softmax则是优化提升前面这两种模型的训练算法。

二、Skip-Gram

2.1 Skip-Gram 模型

Skip-Gram在传统的NNLM语言模型基础上进行了改进简化,使用了下面这种全连接的网络结构:
sg
这样训练得到的权重矩阵W和W’就是词向量,最后可以把两个词向量相加或者拼接从而得到最终的词向量。

我们把训练词向量的问题转换为端到端的文本分类问题。如下图所示,对于语料库中的一个句子,假设临近窗口为前后两个词,则可以抽取出如下图右边所示的训练样本,每个训练样本是一个(中心词,临近词)的pair
sample
比如对于(the, quick)训练样本,我们希望神经网络在输入the这个中心词时,能以较高的概率预测出quick这个词。

  • 表示输入是the的one-hot编码,输出是quick的one-hot编码。
  • 假设词典里有10000个不同的词,则one-hot编码长度为10000。
  • 有一个隐藏层的全连接网络,对应权重构成两个权重矩阵,和输入层连接的矩阵为W,其每一列表示词作为中心词时的词向量 v c v_c vc。输入的one-hot行向量乘以 W W W正好得到输入词的词向量。
  • 隐层和输出层连接的权重矩阵为W',其每一行表示输出层的词的临近词词向量 u o u_o uo
  • v c v_c vc乘以矩阵W’,得到中心词的临近词 u o u_o uo的概率分布,再经过softmax激活,进行归一化。

其实反过来看,从输出往隐层看,相当于输出层的行向量乘以的转置,得到隐层词向量。这其实就是另一种训练词向量的方法CBOW,即英语完形填空,用临近词来预测中心词。

详细的看一下:
sg
对照上面这张图,总结一下使用神经网络训练SG模型求解词向量的具体步骤如下:
(1)对于某一个训练样本(单词对),初始化中心词的one-hot向量 w t : ( V , 1 ) w_t : (V,1) wt:(V,1),然后作为神经网络的输入;
(2)将权重矩阵 W : ( d , V ) W : (d,V) W:(d,V) 乘以one-hot向量 w t : ( V , 1 ) w_t : (V,1) wt:(V,1) ,得到中心词的word2vec词向量 v c : ( d , 1 ) v_c : (d,1) vc:(d,1)
(3)然后将词向量中心词向量 v c : ( d , 1 ) v_c : (d,1) vc:(d,1)乘以权重矩阵 W ′ : ( V , d ) W' : (V,d) W:(V,d) ,得到邻近词的一个概率分布 w v c ′ : ( V , 1 ) w'_{v_c} : (V,1) wvc:(V,1)
(4)再经过softmax操作得到一个(V,1)维度的概率分布,概率值最大的那个单词就是该位置预测的单词 w t − j w_{t-j} wtj,也就是通过中心词预测的某一个邻近词,然后再进行梯度下降算法优化权重值。
(5)再将这个中心词的其他邻近词进行1-4步的操作,从而得到这个中心词的所有邻近词的预测。

可以按照上面这几个步骤对语料中的所有句子进行训练。最终得到了所有单词的词向量。

当然这种全连接网络虽然能很方便的计算词向量,但还是存在一个问题:当词向量个数巨大时,网络过于庞大,参数量太多。对于这个问题,可以采用 subsampling 技巧,每个词都有一个保留概率p,以p的概率保留在训练数据中,以1-p的概率删除这个词。对于某个词 w i w_i wi,其保留概率p如下,其中 z ( w i ) z(w_i) z(wi)是词频:
p ( w i ) = ( z ( w i ) 0.001 + 1 ) 0.001 z ( w i ) p(w_i)=(\sqrt{\frac{z(w_i)}{0.001}}+1)\frac{0.001}{z(w_i)} p(wi)=(0.001z(wi) +1)z(wi)0.001
也就是说词频越大,被删得概率越大。

2.2 目标函数

Skip-Gram的中心思想就是对于每个选定的中心词,尽量准确预测其周围可能出现的词的概率分布。

具体来说,SG算法首先随机初始化每个词的词向量(或者one-hot),然后预测不同邻近词出现的概率,最后最大化实际邻近词出现的概率。形式化来说,就是利用极大似然估计的方法,求解每个词的词向量,其目标函数如下:
L i k e l i h o o d = L ( θ ) = Π t = 1 T Π − m ≤ j ≤ m   p ( w t + j ∣ w t , θ ) Likelihood=L(\theta)=\mathop{\Pi}\limits_{t=1}^{T}\mathop{\Pi}\limits_{-m\leq j \leq m} \ p(w_{t+j}|w_t,\theta) Likelihood=L(θ)=t=1ΠTmjmΠ p(wt+jwt,θ)

其中, θ \theta θ是待求解的参数,这两个矩阵其实都是词向量组成的矩阵,我们最后求出来之后可以直接相加也可以拼接成一个更大的词向量。t是选定的中心词的位置, w t w_t wt就表示选定的中心词, w t + j w_{t+j} wt+j就表示距离 t 位置 j 距离的词。最终目标是要最小化这个 L 函数。

求解极大似然估计一般就是转化为取负数对数似然,然后利用梯度下降求解最小化之后的 L。上式转化之后等价于:
J ( θ ) = − 1 T l o g L ( θ ) = − 1 T ∑ t = 1 T ∑ − m ≤ j ≤ m   l o g p ( w t + j ∣ w t , θ ) J(\theta)=-\frac{1}{T}logL(\theta)=-\frac{1}{T} \mathop{\sum}\limits_{t=1}^{T}\mathop{\sum}\limits_{-m\leq j \leq m} \ logp(w_{t+j}|w_t,\theta) J(θ)=T1logL(θ)=T1t=1Tmjm logp(wt+jwt,θ)

2.3 梯度下降算法

那我们再看看预测到的某个上下文条件概率 p ( w t + j ∣ w t ) p(w_{t+j}|w_t) p(wt+jwt)是如何得到的,可以通过naive-softmax
p ( o ∣ c ) = e x p ( u o T v c ) ∑ w ∈ V e x p ( u w T v c ) (2.3.1) p(o|c)=\frac{exp(u_o^Tv_c)}{\sum\limits_{w \in V}exp(u^T_wv_c)} \tag{2.3.1} p(oc)=wVexp(uwTvc)exp(uoTvc)(2.3.1)
这里o是输出的上下文词语中的确切某一个,c是中间词。u是c对应的(某一个)上下文词语o的词向量v是(某一个)中心词c的词向量。指数函数可以把实数映射成正数。分子上点积也有点像衡量两个向量相似度的方法,两个向量越相似,其点积越大,而分母则是起到归一化得到概率的作用。

【重点】:有了 u 和 v 这两个词向量的定义之后,我们可以把原来目标函数中的 θ \theta θ 表示为下面这种形式
theta
由于上述两个矩阵的原因,所以θ的维度中有个2。

然后再结合等式(2.3.1)基于naive-softmax的Skig-Gram算法目标函数就变成了:
J ( u , v ) n a i v e − s o f t m a x = − 1 T ∑ t = 1 T ∑ − m ≤ j ≤ m   l o g p ( o ∣ c ) = − 1 T ∑ t = 1 T ∑ − m ≤ j ≤ m   l o g e x p ( u o T v c ) ∑ w ∈ V e x p ( u w T v c ) (2.3.2) \begin{array}{ll} J(u,v)_{naive-softmax} & =-\frac{1}{T} \mathop{\sum}\limits_{t=1}^{T}\mathop{\sum}\limits_{-m\leq j \leq m} \ log p(o|c)\\ &=-\frac{1}{T} \mathop{\sum}\limits_{t=1}^{T}\mathop{\sum}\limits_{-m\leq j \leq m} \ log \frac{exp(u_o^Tv_c)}{\sum\limits_{w \in V}exp(u^T_wv_c)} \tag{2.3.2}\\ \end{array} J(u,v)naivesoftmax=T1t=1Tmjm logp(oc)=T1t=1Tmjm logwVexp(u

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值