1

word2vecプロジェクトのコードを理解しようとしています。私が参照しているファイルはword2vec.cです。コードのスニペットは次のとおりです。

#define EXP_TABLE_SIZE 1000
#define MAX_EXP 6
//...snip...
expTable = (real *)malloc((EXP_TABLE_SIZE + 1) * sizeof(real));
  for (i = 0; i < EXP_TABLE_SIZE; i++) {
    // Precompute the exp() table
    expTable[i] = exp((i / (real)EXP_TABLE_SIZE * 2 - 1) * MAX_EXP); 
    // Precompute f(x) = x / (x + 1)
    expTable[i] = expTable[i] / (expTable[i] + 1);
  }
//...snip...

これらの値を事前計算することの利点は明らかではありません。誰か説明してくれませんか?

4

4 に答える 4

3

このコードは、範囲 [-6, 6) のロジスティック関数テーブルを計算し、ステップ サイズは 1 / EXP_TABLE_SIZE * 2 = 0.002 です。詳しく説明します。

x が [0, 1) の範囲にある場合、x * 2 - 1 は [-1, 1) の範囲になり、(x * 2 - 1) * MAX_EXP は [-MAX_EXP, MAX_EXP) の範囲になります。x を i / EXP_TABLE_SIZE に置き換えると、コードの最初の行が表示されます。したがって、最初の行は EXP(x) を計算し、x の範囲は [-6, 6) で、ステップ サイズは 1 / EXP_TABLE_SIZE * 2 です。2 行目、EXP(X) / (EXP(X) + 1) はロジスティック関数。

テーブルを使用する場合、範囲 (-6, 6) の実数を範囲 [0, 1000) のインデックス番号に変換する必要があります。コードでは、f の範囲は (-6, 6) です。f + MAX_EXP は (0, 12) の範囲にあり、(f + MAX_EXP) / MAX_EXP / 2 は (0, 1) の範囲にあります。この値に EXP_TABLE_SIZE を掛けると、f 値に応じたインデックスが得られます。

最後に、ロジスティック(f)を取得します

于 2015-01-24T14:21:14.937 に答える
1

有限状態マシンで使用されるこれらのタイプのテーブルをよく見かけます。これらのテーブルは多くの場合、実行時に生成され、基本的に、それを格納するために割り当てられたメモリを犠牲にして実行時間を短縮します。

テーブルが計算/生成されたら、答えを得るために必要なことは、テーブルに適切にインデックスを付けるだけです。アイデアは、既存のテーブルを見つけてインデックスを作成する方が、毎回最初から計算を実行するよりもはるかに高速であるということです。

于 2014-02-01T19:10:38.833 に答える
0

これは素晴らしい質問です。素晴らしい答えがいくつかあります。

ExpTableは何に使用されますか? テーブルからの指数関数の作成

使用方法にまだ慣れていない場合は、exp で優れたKahn Academy Seriesを試してみる価値があるかもしれません。

ここで見ることができます:

ここに画像の説明を入力

「exp」関数は、ベクトル (v"sub wo Transpose) に (v sub wI) を掛けたものに適用されます。

ここで Word2Vec に関する論文を読むことができます。単語とフレーズの分散表現とその構成性

else f = expTable[(int)((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))];

ご覧のとおり、スニペットの上の 443 行目、再び word2vec.c コード ファイルの 468 および 499 行目で、Peng Liu が言うようにルックアップが実行されます。

詳細については、素晴らしいブログをここで読むことができます: Word2Vec Implementations of Gradient and expTable

于 2017-01-25T09:35:22.890 に答える