2016-03-16 22 views
6

私はでWord2vecを使用しており、Googleのトレーニングを受けているGoogleのトレーニングを受けたベータ版がGoogleニュースで訓練されています。私はWord2Vecオブジェクトに直接インデックス検索を行うことによってアクセスすることができますワードベクトルは単位ベクトルではないことに気づいた:Word2vecベクターの長さはどのような意味を持っていますか?

>>> import numpy 
>>> from gensim.models import Word2Vec 
>>> w2v = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True) 
>>> king_vector = w2v['king'] 
>>> numpy.linalg.norm(king_vector) 
2.9022589 

しかし、most_similar方法では、これらの非単位ベクトルが使用されていません。代わりに、正規化されたバージョンのみの単位ベクトルを含む非公開.syn0normプロパティから使用されている:

>>> w2v.init_sims() 
>>> unit_king_vector = w2v.syn0norm[w2v.vocab['king'].index] 
>>> numpy.linalg.norm(unit_king_vector) 
0.99999994 

大きなベクトルは単位ベクトルだけスケールアップ版である:その単語の類似性を考えると

>>> king_vector - numpy.linalg.norm(king_vector) * unit_king_vector 
array([ 0.00000000e+00, -1.86264515e-09, 0.00000000e+00, 
     0.00000000e+00, -1.86264515e-09, 0.00000000e+00, 
     -7.45058060e-09, 0.00000000e+00, 3.72529030e-09, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     ... (some lines omitted) ... 
     -1.86264515e-09, -3.72529030e-09, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00], dtype=float32) 

Word2Vecでの比較はcosine similarityで行われていますが、非正規化ベクトルの長さの意味はわかりません。.syn0normで単位ベクトルを公開するのではなく、gensimがそれらを私に公開するので、の何かを

これらの正規化されていないWord2vecベクトルの長さはどのように生成され、その意味は?どのような計算のために、正規化されたベクトルを使用するのが理にかなっています。

+0

関連:[word2vecの単語ベクトルを使用する前に正規化するか?](http://stats.stackexchange.com/q/177905/12359) –

答えて

3

私は事前に冗長であることをお詫び申し上げます。

単語埋め込みモデルの目的関数は、モデルのデータ対数尤度を最大にすることです。 word2vecでは、予測されるベクトル(コンテキストを使用)と単語のコンテキストが与えられた単語の実際のベクトル(現在の表現)のdot product(正規化softmax)を最小化することによってこれが達成されます。

単語ベクトルが訓練されるタスクは、与えられた文脈または文脈が与えられた文脈(skip-gramcbow)を予測することであることに注意してください。 単語ベクトルの長さは意味がありませんそのように、ベクトル自体は興味深いプロパティ/アプリケーションを持つことがわかります。同様の言葉をを見つけるために

は、most_similar関数が実行される最大コサイン類似度(単位ベクトルを正規化した後、最小ユークリッド距離を持つ単語を見つけることと同等、linkをチェック)、との言葉を見つけます。

類義語を見つけるには、単純に単語ベクトルの生のベクトル表現の間に差(または方向)ベクトルを使用できます。例えば、

  • V( 'パリ') - V( 'フランス')〜V( 'ローマ') - V( 'イタリア')( '良い') `
  • V - V(」悪い ')〜V(幸せ) - V(' '悲しい)gensim

model = gensim.models.Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True) 

model.most_similar(positive=['good', 'sad'], negative=['bad']) 
[(u'wonderful', 0.6414928436279297), 
(u'happy', 0.6154338121414185), 
(u'great', 0.5803680419921875), 
(u'nice', 0.5683973431587219), 
(u'saddening', 0.5588893294334412), 
(u'bittersweet', 0.5544661283493042), 
(u'glad', 0.5512036681175232), 
(u'fantastic', 0.5471092462539673), 
(u'proud', 0.530515193939209), 
(u'saddened', 0.5293528437614441)] 

参考文献:

  1. GloVe:Wordの表現のためのグローバル・ベクトル
  2. word2vecパラメータの学習が説明 - paper
  3. 言語規則性を連続空間Wordの表現で - 関連(まだ未回答question)への回答をコピーするpaper
  4. Word2Vec

関連する問題