22[NLP训练营]Word2Vec
Posted oldmao_2001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了22[NLP训练营]Word2Vec相关的知识,希望对你有一定的参考价值。
文章目录
公式输入请参考: 在线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)∑e以上是关于22[NLP训练营]Word2Vec的主要内容,如果未能解决你的问题,请参考以下文章
深度学习-nlp系列:Word2Vec 字&词向量的训练和使用
NLP实战 | 使用《人民的名义》的小说原文训练一个word2vec模型