2016-08-31 8 views
0

私はgensimでwordとdocベクトルの学習中にlog-probabilityを出力したかったのです。私は "slow plain numpy"バージョンでスコア関数の実装を見てきました。word2vec(gensim)のscore_cbow_pair

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トレーニング中に学習されたパラメータを使用する必要があります。しかし、対数確率の計算では、シグモイド関数(word2vec Parameter Learning Explained equation (45))が仮定されています。 したがって、gensimは実際にはlog-probabilityをlprobに計算しますが、これは単なる比較目的のスコアです。

次のように私は対数確率を計算しているだろう

-log(1.0/(1.0+exp(-sgn*dot(l1, l2a.T))))

はそれがゼロに近い値のために爆発するので、この式が使用されていないか、それが一般的な間違っていますか?

答えて

0

私はシグモイド関数の対数を書き換えることができることを見落としてきました: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)))

ので、コードが対数尤度を計算しません。

関連する問題