文章目录
语言模型认为前面的词对后面的有影响,所以可以用前面的词预测后一个词。用n个词去预测后一个,就是n-gram模型。
Word2Vec认为句子中相似词是有关系的(可以简单理解为物以类聚),所以可以用词去预测词,skip-gram(跳字模型)用中间词预测上下文,CBOW(continuous bag of words 连续词袋)用上下文预测中间词。
对于数学原理和具体思想想有更深刻理解的可以看一下《word2vec 中的数学原理详解》。皮果提先生的文章的推导清晰明白,逻辑严谨,在最后还提出了一些对于源码细节的思考。
(一)skipgram
(1)模型
由上图可看出,skipgram其实就是已知w(t)去求w(t-2)、w(t-1)、w(t+1)、w(t+2),就是求p(w(i-1)|w(i))…
下面画出这个求解过程:
先word2id把词w(i)映射成id;用onehot把词映射成1V的向量,和VD的中心词的词向量矩阵W(每一行是一个词的词向量)相乘,得到1*D的词向量,和周围词词向量W’相乘(W转置),并经过softmax得到1*V的概率矩阵。再反向传播更新W、W’,就得到了我们最后需要的词向量。
最后词向量有两种选取方法:
1、一般来说,W训练的比较好就是我们需要的词向量。
2、也可以
(
W
+
W
′
)
2
\frac{(W+W')}{2}
2(W+W′)得到需要的词向量。
即
p
(
w
i
∣
w
i
−
1
)
=
e
x
p
(
u
w
i
−
1
T
v
w
i
)
Σ
W
=
1
V
e
x
p
(
u
w
i
T
v
w
i
)
p(w_i|w_{i-1})=\frac{exp(u^T_{w_{i-1}}v_{w_i})}{Σ^V_{W=1}exp(u^T_{w_{i}}v_{w_i})}
p(wi∣wi−1)=ΣW=1Vexp(uwiTvwi)exp(uwi−1Tvwi)
此处
u
T
u^T
uT代表周围词向量的转置,v代表中心词向量,下标是对应的词。
(2)损失函数
J
(
θ
)
=
−
1
T
∑
i
=
1
T
∑
−
m
<
j
<
m
,
j
≠
0
l
o
g
p
(
w
t
+
j
∣
w
t
)
J(θ)=-\frac{1}{T}\sum_{i=1}^T\sum_{-m<j<m,j≠0}logp(w_{t+j}|w_t)
J(θ)=−T1i=1∑T−m<j<m,j=0∑logp(wt+j∣wt)
求概率最大即是求代价最小值。[-m,m]就是窗口大小。
(二)CBOW
(1)模型
这里因为输入是周围词,所以W是周围词向量矩阵,W’是中心词向量矩阵。4个周围词向量在和中心词矩阵相乘之前会做一个加和,或者加和平均。其他的如果你看懂了skipgram其实都是一样的操作。
(2)损失函数
J ( θ ) = − 1 T ∑ i = 1 T ∑ l o g p ( c ∣ o ) = − 1 T ∑ i = 1 T e x p ( u 0 T v c ) ∑ j = 1 V e x p ( u 0 T v j ) ) J(θ)=-\frac{1}{T}\sum_{i=1}^T\sum logp(c|o) =-\frac{1}{T}\sum_{i=1}^T\frac{exp(u_0^Tv_c)}{\sum^V_{j=1}exp(u_0^Tv_j))} J(θ)=−T1i=1∑T∑logp(c∣o)=−T1i=1∑T∑j=1Vexp(u0Tvj))exp(u0Tvc)
e1,e2,e3,e4是上下文词,u0=sum(e1,e2,e3,e4), v c v_c vc、 v j v_j vj就是中心词向量。
(三)先来个总结
1.skipgram用中心词预测周围词,用1个中心词生成2*window_size个样本,使用中心词和中心词矩阵得到中心词词向量和所有周围词向量做累积经过softmax得到想要的周围词概率,通过优化使概率越大越好来训练中心词和周围词矩阵。
2.cbow用周围词预测中心词,生成1个样本,使用所有周围词和周围词矩阵,得到周围词词向量,求和或求平均,然后和所有中心词词向量累积,经过softmax得到想要的中心词的概率,通过优化使概率越大越好来训练中心词和周围词矩阵。
(五)关键加速技术
模型是比较简单的,最引起复杂度的地方在于u和v相乘,最后softmax得到1*V的概率向量,V过大时求解量大。这时候就提出了以下技术。
(1)层次softmax
这个技术主要是想通过降低softmax的复杂度来降低word2vec的复杂度:使用huffuman树结构把softmax换为sigmoid计算。
softmax转换为最后一层有V个节点的满二叉树(即除最后一层无任何子节点外,每一层上的所有结点都有两个子结点),每次二分类时做sigmoid计算,softmax的计算是V次,而每次sigmoid只需要
l
o
g
2
V
log_2V
log2V次。当然,每个节点需要计算(满二叉树的深度 - 1)次sigmoid。
更快的方法就是使用huffuman树 (带权路径最短二叉树)word2vec规定左子树编码1,右子树编码0且左子树权重大于右子树)。
下面我们看一下满二叉树和Huffuman树比较:
图里节点的数字是词出现的次数,我们把它作为权重。每次二分类做一次操作,所以满二叉树需要54次操作,而huffuman树由于把出现次数由多到少从根节点排序,只需要48次操作。
p
(
w
∣
w
I
)
=
∏
i
=
1
n
σ
(
[
[
n
(
w
,
j
+
1
)
=
c
h
(
n
(
w
,
j
)
)
]
]
∗
v
n
(
w
,
j
)
′
T
v
(
w
I
)
)
p(w|w_I)= \prod_{i=1}^n \sigma([[n(w,j+1)=ch(n(w,j))]]*v'^T_{n(w,j)}v(w_I))
p(w∣wI)=i=1∏nσ([[n(w,j+1)=ch(n(w,j))]]∗vn(w,j)′Tv(wI))
其中[[]]函数是对里面的判断,如果里面的值是True,返回1,如果是False,返回-1。这儿里面的句子是在判断n(w,j+1)(即词w在树上的第j+1个节点)是否是n(w,j)的右子树。其实就是判断是否j节点和j+1节点编码都是0,是0就是右子树。
在skipgram里中心词出现情况下某词出现概率就是之前路过节点概率的连乘,右节点概率
σ
(
θ
i
T
v
c
)
\sigma(θ_i^Tv_c)
σ(θiTvc),左节点概率为(1-右节点概率)。在CBOW里θ则是窗口上下文的平均值或者和。
此时词向量少于V个,树深度约
O
(
l
o
g
2
V
)
O(log_2V)
O(log2V),θ相当于上下文词向量约
l
o
g
V
logV
logV个。
当然,这样也导致了最后词向量少于V个,所以得到最后词向量后不再能求
(
W
+
W
′
)
2
\frac{(W+W')}{2}
2(W+W′)了,在CBOW里只有一组完整周围词向量可用,skipgram只有一组完整的中心词向量。
(2)负采样
负采样在效率和效果上都比层次softmax好。
负采样认为复杂度主要就是由于多分类引起的,还是V类别(即词表大小)的多分类,所以舍弃多分类来降低复杂度。
它有个巧妙的方法:skipgram里中心词和周围词在一起就是正样本,而中心词和词表中随机选一个词在一起就是负样本。(由于词表很大,所以随机选中恰好周围词概率很小,可忽略)CBOW里则以周围词和随机采样在一起为负样本。
基本思想和二分类是一致的:增大正样本概率,减小负样本概率。负样本是随机生成的,为了鲁棒性,对每个词选取K=3到10个负样本。最后会输出1个正样本概率和K个负样本概率。因为K远小于V,所以速度大大提高,且实际效果也比层次softmax好。
损失函数如下:
J
n
e
g
−
s
a
m
p
l
e
(
θ
)
=
l
o
g
σ
(
u
0
T
v
c
)
+
∑
k
=
1
K
E
k
−
p
(
W
)
[
l
o
g
σ
(
−
u
k
T
v
c
)
]
J_{neg-sample}(θ)=log\sigma(u_0^Tv_c)+\sum_{k=1}^KE_{k -p(W)}[log\sigma(-u_k^Tv_c)]
Jneg−sample(θ)=logσ(u0Tvc)+k=1∑KEk−p(W)[logσ(−ukTvc)]
前面是正样本概率,后面就是K个负样本的概率。我们使(
u
0
T
v
c
u_0^Tv_c
u0Tvc)越大越好
,
(
−
u
k
T
v
c
)
,(-u_k^Tv_c)
,(−ukTvc)越小越好,当然loss是越大越好,如需梯度下降,则在公式前加负号。
因为这样得到的中心词、周围词向量都是完整的V*D大小的,所以参数比层次softmax多,但计算量要小。
那么如何采样呢?我们需要增大频率小的词的抽样概率,减小频率大的词的抽样概率。公式如下:
P
(
w
)
=
U
(
w
)
3
4
Z
P(w)=\frac{U(w)^\frac{3}{4}}{Z}
P(w)=ZU(w)43
U(w)是词w出现概率,Z是所有词开3/4次方后的加和。这样可以使加和概率仍为1,大家可以类比一下softmax的操作。
(3)重采样(subsampling of frequent words)
基于自然语言的共识:高频词往往携带信息少,而低频词往往携带信息多。
重采样原因:1、想更多训练重要词对;2、高频词很快就可以训练好,低频词需要更多轮数。
重采样方法:
P
(
w
i
)
=
1
−
t
f
(
w
i
)
P(w_i)=1-\sqrt{\frac{t}{f(w_i)}}
P(wi)=1−f(wi)t
论文里t选取是
1
0
−
5
10^{-5}
10−5,
f
(
w
i
)
{f(w_i)}
f(wi)是词
w
I
w_I
wI在数据集中的频率。这里的P表示重采样概率,即删除的概率。词频越大被删除概率越大,词频越小,删除概率越小,小于等于t的不会被删除。
优点:加速训练,可以得到更好的词向量。
至此,筑基丹只需小火慢烧,反复精炼,完成程序复现即可收炉了。