Lecture 2: Word Vectors and Word Senses
1 Main Idea of Word2Vec :
- 遍历语料库(corpus)中的每一个单词
- 通过词向量预测周围的单词
如以下单词序列,使用center单词’into’来预测它周围的单词出现的概率
p ( o ∣ c ) = e x p ( u o T v c ) ∑ w ∈ V e x p ( u w T v c ) p(o|c) = \frac{exp(u_o^Tv_c)}{\sum_{w\in V}exp(u_w^Tv_c)} p(o∣c)=∑w∈Vexp(uwTvc)exp(uoTvc)
2 梯度下降(Gradient Descent):
梯度更新公式(矩阵形式)
θ
n
e
w
=
θ
o
l
d
e
−
α
∇
θ
J
(
θ
)
\theta^{new} = \theta^{olde}-\alpha\nabla_{\theta}J(\theta)
θnew=θolde−α∇θJ(θ)
其中 α \alpha α是学习率(learning rate)。
梯度更新公式(对于
θ
\theta
θ的某一个参数
θ
j
\theta_j
θj的形式)
θ
j
n
e
w
=
θ
j
o
l
d
−
α
∂
∂
θ
j
o
l
d
J
(
θ
)
\theta_{j}^{new} = \theta_{j}^{old}-\alpha\frac{\partial}{\partial\theta_j^{old}}J(\theta)
θjnew=θjold−α∂θjold∂J(θ)
3 随机梯度下降(Stochastic Gradient Descent)
问题: J ( θ ) J(\theta) J(θ)是针对整个语料库(corpus)所有windows的函数,计算它的梯度 ∇ θ J ( θ ) \nabla_\theta J(\theta) ∇θJ(θ)计算量非常大。
解决方案:随机梯度下降,即在所有windows中采样一部分作为一批次(mini-batch),然后在这些采样上计算梯度,在统计学上相当于对 J ( θ ) J(\theta) J(θ)的估计(estimation)。这样大大减少了计算量。
但是随机梯度下降带来了另外一个问题,就是因为每次采样都是一部分的windows,所涵盖的词有限( 2 m + 1 2m+1 2m+1),这样我们求得的梯度 ∇ θ J t ( θ ) \nabla_{\theta}J_t(\theta) ∇θJt(θ)实际上非常稀疏(sparse),因为大量的单词没有覆盖到,所以我们的办法就是只更新这个batch中所包含的词。
4 Word2Vec: More Details
4.1 原论文提出了两个模型
- Skip-Gram(SG):以context中心的单词预测剩余的单词
- Continuous Bag of Words(CBoW):以中心周围的单词,预测位于中心的单词
4.2 负采样(Negative Sampling)
关于训练时,一个非常消耗计算资源的问题就是softmax的计算
p
(
o
∣
c
)
=
e
x
p
(
u
o
T
v
c
)
∑
w
∈
V
e
x
p
(
u
w
T
v
c
)
p(o|c) = \frac{exp(u_o^Tv_c)}{\sum_{w\in V}exp(u_w^Tv_c)}
p(o∣c)=∑w∈Vexp(uwTvc)exp(uoTvc)
可以看出分母要计算词汇表(vacabulary)里所有单词与目标单词的点积,然后计算其自然指数的和,所以原论文提出了Negative Sampling的技巧来解决这个问题。
目标最大化每次采样的似然:
M
a
x
i
m
i
z
e
:
J
(
θ
)
=
1
T
∑
t
=
1
T
J
t
(
θ
)
Maximize:\quad J(\theta) = \frac{1}{T}\sum_{t=1}^{T}J_t(\theta)
Maximize:J(θ)=T1t=1∑TJt(θ)
其中,
J
t
(
θ
)
=
log
σ
(
u
o
T
v
c
)
+
∑
j
=
1
K
E
j
∽
p
(
w
)
[
log
σ
(
−
u
j
T
v
c
)
]
J_t(\theta) = \log\sigma(u_o^Tv_c)+\sum_{j=1}^{K}\mathbb{E}_{j\backsim p(w)}[\log\sigma(-u_j^Tv_c)]
Jt(θ)=logσ(uoTvc)+j=1∑KEj∽p(w)[logσ(−ujTvc)]
K
K
K代表负样本数目,
σ
(
x
)
=
1
1
+
e
−
x
\sigma (x)=\frac{1}{1+e^{-x}}
σ(x)=1+e−x1是sigmoid函数,sigmoid函数相当于binary case of softmax,实际上表示的也是概率。
损失函数定义为:
J
n
e
g
−
s
a
m
p
l
e
(
o
,
v
c
,
U
)
=
−
log
σ
(
u
o
T
v
c
)
−
∑
j
=
1
K
[
log
σ
(
−
u
j
T
v
c
)
]
J_{neg-sample}(o,v_c,U) = -\log\sigma(u_o^Tv_c)- \sum_{j=1}^{K}[\log\sigma(-u_j^Tv_c)]
Jneg−sample(o,vc,U)=−logσ(uoTvc)−j=1∑K[logσ(−ujTvc)]
负采样目的就是避免计算
c
c
c与整个单词表的点积,所以作者的做法是从词汇表中抽出一部分共现概率低的单词作为负样本,然后将损失函数定义成上式,这样优化的过程中,会使
o
o
o与
c
c
c的共现(co-occurrence)概率变大,而
K
K
K个负样本与单词
c
c
c的共现(co-occurrence)概率变低。
5 Why not capture co-occurrence counts directly?
传统的方法,使用共现矩阵(co-occurrence)的方法有两个选择,windows vs. full document
问题:
随着词汇表的增大,矩阵大小变大;很高的维度,从而需要很多存储;给后续的分类模型带来稀疏问题
解决方法:
使用更小维度的稠密矩阵只存储重要的信息(降维,例如SVD)
6 如何评估词向量?
1. Intrinsic(内在的)
Word Vector Analogies(Linear Algebraic Structure)
2. Extrinsic(外在的)
通过一些后续的任务评价词向量