Word2vec
の考え方は、テキスト内で(互いに関連して)近接して表示される単語のベクトル間の類似性(ドット積)を最大化し、そうでない単語の類似性を最小化することです。リンクする論文の式(3)で、指数関数をしばらく無視します。あなたが持っている
v_c * v_w
-------------------
sum(v_c1 * v_w)
分子は基本的に、単語c
(コンテキスト)とw
(ターゲット)Wordの類似性です。分母は、他のすべてのコンテキストc1
とターゲットWord w
の類似性を計算します。この比率を最大化すると、テキスト内でより近くに表示される単語が、そうでない単語よりも類似したベクトルを持つようになります。ただし、多くのコンテキストc1
があるため、これの計算は非常に遅くなる可能性があります。ネガティブサンプリングは、この問題に対処する方法の1つです。いくつかのコンテキストc1
をランダムに選択するだけです。最終結果は、cat
のコンテキストにfood
が現れる場合、food
のベクトルはcat
のベクトルにより類似します(メジャーとしてドット積によって)ランダムに選択された他のいくつかの単語のベクトルより(例:democracy
、greed
、Freddy
)、言語の他のすべての単語。これにより、Word2vec
のトレーニングがはるかに高速になります。
Softmax(どの単語が現在のターゲットWordに似ているかを判断する関数)の計算は、 [〜#〜] v [〜#〜](分母)のすべての単語の合計。これは一般に非常に大きくなります。
何ができますか?
ソフトマックスにapproximateするためのさまざまな戦略が提案されています。これらのアプローチは、softmax-basedとsampling-basedアプローチに分類できます。 。 Softmaxベースのアプローチは、softmax層をそのまま保持するが、そのアーキテクチャを変更して、効率(例、階層的なソフトマックス)。 サンプリングベースの一方で、softmaxレイヤーを完全に廃止し、代わりに他のいくつかを最適化するソフトマックスに近似する損失関数(ソフトマックスの分母の正規化を、負のサンプリングのように計算するのに安価な他の損失で近似することによりこれを行います)。
Word2vecの損失関数は次のようなものです。
どの対数は次のように分解できます:
数学および勾配式(詳細はを参照)を使用して、次のように変換されました。
ご覧のとおり、バイナリ分類タスクに変換されました(y = 1の陽性クラス、y = 0の陰性クラス)。バイナリ分類タスクを実行するにはラベルが必要なので、すべてのコンテキストワードcを真のラベル(y = 1、正のサンプル)、およびkとして指定しますコーパスから偽ラベルとしてランダムに選択(y = 0、負のサンプル)。
次の段落を見てください。ターゲットWordが「Word2vec」であると仮定します。ウィンドウが3の場合、コンテキストワードはThe
、widely
、popular
、algorithm
、was
、developed
です。これらのコンテキストワードは、ポジティブラベルと見なされます。ネガティブラベルも必要です。コーパスからいくつかの単語をランダムに選択します(produce
、software
、Collobert
、margin-based
、probabilistic
)、それらを負のサンプルと見なします。コーパスからランダムにいくつかの例を選んだこの手法は、ネガティブサンプリングと呼ばれます。
参照:
ネガティブサンプリングに関するチュートリアル記事を書きました こちら 。
なぜ負のサンプリングを使用するのですか?->計算コストを削減する
バニラスキップグラム(SG)およびスキップグラムネガティブサンプリング(SGNS)のコスト関数は次のようになります。
SGの確率分布p(w_t+j|w_t)
は、コーパス内のすべてのV
単語に対して計算されます。
Skip-Gramモデルをトレーニングする場合、V
は簡単に数万を超えることがあります。確率はV
回計算する必要があり、計算コストが高くなります。さらに、分母の正規化係数には余分なV
計算が必要です。
一方、SGNSの確率分布は次のように計算されます。
c_pos
は正のWordのWordベクトルであり、W_neg
は出力重み行列のすべてのK
負のサンプルのWordベクトルです。 SGNSでは、確率をK + 1
回だけ計算する必要があります。ここで、K
は通常5〜20です。さらに、分母の正規化係数を計算するために余分な反復は必要ありません。
SGNSでは、各トレーニングサンプルの重みの一部のみが更新されますが、SGは各トレーニングサンプルの何百万もの重みを更新します。
SGNSはこれをどのように達成しますか?->複数分類タスクをバイナリ分類タスクに変換することにより。
SGNSを使用すると、中央の単語のコンテキスト単語を予測することで単語ベクトルが学習されなくなります。実際のコンテキストワード(ポジティブ)とランダムに描かれたワード(ネガティブ)をノイズ分布から区別することを学習します。
実際には、通常Gangnam-Style
やregression
のようなランダムな単語でpimples
を観察することはありません。モデルが可能性のある(正の)ペアと可能性の低い(負の)ペアを区別できる場合、優れた単語ベクトルが学習されるという考え方です。
上の図では、現在の肯定的なワードコンテキストペアは(drilling
、engineer
)です。 K=5
負のサンプルは ランダムに描画 から ノイズ分布 :minimized
、primary
、concerns
、led
、page
です。モデルがトレーニングサンプルを反復処理するときに、正のペアの確率がp(D=1|w,c_pos)≈1
を出力し、負のペアの確率がp(D=1|w,c_neg)≈0
を出力するように重みが最適化されます。