一、连续词袋模型(CBOW)
1、含义:
给定上下文{“The”, “people”, “their’, “country”},预测中心的词语"love”,叫做连续词袋模型。
首先,建立模型已知参数。将选定窗口的上下文词使用one-hot向量表示,作为模型的输入,记为W。模型的输出label记为y。
其次,构建未知参数。初始化两个矩阵
V
∈
R
∣
V
∣
∗
n
V\in R^{|V|*n}
V∈R∣V∣∗n和
U
∈
R
n
∗
∣
V
∣
U\in R^{n*|V|}
U∈Rn∗∣V∣ 。其中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}
V∈R∣V∣∗n和
U
∈
R
n
∗
∣
V
∣
U\in R^{n*|V|}
U∈Rn∗∣V∣ 。
2、网络图
连续词袋模型(CBOW)中的各个记号:
- w i w_i wi:单词表中的第i个单词的one-hot表示
- v ∈ R n ∗ ∣ V ∣ v\in R^{n*|V|} v∈Rn∗∣V∣:输入词矩阵
- v i v_i vi:V的第i列,单词 w i w_i wi的输入向量
- u ∈ R ∣ V ∣ ∗ n u\in R^{|V|*n} u∈R∣V∣∗n:输出词矩阵
-
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(c−m),⋯,w(c−1),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=1∑∣V∣yjlog(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|} v∈Rn∗∣V∣:输入词矩阵
- v i v_i vi:V的第i列,单词 w i w_i wi的输入向量
- u ∈ R ∣ V ∣ ∗ n u\in R^{|V|*n} u∈R∣V∣∗n:输出词矩阵
- u i u_i ui:U的第i行,单词 w i w_i wi的输出向量
对应到上面部分,我们可以把Skip-Gram 模型的运作方式拆分成以下几步:
- 生成one-hot输入向量w。
- 得到上下文的嵌入词向量 v c = V w v_c=Vw vc=Vw。
- 因为这里不需要取平均值的操作,所以直接是 v ^ = v c \hat v=v_c v^=vc。
- 通过 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)} uc−m,⋯,uc−1,uc+1,⋯,u(c+m)。
- 将得分向量转换成概率分布形式 y = s o f t m a x ( u ) y=softmax(u) y=softmax(u)。
- 我们希望我们产生的概率分布与真实概率分布 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} yc−m,⋯,yc−1,,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=1∣w,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(c−m+j)T.vc)+k=1∑Klogσ(−u kT.vc)
在这里 { u ~ k ∣ k = 1 , ⋯ , K } \{\widetilde u_k|k=1,\cdots,K\} {u k∣k=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课程:文本表示:词向量的构建与分布表示