程序地带

知识图谱问答系统补课——NPL


origin from :datawhale team


Word2Vec

Word vectors


我们将为每个单词构建一个稠密的向量,使得它能够与相似文本里的词向量相近,word meaning 作为一种神经词向量,在我们对向量空间进行可视化:


image-20200607182724659


注:word vector 有时也叫做 word embedding 或者 word representations,他们都是一种表示结构。


Word2vec:Overview


Word2vec(Mikolov et al. 2013) 是一种学习词向量的框架,包含大量的文本语料,固定词表中的每一个单词由一个词向量表示,文本中的每个单词位置 t,有一个中心词c,和它的上下文 o(除了 c 的外部单词)。


通过 c 和 o 的词向量相似性来计算 P(o/c),不断的调整词向量,最大化概率,固定窗口,滑动窗口并计算:


image-20200607183723883 image-20200607183758625


Word2vec的目标函数:


对于每个位置 t = 1,…,T,固定窗口大小m,给定中心词wj:
l
i
k
e
l
i
h
o
o
d
=
L
(
θ
)
=

t
=
1
T


m

j

m
    
j

0
p
(
w
t
+
j

w
t
;
θ
)
likelihood=L( heta)=prod_{t=1}^{T}prod_{-m le j le m\ j e0}^{}p(w_{t+j}|w_t; heta)
likelihood=L(θ)=t=1∏T​−m≤j≤m    j​=0∏​p(wt+j​∣wt​;θ) 注:
θ
heta
θ 是需要优化的参数



J

θ

=

1
T
l
o
g
L
(
θ
)
=

1
T

t
=
1
T


m

j

m
    
j

0
l
o
g
P
(
w
t
+
j

w
t
;
θ
)
J( heta)=-frac 1TlogL( heta)=-frac1Tsum_{t=1}^Tsum_{-mle jle m \ j e 0}logP(w_{t+j}|w_t; heta)
J(θ)=−T1​logL(θ)=−T1​t=1∑T​−m≤j≤m    j​=0∑​logP(wt+j​∣wt​;θ) ) 注:



J
(
θ
)
J( heta)
J(θ)为损失函数(这里是平均负对数似然);

负号将极大化损失函数转化为极小化损失函数;

log函数方便将乘法转化为求和(优化处理)


如何计算?


问:如何计算
P
(
w
t
+
j

w
t
;
θ
)
P(w_{t+j}|w_t; heta)
P(wt+j​∣wt​;θ)?


答:对于每个单词 w 我们使用两个向量
v
w
v_w
vw​ 和
u
w
u_w
uw​



v
w
v_w
vw​ :当 w 是中心词时



u
w
u_w
uw​ :当 w 是上下文单词时


对于中心词 c 和上下文单词 o,有:



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_{wepsilon V}exp(u_w^Tv_c)}
P(o∣c)=∑wϵV​exp(uwT​vc​)exp(uoT​vc​)​


image-20200607220932736 在概率函数中:
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_{wepsilon V}exp(u_w^Tv_c)}
P(o∣c)=∑wϵV​exp(uwT​vc​)exp(uoT​vc​)​ 分子取幂函数使得始终可以为正


向量
u
o
u_o
uo​ 和向量
v
c
v_c
vc​ 点乘,点乘结果越大,向量之间越相似



u
T
v
=
u

v
=

i
=
1
n
u
i
v
i
u^Tv=u·v=sum_{i=1}^nu_iv_i
uTv=u⋅v=∑i=1n​ui​vi​


对整个词表标准化,给出概率分布


softmax函数进行归一化(深度学习中常用):
R
n

R
n
Bbb{R^n} o Bbb{R^n}
Rn→Rn


(公式
x
s
o
f
t
m
a
x

x

=
e
x
p
(
x
i
)

j
=
1
n
e
x
p
(
x
j
)
=
p
i
xsoftmax(x)= frac {exp(x_i)}{sum_{j=1}^nexp(x_j)}=p_i
xsoftmax(x)=∑j=1n​exp(xj​)exp(xi​)​=pi​


) 注:用于将任意值
x
i
x_i
xi​ 映射到概率分布
p
i
p_i
pi​


Word2vec objective function gradients Training a model by optimizing parameters

(通过优化参数的方式训练模型)- 最小化损失


image-20200607225254610


To train the model: Compute all vector gradients


整个模型里只有一个参数
θ
heta
θ ,所以我们只用优化这一个参数就行。


例如:模型在一个 d 维,词典大小为 V :
θ
=
[
v
a
a
r
d
v
a
r
k
v
a

v
z
e
b
r
a
u
a
a
r
d
v
a
r
k
u
a

u
z
e
b
r
a
]
ϵ
 
R
2
d
V
heta=egin{bmatrix}v_{aardvark}\v_a\vdots\v_{zebra}\u_{aardvark}\u_a\vdots\u_{zebra} end{bmatrix}epsilon Bbb R^{2dV}
θ=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​vaardvark​va​⋮vzebra​uaardvark​ua​⋮uzebra​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​ϵ R2dV 2:每个单词有两个向量


通过梯度(导数)下降的方式优化参数


梯度下降会用到链式法则


迭代计算每个中心词向量和上下文词向量随着滑动窗口移动的梯度


依次迭代更新窗口中所有的参数


Example:


image-202006072328183015. Optimization basics


Optimization:Gradient Descent(梯度下降)


我们的损失函数
J
(
θ
)
J( heta)
J(θ) 需要最小化

使用的方法为:梯度下降

对于当前
θ
heta
θ ,计算
J
(
θ
)
J( heta)
J(θ) 的梯度

然后小步重复朝着负梯度方向更新方程里的参数
α
=
(
s
t
e
p
 
s
i
z
e
)
 
o
r
 
(
l
e
a
r
n
i
n
g
 
r
a
t
e
)
alpha=(step size) or (learning rate)
α=(step size) or (learning rate)
θ
n
e
w
=
θ
o
l
d

α

θ
J
(
θ
)
heta^{new}= heta^{old}-alpha abla_ heta J( heta)
θnew=θold−α∇θ​J(θ)

更新唯一的参数
θ
heta
θ:
θ
j
n
e
w
=
θ
j
o
l
d

α
α
α
 
θ
j
o
l
d
J
(
θ
)
heta_j^{new}= heta_j^{old}-alpha frac alpha{alpha heta_j^{old}}J( heta)
θjnew​=θjold​−αα θjold​α​J(θ)


while True:
theta_grad = evaluate_gradient(J,corpus,theta)
theta = theta - alpha * theta_grad

SGD:Stochastic Gradient Descent


由于
J
(
θ
)
J( heta)
J(θ) 是在语料文本中所有窗口的方程

当语料很大的时候,计算梯度会消耗巨大

解决办法:SGD

不断sample窗口,不断更新

while True:
window = sample_window(corpus)
theta_grad = evaluate_gradient(J,window,theta)
theta = tehta - alpha * theta_grad
# GloVe GloVe的全称是GloVe: [bal ](https://nlp.stanford.edu/projects/glove/)[Ve](https://nlp.stanford.edu/projects/glove/)[ctors for Word Representation](https://nlp.stanford.edu/projects/glove/)

是这门课的老师Christopher D. Manning的研究成果


GloVe目标是综合基于统计和基于预测的两种方法的优点。


模型目标:词进行向量化表示,使得向量之间尽可能多地蕴含语义和语法的信息


流程:输入语料库–> 统计共现矩阵–> 训练词向量–>输出词向量


构建统计共现矩阵X

Xij代表单词 i表示上下文单词


j表示在特定大小的上下文窗口(context window)内共同出现的次数。这个次数的最小单位是1,但是GloVe不这么认为:它根据两个单词在上下文窗口的距离dd.


提出了一个衰减函数(decreasing weighting):用于计算权重,也就是说距离越远的两个单词所占总计数(total count)的权重越小。


构建词向量和共现矩阵之间的关系

公式



w
i
T
w
~
j
+
b
i
+
b
~
j
=
log

(
X
i
j
)
w_{i}^{T} ilde{w}_{j}+b_{i}+ ilde{b}_{j}=log left(X_{i j} ight)
wiT​w~j​+bi​+b~j​=log(Xij​)


其中,
w
i
T
w_{i}^{T}
wiT​ 和
w
~
j
ilde{w}_{j}
w~j​是我们最终要求解的词向量;
b
i
b_{i}
bi​和
b
~
j
ilde{b}_{j}
b~j​分别是两个词向量的bias term 那它到底是怎么来的,为什么要使用这个公式?为什么要构造两个词向量
w
i
T
w_{i}^{T}
wiT​ 和
w
~
j
ilde{w}_{j}
w~j​?


有了上述公式之后,我们可以构建Loss function:
J
=

i
,
j
=
1
V
f
(
X
i
j
)
(
w
i
T
w
~
j
+
b
i
+
b
~
j

log

(
X
i
j
)
)
2
J=sum_{i, j=1}^{V} fleft(X_{i j} ight)left(w_{i}^{T} ilde{w}_{j}+b_{i}+ ilde{b}_{j}-log left(X_{i j} ight) ight)^{2}
J=i,j=1∑V​f(Xij​)(wiT​w~j​+bi​+b~j​−log(Xij​))2 loss function的基本形式就是最简单的mean square loss,只不过在此基础上加了一个权重函数$ fleft(X_{i j} ight) $,那么这个函数起了什么作用,为什么要添加这个函数呢?我们知道在一个语料库中,肯定存在很多单词他们在一起出现的次数是很多的(frequent co-occurrences),那么我们希望:


这些单词的权重要大于那些很少在一起出现的单词,因此这个函数要是非递减函数(non-decreasing);但这个权重也不能过大,当到达一定程度之后当不再增加;如果两个单词没有在一起出现,也就是
X
i
j
X_{i j}
Xij​,那么他们应该不参与到loss function的计算当中去,也就是f(x)要满足f(x)=0

为此,作者提出了以下权重函数:



f
(
x
)
=
{
(
x
/
x
max

)
α
 if 
x
<
x
max 
1
 otherwise 
f(x)=left{egin{array}{cc} left(x / x_{max } ight)^{alpha} & ext { if } x<x_{ ext {max }} \ 1 & ext { otherwise } end{array} ight.
f(x)={(x/xmax​)α1​ if x<xmax ​ otherwise ​


实验中作者设定
x
max

=
100
x_{max }=100
xmax​=100,并且发现
α
=
3
/
4
alpha=3 / 4
α=3/4时效果比较好。


BERT

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liuxingxing_sun/article/details/112689386

随机推荐

qt高速显示大图_2020海东移动密集架大图

2020海东移动密集架大图密集架想要正常的长久我的使用就必须要有密集柜的质量。而这质量的密集柜与否则包括了很多方面,包括材质,配件使用,装配等多个方面...

weixin_39631649 阅读(430)

python cms应用生成_Django CMS应用程序H教程

当你“钩住”一个应用程序的url到DjangoCMS页面时,你的应用程序的url和视图功能就从那里接管了。在假设你的DjangoCMS页面的URL是:/成就/在这个页面上&...

weixin_39702714 阅读(102)