最近のgensim/word2vec事情

なんか色々と入用になってウォッチしてたら、4.0.0に向けて結構大きな変更が入っているのが見えたので、それらを見たり、あとは調べてて気になったこととかも含めて雑に書き綴っていこうと思います。

deprecatedパッケージが削除

多分これが一番大きな変更だと思います。
今まで表面上は gensim.models.Word2Vec とか使って、実際には裏で gensim.models.deprecated パッケージをずっと利用していて、これいつ消えるのかなーと思ってたんですがついに消えました。
github.com

gensimのコードリーディングを進めているときに、この変更がマージされてとんでもない量のコード変更が起こったので、結局また一から見るはめに…(それはそれとしてとてもありがたい変更なのですが)

最終的な語彙数を決定するmax_final_vocabがFastTextに追加された

これはword2vecではなくFastTextの話なのですが、せっかくなので取り上げてみます。
始まりはかなり遡って2015年のこのissueなのですが、篩をかけたあとに最終的な語彙数を決定するためのパラメータがほしいですね、というものがありました。
github.com

あとになって「あれ?これFastTextのコンストラクタになくない?」となってようやく実装されたという流れですね。
無茶苦茶使い所があるようなパラメタでもないですが、それにしてもかなり長いこと見落とされてたんだなーと。

gensim/word2vecのロスに関して

gensimではcompute_loss=Trueにすることでエポックベースではない損失計算ができましたが、実は正しく損失を計算できていませんでした。
というのも、gensim/word2vecでは内部的にCythonを使っていて、そこでfloat32を使っているため、 2^{27}(134217728.0)までの精度しか出ない、という問題があったためです。
github.com

これはエポックベースの損失計算なら起きる可能性は低いし、そもそもトータルロスよりエポックごとにロス見れたほうがいいよね、というのもあり、どっかでエポックベースの損失計算に変えたいですね、という話がありました。
一先ず、一時的な対処法として、callbackを用意してエポックごとにリセット(model.running_training_loss=0.0)するようにすれば、これが必ずしも正しい対処法なわけではないけども、まあやらないよりはマシな損失値になるよ、という話でしたが、これもそのうち修正されそうな感じです。収束してるのか調べたかったのにこれのせいでわからない、という問題があったので、本当にありがたいですね。
github.com

github.com