词向量
词向量,顾名思义,就是把一个单词或词语表示成一个向量的形式,这是因为在计算机中无法直接处理自然语言,需要把它转化为机器能够理解的语言,比如数值等。最简单的方式是把一个个单词表示成one-hot的形式。例如有三个句子:
我/喜欢/小狗/喜欢/喝咖啡
我/不喜欢/喝咖啡
你/喜欢/什么/东西
词汇表为:
我、你、喜欢、不喜欢、小狗、喝咖啡、什么、东西
然后对每一个词做one-hot编码:
“我”就是[1,0,0,0,0,0,0,0]
“你”就是[0,1,0,0,0,0,0,0]
等等。
则对于每一个句子的表示为:
我 | 你 | 喜欢 | 不喜欢 | 小狗 | 喝咖啡 | 什么 | 东西 |
---|---|---|---|---|---|---|---|
1 | 0 | 2 | 0 | 1 | 1 | 0 | 0 |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
这样对各个词做成了词向量,但这种缺点是稀疏性大,如果词汇集很多则每一个词的维度非常大,会造成维度灾难。不过经近几年的发展,词向量可以表示成密集向量(dense vector),并且可以使用较少的维度表示一个词,其称之为word embedding或Distributed representation。这就是下面将要说的word2vec和GloVe模型。在介绍它们两个之前,先说一说神经网络语言模型(NNLM)。
神经网络语言模型(NNLM)
NNLM由Bengio等人提出,他的主要想法就是:
- 把字典里的每一个单词对应一个词特征向量
- 把单词序列表示成联合概率函数
- 自动学习词特征向量和概率函数的参数
在NNLM中,每一个单词为向量空间中的一个点,而且特征的数目要比字典的大小要小,它的概率函数表示为在给定前一个词下,后一个词的条件概率的乘积。
模型结构
假设训练集为 w 1 , . . . , w T w_1, ..., w_T w1,...,wT的单词序列,单词 w t ∈ V w_t \in V wt∈V, V V V是大量且有限的词汇集。目标是学习一个模型 f ( w t , . . . , w t − n + 1 ) = P ^ ( w t ∣ w 1 t − 1 ) f(w_t,...,w_{t-n+1})=\hat{P}(w_t|w_1^{t-1}) f(wt,...,wt−n+1)=P^(wt∣w1t−1), w 1 t − 1 w_1^{t-1} w1t−1为单词从 w 1 到 w t − 1 w_1到w_{t-1} w1到wt−1。对于任意的 w 1 t − 1 w_1^{t-1} w1t−1,模型的唯一约束为 Σ i = 1 ∣ V ∣ f ( i , w t − 1 , . . . , w t − n + 1 ) = 1 , f > 0 \Sigma_{i=1}^{|V|}f(i, w_{t-1},...,w_{t-n+1})=1, f>0 Σi=1∣V∣f(i,wt−1,...,wt−n+1)=1,f>0。
在这个神经网络模型中,它把这个概率函数分为两部分走:
- 一个映射 C C C,即可以把 V V V中任意一个词 i i i映射为一个实值向量 C ( i ) ∈ R m C(i)\in R^m C(i)∈Rm,它表示的就是单词 i i i的分布式特征向量(distributed feature vector)。在实践中, C C C被表示成一个 ∣ V ∣ × m |V|\times m ∣V∣×m的矩阵,即矩阵的每一行 C ( i ) C(i) C(i)代表一个词的词向量。他们也即模型的输入。
- 单词的概率函数。通过一个函数 g g g把输入的上下文单词的特征向量 ( C ( w t − n + 1 ) , . . . , C ( w t − 1 ) ) (C(w_{t-n+1}),...,C(w_{t-1})) (C(wt−n+1),...,C(wt−1))映射为下一个单词 w t w_t wt的条件概率分布函数,当然,这个单词 w t w_t wt在字典 V V V中。 g g g输出的的向量的第 i i i个元素就是第 i i i个单词的条件概率:
f ( i , w t , . . . , w t − n + 1 ) = g ( i , C ( w t − n + 1 ) , . . . , C ( w t − 1 ) ) f(i,w_t,...,w_{t-n+1})=g(i,C(w_{t-n+1}),...,C(w_{t-1})) f(i,wt,...,wt−n+1)=g(i,C(wt−n+1),...,C(wt−1))
现在再来看下面这一张图就明白了:
首先是对整个词汇表建立一个索引,每个单词对应一个索引号,其实就是one-hot编码,然后把要抽取单词的这些one-hot编码建立索引矩阵 D D D,维度为 ( n − 1 ) × ∣ V ∣ (n-1)\times |V| (n−1)×∣V∣,即每一行代表一个单词的one hot representation。而矩阵 C C C每一行为一个单词的词向量,这样 D ⋅ C D\cdot C