潜在変数とパラメータ行列

パラメータ行列のサイズが大きいとメモリに乗りきらなかったりする(唐突)。私が最近扱っていた、とあるモデルはパラメータがスパースなのでCRS(Compressed Row Strage)形式を使ってある程度効率的にデータを保持していた。
という話をメモっておいたらtsubosaka氏から良いアドバイスをもらったのでメモ。S*Tパラメータ行列の間に潜在変数Kを挟んでやるとパラメータ数が(S+T)*Kに減らせるよという話。


s∈S、t∈Tについて条件付き確率P(s|t)をパラメータとして持たないといけない場合パラメータ行列のサイズは|S|*|T|となる。例えばSもTも単語の集合だったとすると日本語の単語の種類が仮に50万として50万*50万=2500万で物凄い数のパラメータになる。(実際はパラメータ行列はスパースになっていることが多いのでここまで深刻ではないが)

こういう場合には潜在変数k∈Kを間に挟んでやることでパラメータ数が減らせる。つまりP(s|t)=Σ_k P(s|k)P(k|t)とする。こうするとパラメータ行列がS*KとK*Tの二つに分解できるのでパラメータ数は(S+T)*Kになる。
・・・って、これ、まんまPLSAか。今気づいた。なんにせよ、これは面白そう。と思ったのだが間に潜在変数が入ったのでパラメータ更新式が変わってしまう。その辺ちょっと見直さないと。。

参考: -nokunoの日記-協調フィルタリングのグラフィカルモデル