赞
踩
词嵌入即利用向量来表示单词,表示原则是一个单词的意思是由经常出现在它附近的单词给出的,即我们需要刻画单词的上下文关系。转化成数学就是,我们需要构建一个词空间,用词空间里的向量来表示单词,相似词对应的词向量在空间上距离近
如何去构建一个词向量空间呢,我们延续上文神经语言模型_逐段解读的方法,利用神经网络的方法。但是,我们并不需要进行完整的NNLM(非线性层的计算量非常大),我们只需要前面的线性部分,构造一个简单(计算量相比NNLM小)对数线性分类器(log-linear classifier)就可以。
CBOW的结构是利用上下文来求中心词的线性对数分类器,最终获取从输入到Projection层的权重作为词向量矩阵(空间)。
CBOW是Continuous Bag-of-Words Model,有点类似NNLM,但是它没有非线性的隐藏层,且线性层(projection layer)是共享给词库中所有词,而不是像NNLM一样只供输入词使用。同时这里考虑上下文,而不是仅考虑上文。
之所以称之为bag of words是因为这里对上下文进行求平均组成一个向量来预测中心词。忽略了上下文的语序。continuous则是因为这里选取的上下文是连续的(虽然在后续处理中不考虑语序)
具体训练的数学推到公式如下
1)假定输入上下文分别为
w
t
−
2
,
w
t
−
1
,
w
t
+
1
,
w
t
+
2
w_{t-2},w_{t-1},w_{t+1},w_{t+2}
wt−2,wt−1,wt+1,wt+2,可以根据词库表
V
V
V获取相应的one-hotting向量,进一步得到初始化词向量分别为
x
t
−
2
,
x
t
−
1
,
x
t
+
1
,
x
t
+
2
x_{t-2},x_{t-1},x_{t+1},x_{t+2}
xt−2,xt−1,xt+1,xt+2,这里词向量的获取方法实际上就是one-hotting向量乘以词向量矩阵,这也是Projection层得来的原因,这里的词向量矩阵的参数实际上就是全连接的Projection层的网络权重。
对
x
t
−
2
,
x
t
−
1
,
x
t
+
1
,
x
t
+
2
x_{t-2},x_{t-1},x_{t+1},x_{t+2}
xt−2,xt−1,xt+1,xt+2取向量元素级平均,得到$\bar{x} $
2)对于此表中任何一个词
b
b
b,我们可以通过神经网络线性分类器的前向输出,得到这个词属于中心词的概率,为
P
(
b
∣
w
t
−
2
,
w
t
−
1
,
w
t
+
1
,
w
t
+
2
)
=
e
x
ˉ
′
y
∑
a
∈
V
e
x
ˉ
′
a
P(b|w_{t-2},w_{t-1},w_{t+1},w_{t+2}) = \frac{e^{\bar{x}'y}}{\sum_{a \in V}e^{\bar{x}'a}}
P(b∣wt−2,wt−1,wt+1,wt+2)=∑a∈Vexˉ′aexˉ′y
这里的
y
y
y是词b在输出矩阵(从Projection到预测层之间的权重)对应行的向量。
3) 重复上述步骤2),可以得到词库表
V
V
V中每一个词属于中心词的概率,拼起来可以得到一个概率向量
y
~
\tilde{\bold{y}}
y~
4) 已知真实的中心词是
w
t
w_t
wt,转化成one-hotting向量是
y
\bold{y}
y,可以利用交叉熵作为损失函数(原因可以参见为什么交叉熵(cross-entropy)可以用于计算代价? - 微调的回答 - 知乎),这样可以得到损失函数为
J
(
θ
)
=
−
y
l
o
g
y
~
=
−
w
t
log
P
(
b
∣
w
)
J(\theta) = - \bold{y} log \tilde{\bold{y}}=-w_t\log{P(b|w)}
J(θ)=−ylogy~=−wtlogP(b∣w)。这一步等式的原因是
y
\bold{y}
y是one-hotting,这里的
θ
\theta
θ是向量的权重,也就是神经网络的参数
5) 利用损失函数进行SGD,不断训练迭代最终可以得到最优的
θ
\theta
θ,进而得到最优词向量矩阵,得到最优词向量。
至于为什么梯度下降法训练得到的结果,预测出来的是接近正确的上下文,可以参考梯度下降的数学解释,这里因为符号标记不一样,我就不展开说了。
skip-gram是基于中心词预测上下文的对数线性分类器。重点的区别在Projection层到预测层。
预测层需要输出2m个上下文(上下文的半径为m),所以输出概率也是2m个,公式如下:
P
(
w
c
,
j
=
w
o
,
c
∣
w
I
)
=
e
x
′
y
o
,
c
∑
a
∈
V
x
′
a
P(w_{c,j} = w_{o,c}|w_I) = \frac{e^{x'y_{o,c}}}{\sum_{a \in V}x'a}
P(wc,j=wo,c∣wI)=∑a∈Vx′aex′yo,c
这里
w
o
,
c
w_{o,c}
wo,c是真实的上下文词,
y
o
,
c
y_{o,c}
yo,c该词在输出矩阵对应行的向量。
这里有2个坑:
word2vec的计算瓶颈在于softmax层的计算,因为softmax分母需要对此表中所有词都进行向量乘计算,每一次训练都需要更新迭代,计算量非常大。
为此,有两种优化方法来解决这一问题,分别是negative sampling和hierarchical softmax
negative sampling的方法非常直观,因为相比真实的输出值(设为正样本,输出为1),假的输出值(负样本)数量是巨大的(
∣
V
∣
−
1
|V|-1
∣V∣−1),所以对负样本进行抽样选取训练,减少计算量。
Mikolov推荐使用的负样本抽样分布是
P
(
w
)
=
f
(
w
i
)
3
4
∑
j
=
0
n
f
(
w
j
)
3
4
P(w) = \frac{f(w_i)^{\frac{3}{4}}}{\sum_{j=0}^n f(w_j)^{\frac{3}{4}}}
P(w)=∑j=0nf(wj)43f(wi)43,这里
f
f
f是均匀分布
这个分布的好处是提升低频词相对被抽中的概率。详细见这个指数幂的图
分层softmax,其结构就是一个霍夫曼树,首先介绍一下霍夫曼树。
基本概念:
路径:从根节点到结点通路长度
权值:赋予结点的数值,w2v里是频数
结点带权路径:结点路径*结点权值
树的带权路径:所有叶子结点的带权路径之和
霍夫曼树:使树带权路径最小的二叉树
霍夫曼树的构造方法:
1)将
w
1
,
w
2
,
.
.
.
,
w
n
{w_1,w_2,...,w_n}
w1,w2,...,wn看成是n棵树的森林
2)从森林中选择根节点权值最小的两棵树合并,作为一棵新树的左右子树,且新树的根节点权值为左右子树根节点权值的和
3)从森林中删除选取的两棵树,并将新树加入森林
4)重复2),3)两步,直到森林中只剩下一棵树为止,该树即为霍夫曼树
从网上找到一个例子。以词频作为权值,可以看出,高频词离根节点最近,最容易被访问。
作为hierarchical softmax,是将隐藏层(Projection)到输出层这一部分(也就是输出矩阵)变成霍夫曼树。霍夫曼树中,根节点是隐藏层向量,叶子节点是可能输出词,大小和词库一致。
具体来说,输入利用二元逻辑回归方法分左右支流动,最终输出叶子节点。从根节点流动到叶子节点得到的路径概率就是该单词输出的概率,因此,相比原先计算每一个单词输出概率需要计算V次(softmax分母),利用这个方法仅需要计算
log
V
\log{V}
logV次(二叉树)
这里
n
n
n表示内部节点,
c
h
ch
ch表示任意一个节点,论文中默认左边节点,
[
x
]
:
1
i
f
x
i
s
T
r
u
e
e
l
s
e
−
1
[x]: 1 if x is True else -1
[x]:1ifxisTrueelse−1,结合sigmoid可以推断,
σ
(
x
)
+
σ
(
−
x
)
=
1
\sigma(x)+\sigma(-x) = 1
σ(x)+σ(−x)=1,进一步,可以推断,
∑
i
=
0
V
p
(
w
i
=
w
o
)
=
1
\sum_{i=0}^Vp(w_i=w_o) = 1
∑i=0Vp(wi=wo)=1。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。