概要
Word2Vec模型是由Tomas Mikolov在2013发表的《Efficient Estimation of Word Representations in Vector Space》论文中提出的。其主要是为了解决大规模数据下(数据集大且词典表大)训练出低维度(50-100)的高质量的词向量。
Word2Vec模型包含两个模型框架:Continuous Bag of Words Model(CBOW)和Continuous Skip-gram Model(Skip-gram)。如下图
从图中我们知道模型分为三层:输入层、映射层、输出层。为了提高word2vec模型的性能,采用了如下两种实现方法:基于Hierarchical Softmax和基于Negative Sampling。
基于Hierarchical Softmax
输入层: c t c_t ct中包含 2 n 2n 2n个词的词向量, v w t − n , . . . , v w t − 1 , v w t + 1 , . . . , v w t + n ∈ R m v_{w_{t-n}},...,v_{w_{t-1}},v_{w_{t+1}},...,v_{w_{t+n}} \in \R^m vwt−n,...,vwt−1,vwt+1,...,vwt+n∈Rm这里m的含义表示词向量的长度。
映射层:将输入层 2 n 2n 2n个向量做求和累加,取平均,即 x w = 1 2 n ∑ i = 1 2 n v w i \operatorname{x}_w=\frac{1}{2n}\sum_{i=1}^{2n}v_{w_{i}} xw=2n1∑i=12nvwi
输出层:输出层对应一颗二叉树,它是以语料中出现过的词当叶子节点,以各词在语料中出现的次数当权值构造出来的Huffman树。在这课Huffman树中,叶子节点共 N ( = ∣ D ∣ ) N(=|D|) N(=∣D∣)个,分别对应词典 D D D中的词,非叶子节点 N − 1 N-1 N−1个。
如图所示,为词库构建的Huffman树,如何利用此树计算每个词的概率。
在word2vec中采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(霍夫曼树编码1),沿着右子树走,那么就是正类(霍夫曼树编码0)。判别正类和负类的方法是使用sigmoid函数,即:
P
(
+
)
=
σ
(
x
w
T
θ
)
=
1
1
+
e
−
x
w
T
θ
P(+)=\sigma(x_w^T\theta)=\frac{1}{1+e^{-x_w^T\theta}}
P(+)=σ(xwTθ)=1+e−xwTθ1其中
x
w
x_w
xw是当前内部节点的词向量,而
θ
\theta
θ则是我们需要从训练样本求出的逻辑回归的模型参数。对于负类样本的概率:
P
(
−
)
=
1
−
P
(
+
)
=
1
−
1
1
+
e
−
x
w
T
θ
P(-)=1-P(+)=1-\frac{1}{1+e^{-x_w^T\theta}}
P(−)=1−P(+)=1−1+e−xwTθ1为了获得所有节点的词向量和所有内部节点的
θ
\theta
θ,使用最大似然法求解,如上图的
w
2
w_2
w2,我们期望最大化下面的似然函数:
∏
i
=
1
3
P
(
n
(
w
i
)
,
i
)
=
(
1
−
1
1
+
e
−
x
w
T
θ
1
)
(
1
−
1
1
+
e
−
x
w
T
θ
2
)
(
1
−
1
1
+
e
−
x
w
T
θ
3
)
\prod_{i=1}^3P(n(w_i),i)=(1-\frac{1}{1+e^{-x_w^T\theta_1}})(1-\frac{1}{1+e^{-x_w^T\theta_2}})(1-\frac{1}{1+e^{-x_w^T\theta_3}})
i=1∏3P(n(wi),i)=(1−1+e−xwTθ11)(1−1+e−xwTθ21)(1−1+e−xwTθ31)为了便于我们后面一般化的描述,我们定义输入的词为
w
w
w,其从输入层词向量求和平均后的霍夫曼树根节点词向量为
x
w
x_w
xw, 从根节点到
w
w
w所在的叶子节点,包含的节点总数为
l
w
l_w
lw,
w
w
w在霍夫曼树中从根节点开始,经过的第
i
i
i个节点表示为
p
i
w
p_{i}^w
piw,对应的霍夫曼编码为
d
i
w
d^w_i
diw∈{0,1},其中
i
=
1
,
2
,
.
.
.
,
l
w
i=1,2,...,l_w
i=1,2,...,lw。而该节点对应的模型参数表示为
θ
i
w
\theta_i^w
θiw, 其中
i
=
1
,
2
,
.
.
.
,
l
w
−
1
i=1,2,...,l_w-1
i=1,2,...,lw−1,没有
i
=
l
w
i=l_w
i=lw是因为模型参数仅仅针对于霍夫曼树的内部节点。
定义
w
w
w经过的Huffman树某一个节点
j
j
j的逻辑回归概率为
P
(
d
j
w
∣
x
w
,
θ
j
−
1
w
)
P(d_j^w|x_w,\theta_{j-1}^w)
P(djw∣xw,θj−1w),其表达式为:
P
(
d
j
w
∣
x
w
,
θ
j
−
1
w
)
=
{
σ
(
x
w
T
θ
j
−
1
w
)
d
j
w
=
0
1
−
σ
(
x
w
T
θ
j
−
1
w
)
d
j
w
=
1
P(d_j^w|x_w,\theta_{j-1}^w)=\begin{cases} \sigma(x_w^T\theta_{j-1}^w) & d_j^w=0 \\ 1-\sigma(x_w^T\theta_{j-1}^w) & d_j^w=1 \end{cases}
P(djw∣xw,θj−1w)={σ(xwTθj−1w)1−σ(xwTθj−1w)djw=0djw=1那么对于某一个目标输出词
w
w
w,其最大似然为:
∏
j
=
2
l
w
P
(
d
j
w
∣
x
w
,
θ
j
−
1
w
)
=
∏
j
=
2
l
w
[
σ
(
x
w
T
θ
j
−
1
w
)
]
1
−
d
j
w
[
1
−
σ
(
x
w
T
θ
j
−
1
w
)
]
d
j
w
\prod_{j=2}^{l_w}P(d_j^w|x_w,\theta_{j-1}^w)=\prod_{j=2}^{l_w}[\sigma(x_w^T\theta_{j-1}^w)]^{1-d_j^w}[1-\sigma(x_w^T\theta_{j-1}^w)]^{d_j^w}
j=2∏lwP(djw∣xw,θj−1w)=j=2∏lw[σ(xwTθj−1w)]1−djw[1−σ(xwTθj−1w)]djw在word2vec中,由于使用的是随机梯度上升法,所以并没有把所有样本的似然乘起来得到真正的训练集最大似然,仅仅每次只用一个样本更新梯度,这样做的目的是减少梯度计算量。这样我们可以得到
w
w
w的对数似然函数
L
L
L如下:
L
=
l
o
g
∏
j
=
2
l
w
P
(
d
j
w
∣
x
w
,
θ
j
−
1
w
)
=
∑
j
=
2
l
w
(
(
1
−
d
j
w
)
l
o
g
[
σ
(
x
w
T
θ
j
−
1
w
)
]
+
d
j
w
l
o
g
[
1
−
σ
(
x
w
T
θ
j
−
1
w
)
]
)
L=log\prod_{j=2}^{l_w}P(d_j^w|x_w,\theta_{j-1}^w)=\sum_{j=2}^{l_w}((1-d_j^w)log[\sigma(x_w^T\theta_{j-1}^w)]+d_j^wlog[1-\sigma(x_w^T\theta_{j-1}^w)])
L=logj=2∏lwP(djw∣xw,θj−1w)=j=2∑lw((1−djw)log[σ(xwTθj−1w)]+djwlog[1−σ(xwTθj−1w)])根据梯度求解可以得到模型参数
θ
j
−
1
w
\theta_{j-1}^w
θj−1w和
x
w
x_w
xw的梯度:
∂
L
∂
θ
j
−
1
w
=
(
1
−
d
j
w
−
σ
(
x
w
T
θ
j
−
1
w
)
)
x
w
\frac{\partial L}{\partial \theta_{j-1}^w}=(1-d_j^w-\sigma(x_w^T\theta_{j-1}^w))x_w
∂θj−1w∂L=(1−djw−σ(xwTθj−1w))xw
∂
L
∂
x
w
=
∑
j
=
2
l
w
(
1
−
d
j
w
−
σ
(
x
w
T
θ
j
−
1
w
)
)
θ
j
−
1
w
\frac{\partial L}{\partial x_w}=\sum_{j=2}^{l_w}(1-d_j^w-\sigma(x_w^T\theta_{j-1}^w))\theta_{j-1}^w
∂xw∂L=j=2∑lw(1−djw−σ(xwTθj−1w))θj−1w有了梯度表达式,我们就可以用梯度上升法进行迭代来一步步的求解我们需要的所有的
θ
j
−
1
w
\theta_{j-1}^w
θj−1w和
x
w
x_w
xw,即:¥
θ
j
−
1
w
=
θ
j
−
1
w
+
η
(
1
−
d
j
w
−
σ
(
x
w
T
θ
j
−
1
w
)
)
x
w
\theta_{j-1}^w=\theta_{j-1}^w+\eta(1-d_j^w-\sigma(x_w^T\theta_{j-1}^w))x_w
θj−1w=θj−1w+η(1−djw−σ(xwTθj−1w))xw
x
i
=
x
i
+
η
∑
j
=
2
l
w
(
1
−
d
j
w
−
σ
(
x
w
T
θ
j
−
1
w
)
)
θ
j
−
1
w
(
i
=
1
,
2
,
.
.
.
,
2
n
)
x_i=x_i+\eta\sum_{j=2}^{l_w}(1-d_j^w-\sigma(x_w^T\theta_{j-1}^w))\theta_{j-1}^w\quad(i=1,2,...,2n)
xi=xi+ηj=2∑lw(1−djw−σ(xwTθj−1w))θj−1w(i=1,2,...,2n)其中
η
\eta
η为学习步长。
CBOW的基于Hierarchical Softmax的算法流程:
输入:基于CBOW的语料训练样本,词向量的维度大小 M M M,CBOW的上下文大小 2 n 2n 2n,步长 η \eta η
输出:霍夫曼树的内部节点模型参数 θ \theta θ,所有的词向量 w w w
(1)、 基于语料训练样本建立霍夫曼树。
(2)、 随机初始化所有的模型参数𝜃,所有的词向量𝑤
(3)、进行梯度上升迭代过程,对于训练集中的每一个样本(𝑐_t,𝑤)做如下处理:
- e=0, 计算 x w = 1 2 n ∑ i = 1 2 n x i x_w=\frac{1}{2n}\sum_{i=1}^{2n}x_i xw=2n1∑i=12nxi
- for j=2 to l w l_w lw, 计算: f = σ ( x w T θ j − 1 w ) f=\sigma(x_w^T\theta_{j-1}^w) f=σ(xwTθj−1w) g = ( 1 − d j w − f ) η g=(1-d_j^w-f)\eta g=(1−djw−f)η e = e + g θ j − 1 w e=e+g\theta^w_{j-1} e=e+gθj−1w θ j − 1 w = θ j − 1 w + g x w \theta^w_{j-1}=\theta^w_{j-1}+gx_w θj−1w=θj−1w+gxw
- 对于 c t c_t ct中的每一个词向量 x i x_i xi(共 2 n 2n 2n个)进行更新: x i = x i + e x_i=x_i+e xi=xi+e
- 如果梯度收敛,则结束梯度迭代,否则回到步骤(3)继续迭代。
Skip-gram的基于Hierarchical Softmax的算法流程:
输入:基于Skip-Gram的语料训练样本,词向量的维度大小 M M M,Skip-Gram的上下文大小 2 n 2n 2n,步长 η \eta η
输出:霍夫曼树的内部节点模型参数 θ \theta θ,所有的词向量 w w w
1、 基于语料训练样本建立霍夫曼树
2、随机初始化所有的模型参数 θ \theta θ,所有的词向量 w w w,
3、 进行梯度上升迭代过程,对于训练集中的每一个样本(𝑤,c_t)做如下处理:
1) for i = 1 to 2n:
- e =0
- for j = 2 to l w l_w lw,计算: f = σ ( x i T θ j − 1 w ) f=\sigma(x_i^T\theta_{j-1}^w) f=σ(xiTθj−1w) g = ( 1 − d j w − f ) η g=(1-d_j^w-f)\eta g=(1−djw−f)η e = e + g θ j − 1 w e=e+g\theta^w_{j-1} e=e+gθj−1w θ j − 1 w = θ j − 1 w + g x i \theta^w_{j-1}=\theta^w_{j-1}+gx_i θj−1w=θj−1w+gxi3. x i = x i + e x_i=x_i+e xi=xi+e
2) 如果梯度收敛,则结束梯度迭代,算法结束,否则回到步骤1)继续迭代
总结:从Huffman树的原理来看,对于处理高频词具有很大的优势,但是对于处理生僻词,则需要很大的开销。
基于Negative Sampling
为了解决Huffman树的缺点,提出了负采样算法。
negative sampling的原理是:如有一个训练样本,中心词为
w
t
w_t
wt,其上下文为
c
t
=
(
w
t
−
n
,
.
.
.
,
w
t
−
1
,
w
t
+
1
,
.
.
.
,
w
t
+
n
)
c_t=(w_{t-n},...,w_{t-1},w_{t+1},...,w_{t+n})
ct=(wt−n,...,wt−1,wt+1,...,wt+n),这里中心词
w
t
w_t
wt和
c
t
c_t
ct是具有相关性的,作为正样本。然后通过采样得到
n
e
g
neg
neg个和
w
t
w_t
wt不同的中心词
w
i
,
i
∈
[
1
,
2
,
.
.
.
,
n
e
g
]
w_i,i\in [1,2,...,neg]
wi,i∈[1,2,...,neg],这些采样得到的中心词和
c
t
c_t
ct就组成了负样本。最后利用这个正样本和
n
e
g
neg
neg个负样本进行二元逻辑回归,得到负采样对应每个词
w
i
w_i
wi对应的模型参数
θ
i
\theta_i
θi和每个词的词向量。
如何进行负采样(negative sampling)?
假设词汇表的大小为
V
V
V,算法采用全局采样(除正样本之外的所有词),将词频作为采样概率:
p
(
w
)
=
c
o
u
n
t
(
w
)
∑
u
∈
v
o
c
a
b
c
o
u
n
t
(
u
)
p(w)=\frac{count(w)}{\sum_{u\in vocab}count(u)}
p(w)=∑u∈vocabcount(u)count(w)而在word2vec中分子和分母都取了
3
4
\frac{3}{4}
43次幂:
p
(
w
)
=
c
o
u
n
t
(
w
)
3
/
4
∑
u
∈
v
o
c
a
b
c
o
u
n
t
(
u
)
3
/
4
p(w)=\frac{count(w)^{3/4}}{\sum_{u\in vocab}count(u)^{3/4}}
p(w)=∑u∈vocabcount(u)3/4count(w)3/4
负采样之后,接下来就是利用二元逻辑回归求解模型参数,对于正样本:
P
(
c
t
,
w
i
)
=
σ
(
x
c
t
T
θ
w
i
)
,
y
i
=
1
,
i
=
0
P(c_t,w_i)=\sigma(x_{c_t}^T\theta^{w_i}),y_i=1,i=0
P(ct,wi)=σ(xctTθwi),yi=1,i=0对于负样本:
P
(
c
t
,
w
i
)
=
1
−
σ
(
x
c
t
T
θ
w
i
)
,
y
i
=
0
,
i
=
1
,
2
,
.
.
.
,
n
e
g
P(c_t,w_i)=1-\sigma(x_{c_t}^T\theta^{w_i}),y_i=0,i=1,2,...,neg
P(ct,wi)=1−σ(xctTθwi),yi=0,i=1,2,...,neg最后我们得到目标函数:
L
=
∑
i
=
0
n
e
g
y
i
l
o
g
(
σ
(
x
c
t
T
θ
w
i
)
)
+
(
1
−
y
i
)
l
o
g
(
1
−
σ
(
x
c
t
T
θ
w
i
)
)
L=\sum_{i=0}^{neg}y_ilog(\sigma(x_{c_t}^T\theta^{w_i}))+(1-y_i)log(1-\sigma(x_{c_t}^T\theta^{w_i}))
L=i=0∑negyilog(σ(xctTθwi))+(1−yi)log(1−σ(xctTθwi))
同样的,可以得到
θ
w
i
\theta^{w_i}
θwi和
x
c
t
x_{c_t}
xct的梯度
∂
L
∂
θ
w
i
=
(
y
i
−
σ
(
x
c
t
T
θ
w
i
)
)
x
c
t
\frac{\partial L}{\partial \theta^{w_i}}=(y_i-\sigma(x_{c_t}^T\theta^{w_i}))x_{c_t}
∂θwi∂L=(yi−σ(xctTθwi))xct
∂
L
∂
x
c
t
=
∑
i
=
0
n
e
g
(
y
i
−
σ
(
x
c
t
T
θ
w
i
)
)
θ
w
i
\frac{\partial L}{\partial x_{c_t}}=\sum_{i=0}^{neg}(y_i-\sigma(x_{c_t}^T\theta^{w_i}))\theta^{w_i}
∂xct∂L=i=0∑neg(yi−σ(xctTθwi))θwi有了梯度就可以进一步求解参数了。
CBOW的基于Negative Sampling的算法流程:
输入:基于CBOW的语料训练样本,词向量的维度大小 M M M,CBOW的上下文大小 2 n 2n 2n,步长 η \eta η, 负采样的个数 n e g neg neg
输出:词汇表每个词对应的模型参数 θ \theta θ,所有的词向量 w w w
(1)、随机初始化所有的模型参数 θ \theta θ,所有的词向量 w w w
(2)、对于每个训练样本 ( c t , w 0 ) (c_{t},w_0) (ct,w0),负采样出 n e g neg neg个负例中心词 w i , i = 1 , 2 , . . . , n e g w_i,i=1,2,...,neg wi,i=1,2,...,neg
(3)、 进行梯度上升迭代过程,对于训练集中的每一个样本 ( c t , w 0 , w 1 , . . . , w n e g ) (c_{t},w_0,w_1,...,w_{neg}) (ct,w0,w1,...,wneg)做如下处理:
- e=0, 计算 x w 0 = 1 2 n ∑ i = 1 2 n x i x_{w_0}=\frac{1}{2n}\sum_{i=1}^{2n}x_i xw0=2n1∑i=12nxi
- for i = 0 to neg, 计算: f = σ ( x w 0 T θ w i ) f=\sigma(x_{w_0}^T\theta^{w_i}) f=σ(xw0Tθwi) g = ( y i − f ) η g=(y_i-f)\eta g=(yi−f)η e = e + g θ w i e = e+g\theta^{w_i} e=e+gθwi θ w i = θ w i + g x w 0 \theta^{w_i}=\theta^{w_i}+gx_{w_0} θwi=θwi+gxw0
- 对于 c t c_t ct中的每一个词向量 x k x_k xk(共 2 n 2n 2n个)进行更新: x k = x k + e x_k=x_k+e xk=xk+e
- 如果梯度收敛,则结束梯度迭代,否则回到步骤(3)继续迭代。
Skip-gram的基于Negative Sampling的算法流程:
输入:基于Skip-Gram的语料训练样本,词向量的维度大小 M M M,Skip-Gram的上下文大小 2 n 2n 2n,步长 η \eta η, 采样的个数 n e g neg neg。
输出:词汇表每个词对应的模型参数 θ \theta θ,所有的词向量 w w w
(1)、 随机初始化所有的模型参数 θ \theta θ,所有的词向量 w w w
(2)、对于每个训练样本( c t , w 0 c_t, w_0 ct,w0),负采样出 n e g neg neg个负例中心词 w i , i = 1 , 2 , . . . , n e g w_i,i=1,2,...,neg wi,i=1,2,...,neg
(3)、进行梯度上升迭代过程,对于训练集中的每一个样本( c t , w 0 , w 1 , . . . , w n e g c_t, w_0, w_1,...,w_{neg} ct,w0,w1,...,wneg)做如下处理:
1) for i = 1 to 2n:
- e=0
- for j = 0 to neg, 计算: f = σ ( x w 0 i T θ w j ) f=\sigma(x_{w_{0i}}^T\theta^{w_j}) f=σ(xw0iTθwj) g = ( y j − f ) η g=(y_j-f)\eta g=(yj−f)η e = e + g θ w j e=e+g\theta^{w_j} e=e+gθwj θ w j = θ w j + g x w 0 i \theta^{w_j}=\theta^{w_j}+gx_{w_{0i}} θwj=θwj+gxw0i
- 词向量更新: x w 0 i = x w 0 i + e x_{w_{0i}}=x_{w_{0i}}+e xw0i=xw0i+e
2) 如果梯度收敛,则结束梯度迭代,算法结束,否则回到步骤1)继续迭代。
参考资料:
《Efficient Estimation of Word Representations in Vector Space》
word2vec原理(一) 基于Hierarchical Softmax的模型
word2vec原理(二) 基于Hierarchical Softmax的模型
word2vec原理(三) 基于Hierarchical Softmax的模型