cs224n词向量表示word2vec
Word2vec
word2vec模型的核心是构建一个简单、可扩展的快速训练模型。利用语义理论来预测每个单词和它的上下文的词汇
两个算法:
Skip-grams (SG):预测上下文
Continuous Bag of Words (CBOW):预测目标单词
两种稍微高效一些的训练方法:
Hierarchical softmax
Negative sampling
但在这门课里,只会讲Naïve softmax。
Skip-gram prediction
已知当前词语,预测上下文。m为窗口半径为超参数,
w
t
w_t
wt表示第t个中心词
我们要最大化当前中心词的所有上下文词的概率,θ为模型参数
J
′
(
θ
)
=
∏
t
=
1
T
∏
−
m
≤
j
≤
m
 
j
≠
0
p
(
w
t
+
j
∣
w
t
;
θ
)
J'(\theta)=\prod_{t=1}^T\prod_{-m\leq j\leq m \:\\{j\neq0}}p(w_{t+j}|w_t;\theta)
J′(θ)=t=1∏T−m≤j≤mj̸=0∏p(wt+j∣wt;θ)
对数似然函数为:
J
(
θ
)
=
−
1
T
∑
t
=
1
T
∑
−
m
≤
j
≤
m
l
o
g
p
(
w
t
+
j
∣
w
t
)
J(\theta)=-\frac1T\sum_{t=1}^T\sum_{-m \leq j \leq m} logp(w_{t+j}|w_t)
J(θ)=−T1t=1∑T−m≤j≤m∑logp(wt+j∣wt)
在实际操作时,要对这个最原始的目标函数进行一下改造。乘法显然是不太好处理的,一个通用的trick是将乘法转成求和,利用log操作。处理最小化要比处理最大化更受欢迎,原始目标函数是进行最大化,取个负数就转成了最小化。因此,将原始目标函数进行对数似然的相反数操作即可得到较易处理的损失函数形式。对于目标函数里的p,用softmax函数得到。
softmax函数本质上是将一个向量转换成另一个向量,向量的shape不变,只是将向量中的各个值进行"规范化"处理,将一个任意值转成(0,1)之间的一个浮点数,在NN里这个值可近似认为是概率。softmax的计算函数如下:
p
(
o
∣
c
)
=
e
x
p
(
u
0
T
v
c
)
∑
w
=
1
v
e
x
p
(
u
w
T
v
c
)
p(o|c)=\frac{exp(u_0^Tv_c)}{\sum_{w=1}^vexp(u_w^Tv_c)}
p(o∣c)=∑w=1vexp(uwTvc)exp(u0Tvc)
这里涉及到的u和v分别对应词o(context词)的向量和词c(中心词)的向量,来自于两个矩阵U和V,二者均为这个模型的参数,是我们要通过损失函数反复迭代更新的。
Skipgram最左侧的
w
t
w_t
wt为中心词的one hot编码,然后他右边的矩阵为每个中心词的数值向量表示,将
w
t
与
W
相
乘
w_t与W相乘
wt与W相乘可以提取到中心词t的数值向量,然后右边我们有向量用于储存上下文词汇的表示,我们把提取出的向量与矩阵相乘,我们得到了这些内积,然后通过softmax就能产生概率分布。
gradient
我们可以用gradient来最小化负对数似然函数
∂
∂
v
c
l
o
g
e
x
p
(
u
0
T
v
c
)
∑
w
=
1
V
e
x
p
(
u
w
T
v
c
)
=
∂
∂
v
c
l
o
g
e
x
p
(
u
0
T
v
c
)
−
l
o
g
∑
w
=
1
V
e
x
p
(
u
w
T
v
c
)
\frac{\partial}{\partial v_c}log\frac{exp(u_0^Tv_c)}{\sum_{w=1}^V exp(u_w^Tv_c)} \\=\frac{\partial}{\partial v_c}log{exp(u_0^Tv_c)}-log\sum_{w=1}^Vexp(u_w^Tv_c)
∂vc∂log∑w=1Vexp(uwTvc)exp(u0Tvc)=∂vc∂logexp(u0Tvc)−logw=1∑Vexp(uwTvc)
对于前半部分求偏导
=
u
0
=u_0
=u0
对于后半部分求偏导chain rule
∂
∂
v
c
l
o
g
∑
w
=
1
V
e
x
p
(
u
w
T
v
c
)
=
1
∑
w
=
1
V
e
x
p
(
u
w
T
v
c
)
∗
∂
∂
v
c
∑
x
=
1
V
e
x
p
(
u
x
T
v
c
)
=
1
∑
w
=
1
V
e
x
p
(
u
w
T
v
c
)
∗
∑
x
=
1
V
e
x
p
(
u
x
T
v
c
)
∗
u
x
\frac{\partial}{\partial v_c}log\sum_{w=1}^Vexp(u_w^Tv_c) \\=\frac{1}{\sum_{w=1}^Vexp(u_w^Tv_c)}*\frac{\partial}{\partial v_c}\sum_{x=1}^Vexp(u_x^Tv_c) \\=\frac{1}{\sum_{w=1}^Vexp(u_w^Tv_c)}*\sum_{x=1}^Vexp(u_x^Tv_c)*u_x
∂vc∂logw=1∑Vexp(uwTvc)=∑w=1Vexp(uwTvc)1∗∂vc∂x=1∑Vexp(uxTvc)=∑w=1Vexp(uwTvc)1∗x=1∑Vexp(uxTvc)∗ux
可以得到对数似然函数的偏导为:
u
0
−
∑
x
=
1
V
e
x
p
(
u
x
T
v
c
)
∗
u
x
∑
w
=
1
V
e
x
p
(
u
w
T
v
c
)
=
u
0
−
∑
x
=
1
V
p
(
x
∣
c
)
u
x
u_0-\frac{\sum_{x=1}^Vexp(u_x^Tv_c)*u_x}{\sum_{w=1}^Vexp(u_w^Tv_c)} \\=u_0-\sum_{x=1}^Vp(x|c)u_x
u0−∑w=1Vexp(uwTvc)∑x=1Vexp(uxTvc)∗ux=u0−x=1∑Vp(x∣c)ux
u0为实际输出的上下文词汇,后面的部分为对于每一个词的期望。接下来我们要做的就是调整参数使其最小化