赞
踩
在许多自然语言处理任务中,许多单词表达是由他们的tf-idf分数决定的。即使这些分数告诉我们一个单词在一个文本中的相对重要性,但是他们并没有告诉我们单词的语义。Word2vec是一类神经网络模型——在给定无标签的语料库的情况下,为语料库中的单词产生一个能表达语义的向量。这些向量通常是有用的:
- 通过词向量来计算两个单词的语义相似性
- 对某些监督型NLP任务如文本分类,语义分析构造特征
接下来我将描述Word2vec其中一个模型,叫做skip-gram模型
在我详细介绍skip-gram模型前,我们先来了解下训练数据的格式。skip-gram模型的输入是一个单词
w
I
w_I
wI,它的输出是
w
I
w_I
wI的上下文
w
O
,
1
,
.
.
.
,
w
O
,
C
{w_{O,1},...,w_{O,C}}
wO,1,...,wO,C,上下文的窗口大小为
C
C
C。举个例子,这里有个句子“I drive my car to the store"。我们如果把"car"作为训练输入数据,单词组{“I”, “drive”, “my”, “to”, “the”, “store”}就是输出。所有这些单词,我们会进行one-hot编码。skip-gram模型图如下所示:
接下来我们来看下skip-gram神经网络模型,skip-gram的神经网络模型是从前馈神经网络模型改进而来,说白了就是在前馈神经网络模型的基础上,通过一些技巧使得模型更有效。我们先上图,看一波skip-gram的神经网络模型:
在上图中,输入向量
x
x
x代表某个单词的one-hot编码,对应的输出向量{
y
1
y_1
y1,…,
y
C
y_C
yC}。输入层与隐藏层之间的权重矩阵
W
W
W的第
i
i
i行代表词汇表中第
i
i
i个单词的权重。接下来重点来了:这个权重矩阵
W
W
W就是我们需要学习的目标(同
W
′
W^{'}
W′),因为这个权重矩阵包含了词汇表中所有单词的权重信息。上述模型中,每个输出单词向量也有个
N
×
V
N\times V
N×V维的输出向量
W
′
W^{'}
W′。最后模型还有
N
N
N个结点的隐藏层,我们可以发现隐藏层节点
h
i
h_i
hi的输入就是输入层输入的加权求和。因此由于输入向量
x
x
x是one-hot编码,那么只有向量中的非零元素才能对隐藏层产生输入。因此对于输入向量
x
x
x其中
x
k
=
1
x_k=1
xk=1并且$x_{k^{‘}}=0, k\ne k^{’}
。
所
以
隐
藏
层
的
输
出
只
与
权
重
矩
阵
第
。所以隐藏层的输出只与权重矩阵第
。所以隐藏层的输出只与权重矩阵第k$行相关,从数学上证明如下:
h
=
x
T
W
=
W
k
,
.
:
=
v
w
I
(
1
)
h = x^TW=W_{k,.}:=v_{wI}\tag{$1$}
h=xTW=Wk,.:=vwI(1)
注意因为输入时one-hot编码,所以这里是不需要使用激活函数的。同理,模型输出结点
C
×
V
C\times V
C×V的输入也是由对应输入结点的加权求和计算得到:
u
c
,
j
=
v
w
j
′
T
h
(
2
)
u_{c,j}=v^{'T}_{wj}h\tag{$2$}
uc,j=vwj′Th(2)
其实从上图我们也看到了输出层中的每个单词都是共享权重的,因此我们有
u
c
,
j
=
u
j
u_{c,j}=u_j
uc,j=uj。最终我们通过softmax函数产生第
C
C
C个单词的多项式分布。
p
(
w
c
,
j
=
w
O
,
c
∣
w
I
)
=
y
c
,
j
=
e
x
p
(
u
c
,
j
)
∑
j
′
=
1
V
e
x
p
(
u
j
′
)
(
3
)
p(w_{c,j}=w_{O,c}|w_{I}) = y_{c,j} = \frac{exp(u_{c,j})}{\sum^V_{j^{'}=1}exp(u_{}j^{'})}\tag{$3$}
p(wc,j=wO,c∣wI)=yc,j=∑j′=1Vexp(uj′)exp(uc,j)(3)
说白了,这个值就是第C个输出单词的第j个结点的概率大小。
前面我讲解了skip-gram模型的输入向量及输出的概率表达,以及我们学习的目标。接下来我们详细讲解下学习权重的过程。第一步就是定义损失函数,这个损失函数就是输出单词组的条件概率,一般都是取对数,如下所示:
E
=
−
l
o
g
p
(
w
O
,
1
,
w
O
,
2
,
.
.
.
,
w
O
,
C
∣
w
I
)
(
4
)
E = -logp(w_{O,1},w_{O,2},...,w_{O,C}|w_I)\tag{$4$}
E=−logp(wO,1,wO,2,...,wO,C∣wI)(4)
=
−
l
o
g
∏
c
=
1
C
e
x
p
(
u
c
,
j
)
∑
j
′
=
1
e
x
p
(
u
j
′
)
V
(
5
)
= -log\prod_{c=1}^{C}\frac{exp(u_{c,j})}{\sum^V_{j^{'}=1exp(u_j^{'})}}\tag{$5$}
=−logc=1∏C∑j′=1exp(uj′)Vexp(uc,j)(5)
接下来就是对上面的概率求导,具体推导过程可以去看BP算法,我们得到输出权重矩阵
W
′
W^{'}
W′的更新规则:
w
′
(
n
e
w
)
=
w
i
j
′
(
o
l
d
)
−
η
⋅
∑
c
=
1
C
(
y
c
,
j
−
t
c
,
j
)
⋅
h
i
(
6
)
w^{'(new)} = w_{ij}^{'(old)}-\eta\cdot\sum^{C}_{c=1}(y_{c,j}-t_{c,j})\cdot h_i\tag{$6$}
w′(new)=wij′(old)−η⋅c=1∑C(yc,j−tc,j)⋅hi(6)
同理权重
W
W
W的更新规则如下:
w
(
n
e
w
)
=
w
i
j
(
o
l
d
)
−
η
⋅
∑
j
=
1
V
∑
c
=
1
C
(
y
c
,
j
−
t
c
,
j
)
⋅
w
i
j
′
⋅
x
j
(
7
)
w^{(new)} = w_{ij}^{(old)}-\eta\cdot \sum_{j=1}^{V}\sum^{C}_{c=1}(y_{c,j}-t_{c,j})\cdot w_{ij}^{'}\cdot x_j\tag{$7$}
w(new)=wij(old)−η⋅j=1∑Vc=1∑C(yc,j−tc,j)⋅wij′⋅xj(7)
从上面的更新规则,我们可以发现,每次更新都需要对整个词汇表求和,因此对于很大的语料库来说,这个计算复杂度是很高的。于是在实际应用中,Google的Mikolov等人提出了分层softmax及负采样可以使得计算复杂度降低很多。
[1] Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.(这篇文章就讲了两个模型:CBOW 和 Skip-gram)
[2] Mikolov T, Sutskever I, Chen K, et al. Distributed Representations of Words and Phrases and their Compositionality[J]. 2013, 26:3111-3119.(这篇文章针对Skip-gram模型计算复杂度高的问题提出了一些该进)
[3] Presentation on Word2Vec(这是NIPS 2013workshop上Mikolov的PPT报告)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。