Word2Vec是一种比较常用的词嵌入模型,它实际是一种浅层的神经网络,有两种网络结构,分别是CBOW和skip-gram.CBOW的目标是根据上下文出现的词语来预测当前词的生成概率;而skip-gram是根据当前词来预测上下文中各词的生成概率,看起来两种网络结构是互为镜像的,如下图。
由上图,两种网络模型都可以表示成输入层、映射层与输出层。w(t)为当前词,w(t-2)、w(t-1)、w(t+1)、w(t+2)为上下文出现的词(目前上下文滑动窗口为2,可以设置更多)。
计算过程:
1)将输入层中的每一个词设置为N纬向量(N为词汇表中单词个数),其中每个词在其对应的维度设定为1,其他为0。
2)在输入层到隐藏层之间,有一个N*K维的权重矩阵,将每个词向量乘以权重矩阵,到隐藏层之后数据的维度就变成了K维(对于CBOW,会将所有词计算出的隐含单元求和)我们的训练目标是要得到这能唯一表示每个词的K维向量。
3)隐藏层到输出层之间有一个K*N维的权重矩阵,隐藏层K维乘以此权重矩阵得到了N维输出
4)输出层对此N维向量应用Softmax激活函数,可以计算每个单词的生成概率(可以复习一下生成模型、生成概率是什么,简而言之就是在给定的上下文词的情况下出现哪个词的概率最大)如下:
其中Xn为输出这N维向量中,对应的这个单词原始维度取值。
假设我们的词典里只有(我、喜欢、看、吐槽大会)这几个词,那么“我”的原始N维输入向量即是[1,0,0,0],假设经过计算后,我们的输出N维向量是[0.8,0.05,0.01,0.14],那么此时上式的Xn=exp(0.8),分母=exp(0.8)+exp(0.05)+exp(0.01)+exp(0.14)
5)训练神经网络(可见也就是训练N*K 以及K*N这两个矩阵),使用反向传播算法,每次迭代将权重沿梯度更优的方向更新。(由于最后输出层使用了softmax,需要遍历所有词汇使迭代缓慢,因此产生了Hierarchical Softmax和Negative Sampling两种方法,感兴趣可以了解一下),最后我们得到了两个系数矩阵,进而也可以求得每个词所对应的K维向量