鴨川にあこがれる日々

軽い技術っぽい記事かいてます

word2vecのサブサンプリングのtについて

はじめに

昨年の研究とブログとバイトでword2vecを使ったので,そろそろちゃんと中身を理解しようとしました.*1

とりあえず以下の論文を読みましたが,途中で引っかかったので,ブログにまとめておきます.
英語力不足などもあり,結局解決していません.

word2vec自体は実装のことなので,元となる論文がいくつかあります.
今回の論文は,高速化に関わる論文です.

http://arxiv.org/pdf/1310.4546.pdf

当記事は,高頻度単語に対するサブサンプリングの数式に関する記事です.

関連資料など

word2vec - Tool for computing continuous distributed representations of words. - Google Project Hosting

word2vecを動かす際のsampleが今回のサブサンプリングに該当するパラメータです.

qiita.com

  • PFIの海野さんの解説

www.slideshare.net

  • Googleグループでのサブサンプリングに関する質問と解答

groups.google.com

本題

2.3の Subsampling of Frequent Wordsの式です.

{ \displaystyle
P(w_i) = 1 - \sqrt{\frac{t}{f(w_i)}}
}

  •  w_iは,単語 i
  •  f(w_i)は,単語の w_iの頻度
  • tは閾値
  • 左辺の P(w_i)は,高頻度単語を学習データから捨てる確率

で何が問題かというとtの値です.

論文には,

typically around  10^{-5}

があるので,tの値がこれなのかと思ったのですが,その直後に

We chose this subsampling formula because it aggressively subsamples words whose frequency is greater than t while preserving the ranking of the frequencies.

頻度がtより大きい単語をサブサンプリングってことなのでしょうか?


実装で確認しようと試みましたが,資料にある質問とその解答によると,実装コードは,論文の式の通りではないらしいです.
論文に合わせた計算式にすると,word2vecでは,tに相当する変数はsampleで,1e-3がデフォルトになっているサブサンプリングのパラメータです.

ということは,論文の f(w_j)と言っているのは,相対頻度のことかもしれません.

試しにsampleの値を1e-3にしていくつか P(w_j)を計算してみます.

例によってJuliaで計算してみます.

単語数100,000で頻度1,000の単語をサブサンプリングする確率は,

> 1-(sqrt((1e-3)/(1_000 / 100_000)))
0.683772233983162

なので,68%くらいをサブサンプリングします.

頻度10の単語は

> 1-(sqrt((1e-3)/(10 / 100_000)))
-2.1622776601683795||

なので,サンプリングしない(確率なのにマイナス????)


ちなみに相対頻度ではなく,頻度で計算すると,
例えば,

> 1-(sqrt(1e-5/10000))
0.9999683772233983
> 1-(sqrt(1e-5/10))
0.999

となり,ほとんどサブサンプリングします.

論文の f(w_j)いうのは相対頻度,tは1e-3くらいの値,というのが,現在の解答です.

でも実装はtの値は,1e-3だけど論文は10e-5でちょっと違うような...


どなたか分かる人がいたら教えていただければ思います...

参照文献

1 .Mikolov,Tomas;Sutskever,Ilya;Chen, Kai; Corrado, Greg;Dean, Jeffrey. Distributed Representations of Words and Phrases and their Compositionality. CoRR. 2013, abs/1310.4546

*1:できてません