mots quotidiens. | |
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp | by hns, version 2.10-pl1. |
|
|||||||||||||||||||||||||||||||||||||||||||||||||
ガンマ一般化線形モデルは, 以下のようなモデルです。
普通, 言語処理などでは次のようなデータファイルを使って
1 w0|の p0|助詞 w-1:家 p-1|名詞 0 w0|人 p0|名詞 w-1:の p-1|助詞先頭の二値の観測値をSVMやロジスティック回帰で予測します。しかし, この観測値が 0/1ではなく, 0以上の実数である場合も普通にありえます。
y feature_1 feature_2 feature_3 .. feature_nのようなデータファイルに対して動きます。yは任意の正の実数です。
ガンマ一般化線形モデルはRの glm() で推定できるような気がしてしまいますが, パラメータ w に対して凸ではないため, Webで例にあるような説明変数の数が たかだか1個か2個の場合ではなく, 何百, 何千とある場合はまともに動きません (のはず)。実際, 微分を計算して L-BFGS で最適化するプログラムを最初書いたところ, すぐ局所解にはまってしまい, 変数の数が増えると結果がほとんど0になるなど, 使いものにならない結果となることがわかりました。
このため, 上の gamglm では, 地道なランダムウォークMCMCでパラメータを推定して
います。ただし, 特徴の数が数千を超えると尤度の計算が非常に遅くなるため,
特徴が多くの場合疎であることを利用して, 現在更新する特徴が現れているデータ
だけを利用してMetropolis-Hastingsの尤度計算をする, ということをしています。
やっていることは簡単ですが, 効率的に実装するには結構時間もかかり,
一般的な問題でもあるので, 公開することにしました。
SVMのようなデータで正の実数を回帰するプログラムとして, 使われることがあれば
よいなと思っています。
下に色々書き足したので, ここまで来ると, 別に文書にした方がいいような
気がしてきました。
と言っても, そんなに完全に新しいことを言っているわけ
ではないと思うので, 少し躊躇があります。
p(x|p) = (n0!/Πini!)Πi pi^ni (1)になる。ただし, n0 = Σi ni.
pi = ni/n0 (2)として求まる。 これは基本的に Naive Bayes で使われている方法で, 高村君のNBのチュートリアル などを参照。
p(x|α) = ∫p(x|p)p(p|α)dpとして p を積分消去してしまうことができる。この積分は解析的に計算できて,
p(x|α) = Γ(α0)/Γ(α0+n0)Πi Γ(αi+ni)/Γ(αi) (4)になる。この分布は Polya分布 (Dirichlet/Multinomial)と呼ばれている。 ただし, α0 = Σiαi.
Γ関数を含むこの分布は僕は毎日のように使っているわけだけれども,
一体この分布はどういう意味を持っているのだろうか, というのが気になった。
実はこの答えは, Minka の
"Estimating a Dirichlet distribution"
の4章に書いてあるのだが, とりあえず必要がなかったので, これまで
読み飛ばしていた。(この論文は普通に見るとかなり難しいと思うので,
隅から隅まで読んで計算をフォローしている人はあまりいないと思うのですが..。)
ここに書いてある議論は, 以下のようなこと。
いま, (1)式は
p(x|p) ∝ Πipi^niを意味するので, 両辺の log をとると
logp(x|p) = Σi ni log pi.よって, ∂logp(x|p)/∂pi = ni/pi.つまり, ni = (∂log(x|p)/∂pi)・piということになる。
(∂logp(x|α)/∂mi)・mi = αi[Ψ(αi+ni) - Ψ(αi)] ≡ n~(i).になる。ここで, mi = αi/α0.
n~(i) = α Σi=1n 1/(α+n-i)ここで, Σの中の各項が1に等しければ, 当然 n~(i) = n_i です。 しかし実際は, 各項は
= Σi=1n α/(α+n-i)
= Σi=1n 1/(1+(n-i)/α).
1/(1+(n-i)/α)で, 1より小さくなっています。つまり, この和は
1 + 1/(1+1/α) + 1/(1+2/α) + ... + 1/(1+(n-1)/α)になっていて, 頻度 i が大きくなるほど, その実際のカウントは1増えるのでは なく, 1/(1+(n-i)/α) = 1 - (n-i)/(α+n-i) だけ "dumping" されます。 Minka の論文の Figure 1 には, この和がαが小さい時には log のような ダンピング効果を持つと書いてありますが ∫1/xdx = log(x) なことを考えると (この場合は離散ですが), わりと納得できると思う。
実際, ここで α が 0.001 のように非常に小さい時(自然言語の場合は
よくある), 上の級数の2項めから後ろは分母が非常に大きくなるのでほとんど0に
近付いて, 結局「n が何であっても」この effective count はほぼ1になる,
ということ。(!)
つまり, もし
αi が小さい→ xi の事前観測値が小さければ,
xi が何回観測されても, 1回だけ観測されたのと同じになる, ということ。
これが Minka の論文の(79)式の意味する所だと思う(こういう説明は論文には
全然書いていないが)。
αk' = αk ・(ΣiΨ(αk+nik)-Ψ(αk)) /(ΣiΨ(α0+ni)-Ψ(α0))という fixed-point iteration を計算します。 (この式を導くには, 色々自明でない bound を使って計算する必要があります。)
αk' = αk ・(Σi nik/(αk+nik-1)) /(Σi ni/(α0+ni-1))という fixed-point iteration を解けばいいことがわかります。
Ψ(α+n) - Ψ(α) = Σi=1n 1/(α+n-i) ~ n/(α+n-1)という近似をやっているのだ, ということに気がつきました。
Γ(x+n)/Γ(x) = x(n) = x(x+1)..(x+n-1) ~ (x+n-1)^nという近似をしているのだ, という Minka の(71)式の意味なのだと思います。 (この式には説明がないので, 前に読んだ時は(71)式の理由が全然わからなかった。)
タイトル一覧 |