在这个模型中,输入的上下文不是当前词的前n-1个词,而是当前词
w
t
w_t
wt的前c个词
w
t
−
c
,
⋯
,
w
t
−
1
w_{t-c},\cdots,w_{t-1}
wt−c,⋯,wt−1 和后c个词
w
t
+
1
,
⋯
w
t
+
c
w_{t+1},\cdots w_{t+c}
wt+1,⋯wt+c ,窗口大小为2c。同样,上下文中的每个词对应一个长度为m的向量
C
(
w
i
)
C(w_i)
C(wi) ,共有2c个。
C
(
w
i
)
C(w_i)
C(wi) 的含义与前面介绍的神经网络语言模型一样,是对应词的词向量。中间层的构成是将这2c个向量按位相加在一起,构成向量
x
w
x_w
xw ,该向量的长度同样为m,而不是像前面介绍的神经网络语言模型那样将词向量拼接在一起,减少了神经网络的参数量。该模型的输出同样是在给定上下文环境下某个词
w
t
w_t
wt 的概率,但是为了避免计算softmax以提高计算速度,采用了一种称作层次softmax的方法近似softmax的效果。
从根节点root到任何叶节点都存在一条路径,从root开始向下,每遇到一个节点需要选择向左还是向右,最终可以到达某个叶节点。从root开始,选择“左左右”就到达了
w
2
w_2
w2 ,选择“左右”就到达了
w
3
w_3
w3 。如果“左”用“1”表示,“右”用“0”表示,就可以得到一个词的编码,比如
w
2
w_2
w2 的编码为“110”,
w
3
w_3
w3 的编码为“10”等。这就是词的霍夫曼编码。这种编码的特点是不等长,霍夫曼树可以根据每个词的使用频度产生,可以使得常用词的编码短,非常用词的编码长,而且任何一个短的编码都不会是另一个长的编码的前一部分,比如“10”是
w
3
w_3
w3 的编码,则除了
w
3
w_3
w3 以外,不可能还有其他词的编码是以“10”开始的。所以,如果用霍夫曼编码表示一篇文章的话,词的编码之间不需要空格等分隔符,就可以区分出来。比如“10110”只能拆分为“10”、“110”,而不可能有其他的拆分结果。由于越是常用词其编码越短,所以霍夫曼编码也是一种平均编码长度最短的编码方法。
14. 对比
在上图中,词
w
t
w_t
wt 的上下文对应的词向量经求和后得到
x
w
x_w
xw 。霍夫曼树的每一个非叶节点,也就是图中的灰色节点,都单独看做是一个神经元,输入是
x
w
x_w
xw ,输出是一个概率值,表示到达这个节点后向右走的概率
p
(
R
)
p(R)
p(R) ,那么向左走的概率就是
p
(
L
)
=
1
−
p
(
R
)
p(L)=1-p(R)
p(L)=1−p(R) 。这样的话,任何一个词w依据其霍夫曼编码就可以得到一个从root到达该词的概率。比如对于词
w
2
w_2
w2 其霍夫曼编码为“110”,从root开始,第一个节点应该向左走,其概率为
p
1
(
L
)
p_1(L)
p1(L) ,第二个节点还是向左走,其概率为
p
2
(
L
)
p_2(L)
p2(L) ,第三个节点是向右走,其概率为
p
3
(
R
)
p_3(R)
p3(R) 。这样,从root到达
w
2
w_2
w2 的概率就应该是三个概率的乘积,即:
p
1
(
L
)
⋅
p
2
(
L
)
⋅
p
3
(
R
)
=
(
1
−
p
1
(
R
)
)
⋅
(
1
−
p
2
(
R
)
)
⋅
p
3
(
R
)
p_1(L) \cdot p_2(L) \cdot p_3(R) = (1 - p_1(R)) \cdot (1 - p_2(R)) \cdot p_3(R)
p1(L)⋅p2(L)⋅p3(R)=(1−p1(R))⋅(1−p2(R))⋅p3(R)
在训练的时候,对于词表中的每一个词,也就是霍夫曼树的任何一个叶节点,都对应着这样的概率,训练目标就是使该概率值最大。同前面讲的神经网络语言模型一样,我们也同样通过求对数再加负号的办法,将该最大值问题转化为最小值问题,并以此作为损失函数,以便可以用BP算法求解。比如对于词
w
2
w_2
w2 来说,其损失函数就是:
−
(
l
o
g
(
1
−
p
1
(
R
)
)
+
l
o
g
(
1
−
p
2
(
R
)
)
+
l
o
g
p
3
(
R
)
)
-(log(1-p_1(R)) + log(1 - p_2(R)) + logp_3(R))
−(log(1−p1(R))+log(1−p2(R))+logp3(R))
概率
p
(
R
)
p(R)
p(R) 、
p
(
L
)
p(L)
p(L) 如何计算呢?
霍夫曼树的每个非叶节点都看做是一个神经元,注意不是神经网络,就是一个单独的神经元,每个神经元的输入都是一样的,均为
x
w
=
[
x
1
,
x
2
,
.
.
.
,
x
m
]
x_w = [x_1, x_2, ..., x_m]
xw=[x1,x2,...,xm] ,但是每个神经元有各自的参数即权重w,最后再加一个sigmoid激活函数,神经元的输出就是向右走的概率,而用1减去向右走的概率就是向左走的概率。
词用向量表示又称为词向量。词向量可以通过神经网络语言模型得到。所谓神经网络语言模型,就是在给定输入上下文下,下一个词是哪个词的概率。通过训练神经网络语言模型,可以获得词向量。神经网络语言模型同样通过 BP 算法进行训练,与普通的神经网络训练过程不同的是,在修改权重的同时,还要同时对输入进行修改。对输入的修改可以等价成对权重的修改,二者并没有本质的不同。最终在神经网络训练结束后,在输入层就得到了词向量。