あなたが求めている答えではないかもしれませんが、私はまだ挑戦します:
まず、word2Vecを簡単に確認します。スキップグラムを使用していると仮定します。
典型的なWord2Vecトレーニング可能なモデルは、1つの入力レイヤー(たとえば、10000のロングワンホットベクトル)、1つの非表示レイヤー(たとえば、300ニューロン)、1つの出力(10000ロングワンホットベクトル)で構成されています。
- 入力:10 000
- 非表示:300
- 出力:10 000
入力-非表示の間に行列Eがあり、ワンホットを埋め込みにする重みを記述します。各列(または、優先表記に応じて行)は、それらの300ニューロンの事前活性化(対応する着信1ホットベクトルへの応答)を表すため、マトリックスは特別です。
これらの300個のニューロンでアクティブ化を実行する必要はなく、それらの値をすぐに将来のタスクの埋め込みとして使用できます。
ただし、ワンホットを300次元の表現に圧縮するだけでは十分ではありません。意味があるはずです。そして、追加の2番目の行列を使用して、この意味が正しいことを確認します。これは、非表示を出力に接続します
実行時にアクティベーション関数は必要ないため、非表示レイヤーをアクティブにしたくありませんが、その場合は、非表示から出力に向かう2番目のマトリックスが必要になります。
この2番目のマトリックスは、埋め込みとはまったく異なるワンホットになります。そのようなワンホットは、元のワンホットの近くに(文脈上)存在する可能性が最も高い単語を表します。つまり、この出力は元のワンホットではありません。
そのため、2番目の行列が必要です。出力では、分類問題と同様に、ソフトマックスを実行します。
これにより、関係 "word"-> embedding-> "context-neighbor-word"を表現できます。
これで、バックプロパゲーションを実行して、入力非表示の重み(最初の行列E)を修正できます。これらは、私たちが本当に気にしている重みです。これは、Matrix Eをランタイム中に使用できるため(おそらく)、最初の完全に接続されたレイヤーとして一部のリカレントニューラルネットに接続されているためです。
その場合、これは使用しません。
これらの300個のニューロンでアクティブ化を実行する必要はなく、それらの値をすぐに将来のタスクの埋め込みとして使用できます
代わりに、ランタイム中に、そのマトリックスから適切な列(または希望の表記に応じて行)を取得します。この方法の利点は、ワンホットで機能するように設計された、非常に安価な事前トレーニング済みの完全接続レイヤーが得られることです。通常、最初のレイヤーのトレーニングには最も時間がかかります。
トレーニング中に2番目のマトリックスが必要な理由:
繰り返しますが、非表示のレイヤーにはアクティブ化はありません。
元の「入力ワンホット」に応じて「ワンホット」が作成されたはずのネットワークを指示でき、正しい答えを生成できない場合はネットワークを罰することができます。
埋め込みに変換するメカニズムを呼び出すことに関心があるため、隠れ層の直後にsoftmaxを配置することはできません。これはすでに最初の行列Eの責任です。したがって、出力レイヤーで異なるが類似の(コンテキストごとの)隣接語について結論を形成するための十分な余地を与える追加のステップ(追加の行列)が必要です。
ランタイム中に、2番目のマトリックスを破棄します。ただし、戻ってモデルのトレーニングを続ける必要がある場合に備えて、完全に削除しないでください。