高级词向量表示
回顾:
skip-gram
P
(
o
∣
c
)
=
e
x
p
(
u
o
T
v
c
)
∑
w
=
1
V
e
x
p
(
u
w
T
v
c
)
P(o|c)=\frac{exp(u_o^Tv_c)}{\sum^V_{w=1}exp(u_w^Tv_c)}
P(o∣c)=∑w=1Vexp(uwTvc)exp(uoTvc)
例子:I like deep learning and NLP.
window 1: I like deep leaning and
P
(
I
∣
d
e
e
p
)
=
e
x
p
(
u
I
T
v
d
e
e
p
)
∑
w
=
1
V
e
x
p
(
u
w
T
v
d
e
e
p
)
P(I|deep)=\frac{exp(u_I^Tv_{deep})}{\sum^V_{w=1}exp(u_w^Tv_{deep})}
P(I∣deep)=∑w=1Vexp(uwTvdeep)exp(uITvdeep)
P
(
l
i
k
e
∣
d
e
e
p
)
=
e
x
p
(
u
l
i
k
e
T
v
d
e
e
p
)
∑
w
=
1
V
e
x
p
(
u
w
T
v
d
e
e
p
)
P(like|deep)=\frac{exp(u_{like}^Tv_{deep})}{\sum^V_{w=1}exp(u_w^Tv_{deep})}
P(like∣deep)=∑w=1Vexp(uwTvdeep)exp(ulikeTvdeep)
.
.
.
...
...
window 2: like deep leaning and NLP
P
(
l
i
k
e
∣
l
e
a
r
n
i
n
g
)
=
e
x
p
(
u
l
i
k
e
T
v
l
e
a
r
n
i
n
g
)
∑
w
=
1
V
e
x
p
(
u
w
T
v
l
e
a
r
n
i
n
g
)
P(like|learning)=\frac{exp(u_{like}^Tv_{learning})}{\sum^V_{w=1}exp(u_w^Tv_{learning})}
P(like∣learning)=∑w=1Vexp(uwTvlearning)exp(ulikeTvlearning)
P
(
d
e
e
p
∣
l
e
a
r
n
i
n
g
)
=
e
x
p
(
u
d
e
e
p
T
v
l
e
a
r
n
i
n
g
)
∑
w
=
1
V
e
x
p
(
u
w
T
v
l
e
a
r
n
i
n
g
)
P(deep|learning)=\frac{exp(u_{deep}^Tv_{learning})}{\sum^V_{w=1}exp(u_w^Tv_{learning})}
P(deep∣learning)=∑w=1Vexp(uwTvlearning)exp(udeepTvlearning)
.
.
.
...
...
问题:每个窗口都得遍历整个语料库,分母中的求和计算很庞大。但是语料库中的很多单词都不会和中心词同时出现。
Skip-gram模型
解决方法:
随机从语料库抽取单词,对从语料库抽取的随机单词进行重采样,而不是遍历所有的不同的单词,
目标函数:
J
(
θ
)
=
1
T
∑
t
=
1
T
J
t
(
θ
)
J(\theta)=\frac{1}{T}\sum^T_{t=1}J_t(\theta)
J(θ)=T1t=1∑TJt(θ)
T
:
T:
T:要遍历的所有窗口
J
(
θ
)
=
l
o
g
σ
(
u
o
T
v
c
)
+
∑
i
=
1
k
E
j
∼
P
(
w
)
[
l
o
g
σ
(
−
u
j
T
v
c
)
]
J_(\theta)=log\sigma(u_o^Tv_c)+\sum^k_{i=1}E_{j\sim{P(w)}}[log\sigma(-u_j^Tv_c)]
J(θ)=logσ(uoTvc)+i=1∑kEj∼P(w)[logσ(−ujTvc)]
l
o
g
σ
(
u
o
T
v
c
)
:
log\sigma(u_o^Tv_c):
logσ(uoTvc):中心词
c
c
c和外围词
o
o
o同时出现的概率的对数。
j
∼
P
(
w
)
:
j\sim{P(w)}:
j∼P(w):从语料库随机抽取单词。
[
l
o
g
σ
(
−
u
j
T
v
c
)
]
:
[log\sigma(-u_j^Tv_c)]:
[logσ(−ujTvc)]:减少随机抽取的单词
j
j
j和中心词
c
c
c同时出现的概率。
Word2vec
遍历语料库中的每个单词,观察窗口周围的词,预测周围的词,去抓取词的共同点,发现这个词和其他词共同出现的频率是多少,每出现一次计一次数,做一次梯度下降,当在语料库中再出现在一起时,再计数并进行梯度更新。
为什么不对整个语料库做一次计数?
Word2vec之前的方法:
1.潜在语义分析(Latent semantic analysis/LSA):
在每个单词周围使用了一个窗口,相当于遍历了整个语料库,不做任何梯度更新,首先对计数结果进行采集,一旦获得计数结果,就对矩阵进行操作,要抓取的不只是语义,还有每个词的句法信息,另一方面,观测共同出现的计数结果不仅在窗口周围,而是整个文档的。
*LSA的步骤如下:
- 分析文档集合,建立共现矩阵。
- 对矩阵进行奇异值分解(SVD)。
- 对SVD分解后的矩阵进行降维。
- 使用降维后的矩阵构建潜在语义空间。*
基于窗口的共现矩阵Example
语料库:
I like deep learning
I like NLP
I enjoy flying
缺点:
(1)当语料库增加新单词时,向量会变长,当下游的机器学习模型接受其作为输入时,会需要改变而且有一些参数的缺失。
(2)向量的维度会非常高,机器学习模型会存在稀疏性问题。
降维:奇异值分解(SVD)
CSDN博客上的奇异值分解详细讲解:
https://blog.csdn.net/shenziheng1/article/details/52916278
性能提升的处理
(1)对于the、he、has等词,即使出现的频率很高,蕴含的信息也很少,因此在共现矩阵中将出现的频率最大化为100.
(2)忽略几个最高出现的单词(词的长尾效应:不常出现的词包含很丰富的语义内容)。
(3)不平等的计算所有的词的出现次数:靠近中心词的词每出现一次记1,距离五个单词的记0.5.
模型对比
基于计数的模型:SVD和共现矩阵。
优点:训练很快;能够很好的利用数据(只需要收集一次统计信息)。
缺点:主要是捕获大多数词的相似性,没有word2vec模型抓取的其他模式;有些计数很大的单词往往得到不合适的重要性。
基于窗口/直接预测:Skip-gram模型。
缺点:缩放语料库的大小,要遍历每一个单一窗口,很低效,不能有效利用数据集的有效数据。
优点:在下游任务很多的情况下,能获得更好的性能;能抓取除相似性以外的很多复杂模式。
全局向量模型(Global Vectors)
组合上两种模型。
会遍历所有可能共现的词对,得到共现矩阵
P
P
P,对语料库的每一对词,最小化内积和计数对数之间的距离。
目标函数:
j
(
θ
)
=
1
2
∑
i
,
j
=
1
W
f
(
P
i
j
(
u
i
T
v
j
−
l
o
g
P
i
j
)
2
j(\theta)=\frac{1}{2}\sum^W_{i,j=1}f(P_{ij}(u^T_iv_j-logP_{ij})^2
j(θ)=21i,j=1∑Wf(Pij(uiTvj−logPij)2
skip-gram模型试图一次捕获共现的一个窗口,Glove模型试图捕捉总体的单词词频数据。
拓展:一词多义
能不能真正找出一个词的多个不同意义。
通过稀疏编码来对多义词进行语境解释。
模型:每个单词向量都是由一个被称为语境向量的少量选定数的总和组成的。
v
=
∑
i
=
0
D
α
i
A
i
+
η
v=\sum^D_{i=0}\alpha_iA_i+\eta
v=i=0∑DαiAi+η
v
:
v:
v:单词向量。
A
i
:
A_i:
Ai:语境向量。
η
:
\eta:
η:噪音。