2017-10-21 10 views
1

私の現在のdoc2vecコードは以下の通りです。Doc2vecとword2vecのマイナスサンプリング

# Train doc2vec model 
model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 1, workers = 4, iter = 20) 

以下のようなword2vecコードもあります。

# Train word2vec model 
model = word2vec.Word2Vec(sentences, size=300, sample = 1e-3, sg=1, iter = 20) 

私はdoc2vecword2vecでスキップ-gramとCBOWの両方にDMやDBOWの両方を使用することに興味があります。 、私はこのように

「階層ソフトマックスまたは負のサンプリングのいずれかを使用して、 『 』 word2vecの経由深い学習とプロデュース語ベクトル」スキップグラムとCBOWモデル:Gensimで

は私が下記の文章を見つけました階層的ソフトマックスまたはネガティブサンプリングのいずれかを混乱させる。これらの2つの方法での違いがであることをお知らせください。

はまた、私は、DM、DBOWに関してスキップ-gramとCBOW階層ソフトマックス AND/OR 負のサンプリングを使用するようにを変更する必要があるパラメータが何を知ることに興味を持っていますか?

p.s.私のアプリケーションは推奨システムです

答えて

3

スキップグラムまたはCBOWは、ニューラルネットワークのの入力コンテキストを選択するさまざまな方法です。 Skip-gramは近くにある単語を1つ選び、それを入力として供給して目的の単語を予測しようとします。 CBOWは近くの単語をまとめて平均し、その平均を入力として供給し、目標単語を予測しようとします。

DBOWはスキップグラムと最もよく似ています。これは、距離に関係なく平均化を行わずに、テキスト全体の単一の段落ベクトルを使用して個々のターゲットワードを予測することです。それは、単一の段落ベクトルを使用することに加えて、個々の近隣ワードベクトルも使用される、同時スキップグラム訓練とうまく混合することができる。 gensimオプションdbow_words=1は、スキップグラムトレーニングをDBOW dm=0トレーニングに追加します。

DMはCBOWと最も類似しています。段落ベクトルは、複数の周囲の単語とともに平均化され、ターゲット単語を予測しようとします。

Word2Vecではスキップグラム(sg=1)とCBOW(sg=0)のどちらかを選択する必要があります。これらは混在できません。 Doc2Vecでは、DBOW(dm=0)とDM(dm=1)のいずれかを選択する必要があります。混合することはできません。しかし、Doc2Vec DBOWを実行するときに、スキップグラムのワードトレーニング(dbow_words=1)を追加することもできます。

hierarchical-softmaxとnegative-samplingの選択は、上記の選択とは独立しており、独立しています。これは、ターゲット単語予測がニューラルネットワークからどのように読み取られるかを決定する。

ネガサンプリングでは、すべての予測にネットワークの単一の出力ノードが割り当てられます。特定の入力コンテクストがどのような予測を生成するかを改善するために、出力ノードに、(コーパスの現在の訓練例の)正しい単語と、N個の他の「間違った」単語(一致しない単語現在のトレーニング例)。次に、ネットワークの内部重みと入力ベクトルをナッジして、「正しい」ワード出力ノード活性化を少し強め、N '誤った'ワード出力ノード活性化を少し弱める。 (それだけで計算N + 1つのノードと残りの部分を無視して代わりに、大語彙で非常に高価であるすべての出力ノードを計算する必要がなくなりますので、これは、「スパース」アプローチと呼ばれている。)

あなたが設定することができますパラメータnegative=2(Word2VecまたはDoc2Vecで、任意の種類の入力コンテキストモードを使用)を使用して2つの否定的な例を使用した負のサンプリング。デフォルトのモード(negativeが指定されていない場合)はnegative=5で、元のGoogle word2vec.cコードのデフォルトに続きます。

hierarchical-softmaxを使用すると、各出力可能ノードが独自の出力ノードを持つ代わりに、複数の出力ノード活性化パターンが特定の単語を意味すると解釈されます。単語を表現するためにどのノードが1.0または0.0に近いべきかは、単語のエンコーディングの問題です。一般的な単語のエンコーディングは短く(少数のノードしか含まない)、希な単語のエンコーディングは長くなりますノード)。これは、計算時間を節約するためにも役立ちます。入力コンテキストが適切なノードのセットだけを適切な値に駆動して正しい単語(現在のトレーニング例)を予測するかどうかを確認するには、チェックされ、ナッジされて、セット全体の代わりに。

引数hs=1を使用してgensimでhierarchical-softmaxを有効にします。デフォルトでは使用されません。

hierarchical-softmaxを有効にしている場合は、negative=0を入力することで、通常負のサンプリングを無効にする必要があります。通常、CPU時間/ RAMの一定量に対して、

(ただし、元のGoogle word2vec.cコードのアーキテクチャに従えば、たとえばnegative=5, hs=1のように両方を同時にアクティブにすることはできませんが、これによりモデルが大きくなることがありますより多くのRAM /時間を訓練することができてより良い結果を出すことができますが、同等のRAM /時間を片方または両方に与えるほうが良いでしょう)。

階層的なsoftmaxは、より大きなボキャブラリ(各トレーニングに関係するノードの平均数が増えるため)。負のサンプリングはしません(常にN + 1ノードなので)。より大きなコーパスを持つプロジェクトは、マイナスサンプリングを好む傾向にある傾向があります。

+0

ありがとうございました。非常によく説明されています。これはまさに私が探していたものです。もう一度感謝します:) –

+0

これについての回答がわかっている場合はお知らせください:https://stackoverflow.com/questions/46970376/issues-in-gensim-wordrank-embeddings –

関連する問題