score_cbow_pair 在 word2vec (gensim)
score_cbow_pair in word2vec (gensim)
我想在 gensim 中学习单词和文档向量时输出对数概率。我看过"slow plain numpy"版本中评分函数的实现。
def score_cbow_pair(model, word, word2_indices, l1):
l2a = model.syn1[word.point] # 2d matrix, codelen x layer1_size
sgn = (-1.0)**word.code # ch function, 0-> 1, 1 -> -1
lprob = -log(1.0 + exp(-sgn*dot(l1, l2a.T)))
return sum(lprob)
评分函数应该利用分层 softmax 训练期间学习的参数。但是在对数概率的计算中应该有一个 sigmoid 函数(word2vec Parameter Learning Explained equation (45))。
那么 gensim 是否真的计算 lprob
中的对数概率,或者它只是一个用于比较目的的分数。
我会按如下方式计算对数概率:
-log(1.0/(1.0+exp(-sgn*dot(l1, l2a.T))))
这个等式没有被使用是因为它在接近零的值时会爆炸还是通常是错误的?
我忽略了 sigmoid 函数的对数可以重写:log(1.0/(1.0+exp(-sgn*dot(l1, l2a.T)))) = log(1)-log(1.0+exp(-sgn*dot(l1, l2a.T))) = -log(1.0+exp(-sgn*dot(l1, l2a.T)))
所以代码确实计算了对数似然。
我想在 gensim 中学习单词和文档向量时输出对数概率。我看过"slow plain numpy"版本中评分函数的实现。
def score_cbow_pair(model, word, word2_indices, l1):
l2a = model.syn1[word.point] # 2d matrix, codelen x layer1_size
sgn = (-1.0)**word.code # ch function, 0-> 1, 1 -> -1
lprob = -log(1.0 + exp(-sgn*dot(l1, l2a.T)))
return sum(lprob)
评分函数应该利用分层 softmax 训练期间学习的参数。但是在对数概率的计算中应该有一个 sigmoid 函数(word2vec Parameter Learning Explained equation (45))。
那么 gensim 是否真的计算 lprob
中的对数概率,或者它只是一个用于比较目的的分数。
我会按如下方式计算对数概率:
-log(1.0/(1.0+exp(-sgn*dot(l1, l2a.T))))
这个等式没有被使用是因为它在接近零的值时会爆炸还是通常是错误的?
我忽略了 sigmoid 函数的对数可以重写:log(1.0/(1.0+exp(-sgn*dot(l1, l2a.T)))) = log(1)-log(1.0+exp(-sgn*dot(l1, l2a.T))) = -log(1.0+exp(-sgn*dot(l1, l2a.T)))
所以代码确实计算了对数似然。