好好研究了下Word2Vec和Sent2Vec的代码,推导了下公式,花费了不少的时间,不过清晰了很多。
源代码参考:https://github.com/klb3713/sentence2vec
理论上是分两部分,首先是进行Word2Vec的,获得词向量,以及权重等。然后再进行Sent2Vec的处理,基于已有的Word Vector以及网络权重。
Word2Vec
- 预测目标
总体的目标是,词向量作为输入(CBOW是多个词的sum,sg是单个词输入),加上权重之后,得到预测的词向量。
首先,会建立haffman tree,每个词就用一组数字来表示[1,0,1,1]。上面的“预测的词向量”,就变成预测这组编码了。变成一个softmax。同时,越高频的词,编码越少,对应要处理的权重也越少,加快效率。
然后,假设最长一共有N位的编码,那么就是Softmax有N个输出。假设词向量维度为M,那么就有权重的空间就是M*N的矩阵,对应代码里的 l2a = model.syn1[word.point]。
- CBOW
CBOW就是,对于当前处理的word,获得它前后窗口范围内的所有词,将他们的词向量各维度求平均,作为输入(对应代码里的 l1)。
然后,计算输出 fa = 1. / (1. + exp(-dot(l1, l2a.T)))。以及梯度 ga = (1. - wor