質問: word2vecに付属しているベクトル空間で単語同士が似ているかを計算させるdistance.cというプログラムはとても動作が軽快です。 1単語を表すベクトルは200次元 単語のエントリー数は20万語 この条件でも上位40位の単語候補が1秒未満で出力されます。プログラムコード内にどのような工夫が施されているのでしょうか?ぱっと見たところ、全単語に対して探索を行っているように思えるのですが、その工夫がよくわかりません。 また、入力するベクトルの次元数は任意で、どの場合でもすぐに答えがヒットします。 ソースコードへのリンクを貼ります。 distance.cのソース
回答: 「なぜ速いのか」と言われると、「研究の成果です」とも回答できてしまいます。 「どういった工夫がされているのか」といった質問の方が良さそうです。 以下のページがわかりやすく説明されていると思いました。 リンク先がみれる場合はそちらを参照してください。 以下は将来リンク先が見れなくなった場合に備えて速度に関する部分を要約してみました。 人工ニューラルネットワークの研究で提唱された「分散表現」という考え方を使い、「同じ文脈の中にある単語はお互いに近い意味を持っている」という前提のもとに人工ニューラルネットワークに学習させるようです。 この前提により構造の単純化と探索量の縮小とを実現しつつ、ベクトル表現する上で分散表現を利用することで精度の向上も実証されているそうです。 こういった工夫により高速化を実現しているようです。 速いのは魅力的ですね。私も興味を持ちました。