PRML7.2.2 疎性の解析 ■直感的な説明 まずN=2で基底関数が1つのみの場合を考える 周辺確率の尤度 p(t|α,β) = N(t|0,C) ここで共分散行列 C = 1/βI+1/αφφ^T (7.86より) これは分散C、平均0のガウス過程を表す これを最大にするようなα,βを求めたい →図7.10 φが観測値tのベクトルと違う方向を向いている場合、この基底関数の要素を含ませると尤度が下がる。 のでα→∞にしないといけない αが弱く効くのではなく∞になって完全にゼロになる、というのがRVMで疎性が大きくなる原因? α_i→∞ であることの意味: 重みw_iが分散∞のガウス分布に従うようになる、つまりw_iは事実上0になって、 その項は線型モデル y=Σw_i k(x,x_n) に含まれなくなる ■もっと数学的に考察 一般の、基底関数がM個ある場合について (7.87)でαを逐次的に求める式が出ているが、これをα_iについて陽に解いてみる (7.86)の共分散行列Cを、α_iを含む項と含まない項に分けて計算する。 (7.93〜95) すると対数周辺尤度がα_iを含む項と含まない項に分解でき、 L(α) = L(α_-i) + λ(α_i) ただし λ(α_i) = 1/2 [ ln(α_i) - ln(α_i + s_i) + q_i^2 / (α_i + s_i) ] ここで、次の2つの値が導入されている。 疎性パラメータ s_i = φ_i^T C_-1^-1 φ_i 品質パラメータ q_i = φ_i^T C_-1^-1 t s_i は、φ_iが他の基底関数とどれくらい関連度が高いかを表す →この値が高いなら、基底関数φ_iは要らない子 q_i は、φ_iが出力の誤差ベクトル(φ_iを除いたモデルでの出力とtとの差)とどれくらい関連度が高いかを表す →この値が高いなら、基底関数φ_iはないと困る L(α) を α_i で微分して0とおくことで、周辺化尤度を最大にするα_iを求める それは結局 λ(α_i) を微分して0とおくことになり、計算すると α_i = s_i^2 / (q_i^2 - s_i) (q_i^2 > s_i の場合) (7.101) α_i = ∞ (q_i^2 <= s_i の場合) となる。 つまり、q_i^2 <= s_i の場合は基底関数φ_iは結果に影響を及ぼさない。 ■RVMの高速な学習 (7.101)は、α_i以外を固定した場合にα_iを求める式 これを利用して、各α_iを逐次改善的に求めていくことができる この過程で、値が∞になるα_iを計算から除外できるの。 Mをモデルに含まれる基底関数の数とすると、計算量はO(M^3) 7.2.1節の方法ではM=N+1でO(N^3)だったが、RVMでは疎性によってMがNよりもかなり小さくなる場合が多いので、計算が速くなる Pythonで実装してる人:http://d.hatena.ne.jp/se-kichi/20100519/1274275285 PRML7.2.3 分類問題に対するRVM ■2クラス分類問題に対してRVMを適用 モデル:基底関数の線形結合にロジスティックシグモイド関数を適用する y(x,w) = σ(w^T φ(x)) wはガウス事前分布に従う。ただし超パラメータは要素ごとに別々 解析的に積分できないので、ラプラス近似を適用する 対数尤度 ln(p(w|t,α)) = Σ_n=1^N { t_n ln(y_n) + (1-t_n) ln(1-y_n) } - 1/2 w^T A w + const これをwで微分して勾配ベクトルとヘッセ行列を計算し、 反復重み付け最小二乗法(4.3.3節)を使って対数周辺尤度を最大化するαを求められる。 結果、近似分布の平均は w* = A^-1 Φ^T (t-y) 共分散行列は Σ = (Φ^T B Φ + A)^-1 これらを用いて、周辺尤度の近似値が p(t|α) = p(t|w*) p(w*|α) (2π)^(M/2)|Σ|^(1/2) と計算できる。 これを最大化するαを求めたいので、αについて微分して0とおくと、 α_i = γ_i / (w*_i)^2 という式になる。 ただし γ_i = 1 - α_i Σ_ii (注:α_iについて閉じた解ではない) このとき、 t~ = Φw* + B^-1 (t-y)、C = B + ΦAΦ^T とおくと、 対数尤度は ln p(t|α,β) = -1/2 {N ln(2π) + ln|C| + (t~)^T C^-1 t~} となる。 これは (7.85) と同じ形なので、前節と同じ計算方法が適用できる。 例:図7.12 SVMと比べてみると関連ベクトルが分類面から離れたところにあるという特徴がある →分類面に近いデータ点を中心とする基底関数は、訓練データの出力と関連が低いから使えない ■多クラス分類 各クラスの入力とパラメタの線形結合をソフトマックス関数で組み合わせれば良い。 a_k = w_k^T x y_k(x) = exp(a_k) / Σ_j(exp(a_j)) ただしヘッセ行列の次元が(MK)^3になる→2クラス分類の場合と比べて計算量がK^3倍 疑問 RVMがSVMに比べてあまり名前を聞かないのはなんで?? ・ライブラリの充実度 ・計算量の違い RVM:O(N^3) vs SVN:O(N^2) が重い ・実はそんなに精度が良くない RVMってどのへんがoverfitting対策になってるの? RVMで「今回はoverfitting気味にしたい」「今回はざっくりで」みたいな制御ってできる? →カーネル関数の取り方を工夫したとしても、関連度自動決定でαが無限大になって消されてしまうかも