【NLP】Word2vec(CBOW+Skip-gram+负例采样)

一、连续词袋模型(CBOW)

1、含义:
  给定上下文{“The”, “people”, “their’, “country”},预测中心的词语"love”,叫做连续词袋模型。
  首先,建立模型已知参数。将选定窗口的上下文词使用one-hot向量表示,作为模型的输入,记为W。模型的输出label记为y。
  其次,构建未知参数。初始化两个矩阵 V ∈ R ∣ V ∣ ∗ n V\in R^{|V|*n} VRVn U ∈ R n ∗ ∣ V ∣ U\in R^{n*|V|} URnV 。其中n表示embedding后的词向量维度。V是输入词矩阵。当词语 w i w_i wi(译注: w i w_i wi是只有第i维是1其他维是0的one-hot向量)作为模型的一个输入的时候,V的第i行就是它的n维“嵌入向量”(embedded vector)。我们将V的这一行表示为 v i v_i vi。类似的,U是输出矩阵。当 w j w_j wj作为模型输出的时候,U的第j列就是它的n维“嵌入向量”。我们将U的这一列表示为 u j u_j uj要注意我们实际上对于每个词语 w i w_i wi学习了两个向量。(作为输入词的向量 v i v_i vi,和作为输出词的向量 u j u_j uj
  再次,模型实际输出 y ^ \displaystyle \hat{y} y^与label y构建交叉熵损失函数。通过梯度下降法,求未知参数 V ∈ R ∣ V ∣ ∗ n V\in R^{|V|*n} VRVn U ∈ R n ∗ ∣ V ∣ U\in R^{n*|V|} URnV
2、网络图
连续词袋模型(CBOW)中的各个记号:

  • w i w_i wi:单词表中的第i个单词的one-hot表示
  • v ∈ R n ∗ ∣ V ∣ v\in R^{n*|V|} vRnV:输入词矩阵
  • v i v_i vi:V的第i列,单词 w i w_i wi的输入向量
  • u ∈ R ∣ V ∣ ∗ n u\in R^{|V|*n} uRVn:输出词矩阵
  • u i u_i ui:U的第i行,单词 w i w_i wi的输出向量
    在这里插入图片描述在这里插入图片描述
    3、详细介绍
    那这个模型是如何运作的呢?我们把整个过程拆分成以下几步:
    (1)对于m个词长度的输入上下文,我们产生它们的one-hot向量
    w ( c − m ) , ⋯   , w ( c − 1 ) , w ( c + 1 ) , ⋯   , w ( c + m ) w^{(c-m)},\cdots,w^{(c-1)},w^{(c+1)},\cdots,w^{(c+m)} w(cm),,w(c1),w(c+1),,w(c+m))。
    (2)我们得到上下文的嵌入词向量 v i = V w i v_i=Vw_i vi=Vwi
    (3)产生一个得分向量 z = U v ^ z=U\hat v z=Uv^
    (4)将得分向量转换成概率分布形式 y ^ = s o f t m a x ( z ) \hat y=softmax(z) y^=softmax(z)
    (5)我们希望我们产生的概率分布 ,与真实概率分布 y ^ \hat y y^相匹配。而 y y y刚好也就是我们期望的真实词语的one-hot向量。
    4、损失函数
    H ( y ^ , y ) = − ∑ j = 1 ∣ V ∣ y j l o g ( y ^ j ) H(\hat y,y)=-\sum_{j=1}^{|V|}y_jlog(\hat y_j) H(y^,y)=j=1Vyjlog(y^j)

  y只是一个one-hot向量,于是上面的损失函数就可以简化为:

H ( y ^ , y ) = − y i l o g ( y ^ i ) H(\hat y,y)=-y_ilog(\hat y_i) H(y^,y)=yilog(y^i)

  用c表示y这个one-hot向量取值为1的那个维度的下标。所以在预测为准确值的情况下 y ^ c = 1 \hat y_c =1 y^c=1。于是损失为 −1 log(1) = 0。所以对于一个理想的预测值,因为预测得到的概率分布和真实概率分布完全一样,因此损失为0。对于预测不理想的结果 y ^ c = 0.01 \hat y_c =0.01 y^c=0.01。计算得到的损失为−1 log(0.01) ≈ 4.605,损失非常大。交叉熵为我们提供了一个很好的衡量两个概率分布的差异的方法。概率越低,损失越大。最终的优化函数如下图。最后梯度下降法去更新每一个相关的词向量 u c u_c uc v j v_j vj
在这里插入图片描述

二、Skip-Gram 模型

  只要给出中心词,所有的输出词是完全独立的。给出中心词"love"为输入,能够预测或产生它周围的词语{“The”, “people”, "their’, “country”}等。我们把它叫做Skip-Gram 模型。
  这个模型的建立与连续词袋模型(CBOM)非常相似,但本质上是交换了输入和输出的位置。我们令输入的one-hot向量(中心词)为 w w w(因为它只有一个),输出向量为 y j \displaystyle y_{j} yj。U和V的定义与连续词袋模型一样。

Skip-Gram 模型中的各个记号:

  • w i w_i wi:单词表中的第i个单词的one-hot表示
  • v ∈ R n ∗ ∣ V ∣ v\in R^{n*|V|} vRnV:输入词矩阵
  • v i v_i vi:V的第i列,单词 w i w_i wi的输入向量
  • u ∈ R ∣ V ∣ ∗ n u\in R^{|V|*n} uRVn:输出词矩阵
  • u i u_i ui:U的第i行,单词 w i w_i wi的输出向量

对应到上面部分,我们可以把Skip-Gram 模型的运作方式拆分成以下几步:

  1. 生成one-hot输入向量w。
  2. 得到上下文的嵌入词向量 v c = V w v_c=Vw vc=Vw
  3. 因为这里不需要取平均值的操作,所以直接是 v ^ = v c \hat v=v_c v^=vc
  4. 通过 u = U v c u=Uv_c u=Uvc产生2m个得分向量 u c − m , ⋯   , u c − 1 , u c + 1 , ⋯   , u ( c + m ) u_{c-m},\cdots,u_{c-1},u_{c+1},\cdots,u_{(c+m)} ucm,,uc1,uc+1,,u(c+m)
  5. 将得分向量转换成概率分布形式 y = s o f t m a x ( u ) y=softmax(u) y=softmax(u)
  6. 我们希望我们产生的概率分布与真实概率分布 y c − m , ⋯   , y c − 1 , , y c + 1 ⋯   , y c + m y^{c-m},\cdots,y^{c-1},,y^{c+1}\cdots,y^{c+m} ycm,,yc1,,yc+1,yc+m 相匹配,也就是我们真实输出结果的one-hot向量。

  与CBOW不同在于Skip-gram引入朴素贝叶斯假设,将联合概率拆分成独立概率相乘。即在条件独立的情况下,只要给出了中心词,所有的输出词是完全独立的。

三、负例采样(Negative Sampling)

  对整个单词表|V|求和的计算量是非常巨大的,任何一个对目标函数的更新和求值操作都会有O(|V|)的时间复杂度。需要一个思路去简化一下。
对于每一步训练,不去循环整个单词表,而只是抽象一些负面例子就够了!我们可以从一个噪声分布 ( P n ( w ) ) (P_n(w)) (Pn(w))中抽样,其概率分布与单词表中的频率相匹配。为了将描述问题的公式与负例采样相结合,只需要更新:

  • 目标函数
  • 梯度
  • 更新规则

  虽然负例采样是基于Skip-Gram 模型,它实际上是对一个不同的目标函数进行最优化。考虑一个“词-上下文”对(w,c),令P(D = 1|w, c)为(w, c)来自于语料库的概率。相应的,P(D = 0|w, c) 则是不来自于语料库的概率。我们首先对P(D = 1|w, c)用sigmoid函数建模:
p ( D = 1 ∣ w , c , θ ) = 1 1 + e ( − v c T v w ) p(D=1|w,c,\theta)= {1\over{1+e^{(-v_c^Tv_w)}}} p(D=1w,c,θ)=1+e(vcTvw)1
现在建立一个新的目标函数。如果(w, c)真是来自于语料库,目标函数能够最大化P(D = 1|w, c)。反之亦然。对这两个概率采用一个简单的最大似然法。(这里令θ为模型的参数,在例子中,就是对应的U和V。)
在这里插入图片描述
注意这里的 D ~ \widetilde D D 表示“错误的”或者“负面的”语料库,像句子"stock boil fish is toy"就是从这样的语料库来的。不自然的句子应该有比较低的发生概率,我们可以从词库中随机采样来产生这样的“负面的”语料库。我们的新目标函数就变成了:

l o g σ ( u ( c − m + j ) T . v c ) + ∑ k = 1 K l o g σ ( − u ~ k T . v c ) log\sigma(u_(c-m+j)^T.v_c)+\sum_{k=1}^Klog\sigma(-\widetilde u_k^T.v_c) logσ(u(cm+j)T.vc)+k=1Klogσ(u kT.vc)

在这里 { u ~ k ∣ k = 1 , ⋯   , K } \{\widetilde u_k|k=1,\cdots,K\} {u kk=1,,K}是从(Pn(w))中抽样取到的。需要多说一句的是,虽然关于怎么样最好地近似有许多讨论和研究,但是工作效果最好的似乎是指数为3/4的一元语言模型。至于为什么是3/4,下面有几个例子来帮助大家感性地理解一下:

i s : 0. 9 3 / 4 = 0.92 c o n s t i t u t i o n : 0.0 9 3 / 4 = 0.16 b o m b a s t i c : 0.0 1 3 / 4 = 0.032 is:0.9^{3/4}=0.92\\ constitution:0.09^{3/4}=0.16 \\ bombastic:0.01^{3/4}=0.032 is:0.93/4=0.92constitution:0.093/4=0.16bombastic:0.013/4=0.032

经过3/4这样一个指数处理,“Bombastic”(少见)被采样的概率是之前的3倍,而“is”这个词(多见)被采样的概率只是稍微增长了一点点。


参考文献:
网易云课堂NLP课程:文本表示:词向量的构建与分布表示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值