高村本でCRFのお勉強をしたのでメモ

「言語処理のための機械学習入門」通称高村本でCRF(Conditional Random Fields, 条件付き確率場)のお勉強をしたのでメモしておく。


まず最初に世界には単純な線形識別関数があった。

y = wx

この線形識別関数で、素性はxそのもの。人々はよりリッチな素性が欲しくなったので事例xと正解ラベルtによって定まる素性φ(x, t)を思いついた。つまり

y = wφ(x, t)

である。さらにこれを確率化したくなった。確率とはつまり

1: P(x) >= 0
2: ΣP(x) = 1

を満たす関数のこと。まずは1:を考える。つねにゼロ以上の値をとればよいのでyをexp(y)とする。こうすると

y = -∞  =>  exp(y) = 0
y =  ∞  =>  exp(y) = ∞ 

となりゼロ以上になることが保障される。つぎに2:を考える。足して1にするには全てのexp(y)の和で各exp(y)を割ってやれば良い。つまり

P(y) = exp(y) / Z
Z = Σexp(y)

となる。このP(y)が確率化された線形識別関数。その名も対数線形モデル(log linear model)。またの名を最大エントロピーモデル。さらに素性φ(x, t)のxとtが構造化されていて{x1, x2, ... , xn, t1, t2, ... , tn}とかなるとCRFになる。


さて無事確率モデルができたので、このモデルの重みwを導出したくなった。それには損失関数を定義することから始める。といってもこれは単純で、折角確率化したので負の対数尤度を損失関数とすれば良い。つまり

Loss(w) = -Σ_xlogP(y)
        = Σ_x{logZ - y}
        = Σ_x{logZ - wφ(x, t)}

である。損失関数が決まったので学習を始める。これには定番のSGD(stochastic gradient decend, 確率的勾配法)を使う。SGDとはつまり

w += ∂Loss(w) / ∂w

∂Loss(w) / ∂w = ∂Σ_x{logZ - wφ(x, t)} / ∂w
                = Σ_x{Σ_y{P(y)φ(x, t)} - φ(x, t)}

とすること。さてここで大問題なのがΣ_y{P(y)φ(x, t)}。これはlogZをwで微分した結果でてきた産物。線形識別関数の時はZで正規化しなかったのでこの項はなかった。が確率化の際にZで割ってしまったのでこの項がある。
この項のなにがヤバイかというとP(y)をΣ_yで足しあわせている。つまり考えうるすべてのyについて確率を計算しろと言っている。これが単純にyはAからZの値をとりますよー、とかだと平和。だがCRFのように構造学習をする場合「B, I, I, O」とか「B, I, B, I」とかtのとりうる値が膨大な組み合わせになる。


そこでこの問題を解決するためにForward-Backwardアルゴリズムを使うのだ!ということらしい。とここまで読んで識別モデルめんどくせー。もう構造化パーセプトロン(Structured Perceptron)でいいじゃん。などと思ったのだった。
ちなみに識別時にはかの有名なViterbiアルゴリズムを使えばOKだよ。