文章目录
公式输入请参考: 在线Latex公式
之前在 深度带读里面有写过,再重新整理一下,不然缺22课。
https://github.com/dav/word2vec/blob/master/src/word2vec.c
学Word2Vec之前要明白为什么要学它,或者说这个算法发明出来的动机是啥。这里要知道原来的单词独热编码表征有什么缺点。之前有总结过,直接贴过来:
One-hot representation:对应的词所在的位置设为1,其他为0。
缺点:
·语义鸿沟问题(词与词之间无法表示关系)
·维度灾难、稀疏(向量大小和词典大小一样,但是只有一位上面有值)
·无法表示未出现的词汇(未知单词都是相同表示的)
分布式表示–词向量(word embedding):
·词表示为:[0.792,-0.177,-0.107,0.109,0.542.…]
·常见维度50或者100,就可以表示所有的单词。
·解决“语义鸿沟"问题
·可以通过计算向量之间的距离(欧式距离、余弦距离等)来体现词与词的相似性
二者还有一个重要的区别:
Global Generation vs Local Generation
One-hot representation属于Local Generation
Distributed representation属于Global Generation
前者从原始数据直接生成表示,类似下图
后者在生成表示前还有一个中间步骤(可以看做是share parameter),然后最后的表征是由多个中间步骤生成的
后者的泛化性要比前者强,理由如下,如果是One-hot representation,如果观测值(例如第一个圈圈)只出现1次,那么靠第一个圈圈预测隐含参数比较困难,当然,如果观测值(例如第二个圈圈)出现30次,那么预测隐含参数会相对比较简单。但是在Distributed representation情况下,观测值(例如第一个圈圈)只出现1次并不影响模型推测隐含参数,因为,和第一个圈圈相关的中间步骤还生成了其他观测值,如果其他观测值出现的次数足够多,当然也可以很好的推测出隐含参数,因此后者的泛化性能好。
Intuition of Word2Vec
Word2Vec算法是基于这么一个假设的,在一个句子中相邻词语倾向于拥有相似的词向量表征。
对于某个句子:
We are working on NLP project, it is interesting.
我们希望用中心词预测周围词(skip gram在实作上比CBOW要常见一些),那么模型训练的目标就是(考虑窗口大小为2,就是看当前词的前后共4个单词的范围):
m
a
x
i
m
i
z
e
{
p
(
a
r
e
∣
w
e
)
p
(
a
r
e
∣
w
o
r
k
i
n
g
∣
w
e
)
p
(
w
e
∣
a
r
e
)
p
(
w
o
r
k
i
n
g
∣
a
r
e
)
p
(
o
n
∣
a
r
e
)
p
(
w
e
∣
w
o
r
k
i
n
g
)
p
(
a
r
e
∣
w
o
r
k
i
n
g
)
p
(
o
n
∣
w
o
r
k
i
n
g
)
p
(
N
L
P
∣
w
o
r
k
i
n
g
)
⋯
}
maximize\{p(are|we)p(are|working |we)p(we|are)p(working |are)p(on|are)p(we|working)p(are|working)p(on|working)p(NLP|working)\cdots\}
maximize{p(are∣we)p(are∣working∣we)p(we∣are)p(working∣are)p(on∣are)p(we∣working)p(are∣working)p(on∣working)p(NLP∣working)⋯}
然后抽象为数学表达,用
c
c
c表示上下文词,用
w
w
w表示当前词,Text表示为当前句子单词的集合,Context(w)表示为当前词上下文集合,
θ
\theta
θ为模型参数,那么模型就是要使得这些概率最大化:
a
r
g
max
θ
∏
w
∈
T
e
x
t
∏
c
∈
C
o
n
t
e
x
t
(
w
)
p
(
c
∣
w
;
θ
)
arg\underset{\theta}{\max}\prod_{w\in Text}\prod_{c\in Context(w)}p(c|w;\theta)
argθmaxw∈Text∏c∈Context(w)∏p(c∣w;θ)
求极大值,因此取log不改变极大性质,但连乘变成连加:
a
r
g
max
θ
∑
w
∈
T
e
x
t
∑
c
∈
C
o
n
t
e
x
t
(
w
)
log
p
(
c
∣
w
;
θ
)
(1)
arg\underset{\theta}{\max}\sum_{w\in Text}\sum_{c\in Context(w)}\log p(c|w;\theta)\tag1
argθmaxw∈Text∑c∈Context(w)∑logp(c∣w;θ)(1)
参数θ
上式中参数
θ
\theta
θ实际上就是模型要学习的词向量,在不同的文章里面貌似这个玩意还有点点不一样,这里的形式是:
θ
=
[
u
,
v
]
\theta=[u,v]
θ=[u,v]
u
,
v
u,v
u,v是大小一模一样的矩阵,其大小是
V
×
k
V\times k
V×k,V是词库大小,k是词向量大小,一般是50或者100。
u
,
v
u,v
u,v都是单词的词向量,这里分别设置
u
,
v
u,v
u,v原因在于在公式1中,每个单词有两种角色,一种是中心词,一种是上下文,因此学习出来的结果也有两种,也有研究人员把这两个矩阵concat起来用,貌似效果也不错。这里最后取v作为最终的词向量表征。
目标函数的形式
虽然公式1是我们训练的目标,但是里面的概率还没有具体的形式,我们希望这个最终的数学表达可以使得中心词和上下文词出现的概率p最大,因此考虑的表达为:
e
u
c
⋅
v
w
e^{u_c\cdot v_w}
euc⋅vw
u
c
⋅
v
w
u_c\cdot v_w
uc⋅vw是两个向量的内积,也就是相似度,二者越像,就会越大,但是这个玩意的值域不在概率p的[0,1]之间,因此这里借鉴了softmax的思想,除以一个归一化项:
p
(
c
∣
w
;
θ
)
=
e
u
c
⋅
v
w
∑
c
′
e
u
c
′
⋅
v
w
p(c|w;\theta)=\cfrac{e^{u_c\cdot v_w}}{\sum_{c'}e^{u_{c'}\cdot v_w}}
p(c∣w;θ)=∑c′euc′⋅vweuc⋅vw
这里
c
′
c'
c′表示词库中所有的词。
那么目标函数可以写为:
a
r
g
max
θ
∑
w
∈
T
e
x
t
∑
c
∈
C
o
n
t
e
x
t
(
w
)
log
e
u
c
⋅
v
w
∑
c
′
e
u
c
′
⋅
v
w
=
a
r
g
max
θ
∑
w
∈
T
e
x
t
∑
c
∈
C
o
n
t
e
x
t
(
w
)
e
u
c
⋅
v
w
−
log
∑
c
′
e
u
c
′
⋅
v
w
(2)
arg\underset{\theta}{\max}\sum_{w\in Text}\sum_{c\in Context(w)}\log \cfrac{e^{u_c\cdot v_w}}{\sum_{c'}e^{u_{c'}\cdot v_w}}\\ =arg\underset{\theta}{\max}\sum_{w\in Text}\sum_{c\in Context(w)}e^{u_c\cdot v_w}-\log\sum_{c'}e^{u_{c'}\cdot v_w}\tag2
argθmaxw∈Text∑c∈Context(w)∑log∑c′euc′⋅vweuc⋅vw=argθmaxw∈Text∑c∈Context(w)∑euc⋅vw−logc′∑euc′⋅vw(2)
公式2中的
∑
c
′
e
u
c
′
⋅
v
w
\sum_{c'}e^{u_{c'}\cdot v_w}
∑c′euc′⋅vw涉及到了词库中所有的单词,因此其时间复杂度为:
O
(
∣
V
∣
)
O(|V|)
O(∣V∣)
Another Formulation
在优化公式2(正常操作是要对公式2用梯度下降求解参数
θ
\theta
θ的,但是复杂度太高,需要优化)之前,我们先把公式1换一种形式来理解。
假设我们有一句话:
S
=
w
1
w
2
w
3
w
4
w
5
w
6
S=w_1w_2w_3w_4w_5w_6
S=w1w2w3w4w5w6
如果以
w
3
w_3
w3为中心词,窗口大小考虑2的情况下,模型需要最大化以下概率:
p
(
w
1
∣
w
3
)
p
(
w
2
∣
w
3
)
p
(
w
4
∣
w
3
)
p
(
w
5
∣
w
3
)
p(w_1|w_3)\\ p(w_2|w_3)\\ p(w_4|w_3)\\ p(w_5|w_3)
p(w1∣w3)p(w2∣w3)p(w4∣w3)p(w5∣w3)
上面的表达可以换一种方式来写:
p
(
D
=
1
∣
w
1
,
w
3
)
p
(
D
=
1
∣
w
2
,
w
3
)
p
(
D
=
1
∣
w
4
,
w
3
)
p
(
D
=
1
∣
w
5
,
w
3
)
p(D=1|w_1,w_3)\\ p(D=1|w_2,w_3)\\ p(D=1|w_4,w_3)\\ p(D=1|w_5,w_3)
p(D=1∣w1,w3)p(D=1∣w2,w3)p(D=1∣w4,w3)p(D=1∣w5,w3)
可以看到到,当两个单词存在上下文关系,则可以用上面的方式来写,如果不存在则可以写为:
p
(
D
=
0
∣
w
5
,
w
1
)
p(D=0|w_5,w_1)
p(D=0∣w5,w1)
抽象为数学表达为:
w
i
,
w
j
二
者
有
上
下
文
关
系
:
p
(
D
=
1
∣
w
i
;
w
j
;
θ
)
w
i
,
w
j
二
者
没
有
上
下
文
关
系
:
p
(
D
=
0
∣
w
i
;
w
j
;
θ
)
w_i,w_j二者有上下文关系:p(D=1|w_i;w_j;\theta)\\ w_i,w_j二者没有上下文关系:p(D=0|w_i;w_j;\theta)
wi,wj二者有上下文关系:p(D=1∣wi;wj;θ)wi,wj二者没有上下文关系:p(D=0∣wi;wj;θ)
当
w
i
,
w
j
w_i,w_j
wi,wj二者有上下文关系,我们希望
p
(
D
=
1
∣
w
i
;
w
j
;
θ
)
p(D=1|w_i;w_j;\theta)
p(D=1∣wi;wj;θ)越大越好,同理,当
w
i
,
w
j
w_i,w_j
wi,wj二者没有上下文关系,我们希望
p
(
D
=
0
∣
w
i
;
w
j
;
θ
)
p(D=0|w_i;w_j;\theta)
p(D=0∣wi;wj;θ)越大越好。
同样的思路,我们把概率用具体的数学公式表达出来,使其满足上面的描述,借鉴逻辑回归的公式可以写为:
p
(
D
=
1
∣
w
i
;
w
j
;
θ
)
=
1
1
+
exp
−
u
w
i
⋅
v
w
j
p(D=1|w_i;w_j;\theta)=\cfrac{1}{1+\exp^{-u_{w_i}\cdot v_{w_j}}}
p(D=1∣wi;wj;θ)=1+exp−uwi⋅vwj1
有了这个就可以来推负采样了。
Negative Sampling
把新的目标函数写出来:
a
r
g
max
θ
∏
(
w
,
c
)
∈
D
p
(
D
=
1
∣
w
;
c
;
θ
)
∏
(
w
,
c
)
∉
D
p
(
D
=
0
∣
w
;
c
;
θ
)
(3)
arg\underset{\theta}{\max}\prod_{(w,c)\in D}p(D=1|w;c;\theta)\prod_{(w,c)\notin D}p(D=0|w;c;\theta)\tag3
argθmax(w,c)∈D∏p(D=1∣w;c;θ)(w,c)∈/D∏p(D=0∣w;c;θ)(3)
这里
(
w
,
c
)
∈
D
(w,c)\in D
(w,c)∈D表示中心词和上下文词组成单词对的集合
(
w
,
c
)
∉
D
(w,c)\notin D
(w,c)∈/D表示中心词和非上下文词组成单词对的集合,也就是负样本
假如一句话长成这样:ABCD
那么
(
w
,
c
)
∈
D
=
{
A
B
,
B
C
,
C
D
,
B
A
,
C
B
,
D
C
}
(w,c)\in D=\{AB,BC,CD,BA,CB,DC\}
(w,c)∈D={AB,BC,CD,BA,CB,DC}
(
w
,
c
)
∉
D
=
{
A
C
,
C
A
,
A
D
,
D
A
,
B
D
,
D
B
}
(w,c)\notin D=\{AC,CA,AD,DA,BD,DB\}
(w,c)∈/D={AC,CA,AD,DA,BD,DB}
然后把概率的数学表达带入公式3:
a
r
g
max
θ
∏
(
w
,
c
)
∈
D
1
1
+
exp
−
u
c
⋅
v
w
∏
(
w
,
c
)
∉
D
[
1
−
1
1
+
exp
−
u
c
⋅
v
w
]
(4)
arg\underset{\theta}{\max}\prod_{(w,c)\in D}\cfrac{1}{1+\exp^{-u_{c}\cdot v_{w}}}\prod_{(w,c)\notin D}\left[1-\cfrac{1}{1+\exp^{-u_{c}\cdot v_{w}}}\right]\tag4
argθmax(w,c)∈D∏1+exp−uc⋅vw1(w,c)∈/D∏[1−1+exp−uc⋅vw1](4)
常规套路,log变连加:
a
r
g
max
θ
∑
(
w
,
c
)
∈
D
log
1
1
+
exp
−
u
c
⋅
v
w
+
∑
(
w
,
c
)
∉
D
log
[
1
−
1
1
+
exp
−
u
c
⋅
v
w
]
(5)
arg\underset{\theta}{\max}\sum_{(w,c)\in D}\log\cfrac{1}{1+\exp^{-u_{c}\cdot v_{w}}}+\sum_{(w,c)\notin D}\log\left[1-\cfrac{1}{1+\exp^{-u_{c}\cdot v_{w}}}\right]\tag5
argθmax(w,c)∈D∑log1+exp−uc⋅vw1+(w,c)∈/D∑log[1−1+exp−uc⋅vw1](5)
再根据
σ
\sigma
σ函数的定义,公式5可以写为:
a
r
g
max
θ
∑
(
w
,
c
)
∈
D
log
σ
(
u
c
⋅
v
w
)
+
∑
(
w
,
c
)
∉
D
log
σ
(
−
u
c
⋅
v
w
)
(6)
arg\underset{\theta}{\max}\sum_{(w,c)\in D}\log\sigma(u_{c}\cdot v_{w})+\sum_{(w,c)\notin D}\log\sigma(-u_{c}\cdot v_{w})\tag6
argθmax(w,c)∈D∑logσ(uc⋅vw)+(w,c)∈/D∑logσ(−uc⋅vw)(6)
可以看到负样本是很多的,如果一个词库大小是
1
0
5
10^5
105,那么负样本对估计会有
1
0
6
10^6
106对。现在来看如何降低负样本这块的计算复杂度。
SG的负采样
这里只看sg,cbow先不管。
考虑负采样后的目标函数近似于(这里和公式6是约等于的关系)
a
r
g
max
θ
∑
(
w
,
c
)
∈
D
[
log
σ
(
u
c
⋅
v
w
)
+
∑
c
′
∈
N
(
w
)
log
σ
(
−
u
c
′
⋅
v
w
)
]
(7)
arg\underset{\theta}{\max}\sum_{(w,c)\in D}\left[\log\sigma(u_{c}\cdot v_{w})+\sum_{c'\in N(w)}\log\sigma(-u_{c'}\cdot v_{w})\right]\tag7
argθmax(w,c)∈D∑⎣⎡logσ(uc⋅vw)+c′∈N(w)∑logσ(−uc′⋅vw)⎦⎤(7)
c
′
c'
c′是中心词为
w
w
w的负样本集合中采样出来的若干个负样本(5个或者10个)
负采样的梯度下降
把公式7中中括号的内容看做是函数:
l
(
θ
)
=
log
σ
(
u
c
⋅
v
w
)
+
∑
c
′
∈
N
(
w
)
log
σ
(
−
u
c
′
⋅
v
w
)
l(\theta)=\log\sigma(u_{c}\cdot v_{w})+\sum_{c'\in N(w)}\log\sigma(-u_{c'}\cdot v_{w})
l(θ)=logσ(uc⋅vw)+c′∈N(w)∑logσ(−uc′⋅vw)
先求偏导:
∂
l
(
θ
)
∂
u
c
=
σ
(
u
c
⋅
v
w
)
[
1
−
σ
(
u
c
⋅
v
w
)
]
σ
(
u
c
⋅
v
w
)
v
w
=
[
1
−
σ
(
u
c
⋅
v
w
)
]
v
w
\cfrac{\partial l(\theta)}{\partial u_c}=\cfrac{\sigma(u_{c}\cdot v_{w})[1-\sigma(u_{c}\cdot v_{w})]}{\sigma(u_{c}\cdot v_{w})}v_w\\=[1-\sigma(u_{c}\cdot v_{w})]v_w
∂uc∂l(θ)=σ(uc⋅vw)σ(uc⋅vw)[1−σ(uc⋅vw)]vw=[1−σ(uc⋅vw)]vw
∂
l
(
θ
)
∂
u
c
′
=
σ
(
−
u
c
′
⋅
v
w
)
[
1
−
σ
(
−
u
c
′
⋅
v
w
)
]
σ
(
−
u
c
′
⋅
v
w
)
(
−
v
w
)
=
[
σ
(
−
u
c
′
⋅
v
w
)
−
1
]
v
w
\cfrac{\partial l(\theta)}{\partial u_{c'}}=\cfrac{\sigma(-u_{c'}\cdot v_{w})[1-\sigma(-u_{c'}\cdot v_{w})]}{\sigma(-u_{c'}\cdot v_{w})}(-v_w)\\=[\sigma(-u_{c'}\cdot v_{w})-1]v_w
∂uc′∂l(θ)=σ(−uc′⋅vw)σ(−uc′⋅vw)[1−σ(−uc′⋅vw)](−vw)=[σ(−uc′⋅vw)−1]vw
∂
l
(
θ
)
∂
v
w
=
σ
(
u
c
⋅
v
w
)
[
1
−
σ
(
u
c
⋅
v
w
)
]
σ
(
u
c
⋅
v
w
)
u
c
+
∑
c
′
∈
N
(
w
)
σ
(
−
u
c
′
⋅
v
w
)
[
1
−
σ
(
−
u
c
′
⋅
v
w
)
]
σ
(
−
u
c
′
⋅
v
w
)
(
−
u
c
′
)
=
[
1
−
σ
(
u
c
⋅
v
w
)
]
u
c
+
∑
c
′
∈
N
(
w
)
[
σ
(
−
u
c
′
⋅
v
w
)
−
1
]
u
c
′
\cfrac{\partial l(\theta)}{\partial v_w}=\cfrac{\sigma(u_{c}\cdot v_{w})[1-\sigma(u_{c}\cdot v_{w})]}{\sigma(u_{c}\cdot v_{w})}u_c+\sum_{c'\in N(w)}\cfrac{\sigma(-u_{c'}\cdot v_{w})[1-\sigma(-u_{c'}\cdot v_{w})]}{\sigma(-u_{c'}\cdot v_{w})}(-u_{c'})\\ =[1-\sigma(u_{c}\cdot v_{w})]u_c+\sum_{c'\in N(w)}[\sigma(-u_{c'}\cdot v_{w})-1]u_{c'}
∂vw∂l(θ)=σ(uc⋅vw)σ(uc⋅vw)[1−σ(uc⋅vw)]uc+c′∈N(w)∑σ(−uc′⋅vw)σ(−uc′⋅vw)[1−σ(−uc′⋅vw)](−uc′)=[1−σ(uc⋅vw)]uc+c′∈N(w)∑[σ(−uc′⋅vw)−1]uc′
然后更新梯度,由于上面求的是极大值,因此更新梯度是用加,就是梯度上升。
u
c
←
u
c
+
η
∂
l
(
θ
)
∂
u
c
u
c
′
←
u
c
′
+
η
∂
l
(
θ
)
∂
u
c
′
v
w
←
v
w
+
η
∂
l
(
θ
)
∂
v
w
u_c\leftarrow u_c+\eta\cfrac{\partial l(\theta)}{\partial u_c}\\ u_{c'}\leftarrow u_{c'}+\eta\cfrac{\partial l(\theta)}{\partial u_{c'}}\\ v_w\leftarrow v_w+\eta\cfrac{\partial l(\theta)}{\partial v_w}
uc←uc+η∂uc∂l(θ)uc′←uc′+η∂uc′∂l(θ)vw←vw+η∂vw∂l(θ)
为了采样更加高效,原文用了类似哈夫曼树的数据结构。
SG的缺点
skip-gram模型的缺点如下:
1.不考虑上下文,一个词只有一个词向量,那么对于一词多义的情况无法处理(使用contex-aware word embedding,类似ELMO)
2.考虑的窗口大小不会太长(使用RNN/LSTM),无法考虑词向量的全局特征(使用matrix factorization)
3.无法有效学习到低频词或未登记词的词向量(使用subword embedding)
4.可解释性不强,每个维度对应的特征不确定
下面讲两个解决方法:subword和ELMO
Learning with Subword
这个方法主要用来解决低频词或未登记词的模型。当SG遇到低频词或未登记词的时候,可以直接忽略,或者用Subword。
思想是这样的:
假如词库中没有reading这个单词,但是有
reader
going
swimming
talking
等单词
那么reading可以拆分为read+ing的组合,如果read和ing有分别学习过,那么就可以猜出reading的embedding。
下面大概看一个例子:
假如词库中有三个单词:
reader
going
studying
我们先把单词拆分为subword,拆分标准为character n-gram,这里n=4,那么结果为:
reader=[^rea,read,eade,ader,der$]
going=[^goi,goin,oing,ing$]
studying=[^stu,stud,tudy,udyi,dyin,ying,ing$]
拆分之后结果我们可以依然用SG来进行训练,得到每一个subword的向量表示,然后整个单词的表示则用subword进行concat后得到。
Subword小结
- 使用场景:Subword主要是用在单词组成由明显的词根构成的语言上,中文就不怎么适合
- character n-gram感觉分词结果乱,很杂,这个时候可以根据出现频率进行适当的过滤,就会保留常用的词根组合
- 对于没有出现过的character n-gram,可以直接忽略,例如要预测reading的词向量的时候,reading=[^rea,read,eadi,adin,ding,ing$],如果eadi没有出现过,那么可以直接忽略
- 窗口大小一般是3-6,太短分得太细太多,太长无法体现subword的特点。
ELMO简介
这个很多地方都有写,这里不赘述,这个模型两个特点:
1.基于语言模型
2.是一个深度学习模型