糞糞糞ネット弁慶

読んだ論文についてメモを書きます.趣味の話は http://repose.hatenablog.com

KDD2013読み会やった & Density-Based Logistic Regression 読んだ

KDD 2013 の論文を互いに持ち寄って読む会をやった.日付を工夫しなかったせいでhttp://www.marine-e.net/sp/marikore2013/に行けなかったのが非常に悲しい.会場は前回と同じくGunosyのオフィスを貸していただいた.参加してくださった方々,オフィスを貸してくださったgunosyの方々ありがとうございました.
自分は Density-Based Logistic Regression を読んだ.
Density-Based Logistic Regression(pdf,後半に生理的嫌悪感を抱かせる図が載っているので注意が必要.)

目的

ロジスティック回帰にカーネル密度推定を組み合わせた Density-Based Logistic Regression (DLR) を提案する.
この手法は,計算効率が良く,モデルの可解釈性に優れ,パラメーターフリーで,連続値とカテゴリ値を同時に扱い,非線形分類が可能なロジスティック回帰である.
カーネルを用いたSVMなどと比較し,遜色ない精度で優れた計算効率とモデルの可解釈性を実現した.

問題意識

判別器において重要なのは

  1. 非線形分類ができること
  2. 連続値/カテゴリ値を同時に扱えること
  3. 計算効率が良いこと
  4. モデルが解釈しやすいこと
  5. 多値分類に対応していること

の五つである.
Kernel SVM では2,3,4,5に対応していない.2については,カテゴリ値だけベクトルを増やしてやれば対応可能(例えば,4種類のカテゴリ値を取る特徴といった形で表現)だが,次元数が増えるので好ましくない.また,5については, 1-vs-rest や 1-vs-1 といった形式で対応可能だがこれもクラスに偏りがあると上手くいかない.
ロジスティック回帰では3,4,5に対応しているが,ロジスティック回帰においては特徴量はmonotonicであるという仮定(例えば,年齢が高いほど余命が短くなるとか)をおいているため1に対応していない.2に対応していない理由はKSVMの時と同様である.
ここで,「カテゴリ値をそのまま扱えるのはどう嬉しいのか」という話になったが,0/1表現にすると「カテゴリ値のうちどれが重要なのか」がわかるけど,「そのカテゴリ値が特徴として存在することがどれだけ重要なのか」が分かるようになって嬉しいのではないか,という話になった.
そこで,提案手法ではカーネル密度推定やらなんやらを色々使って非線形分類が可能な Logistic Regression を実現する.

手法

数式の詳細は論文を参照してもらうことにして,ここでは論文のキモについて自分用のメモを書く.
論文中の説明は非常に前後するため,自分なりの言葉で書きなおす.
そもそも,入力 を受け取る Logistic Regression は次の式で表現される.

この時,を考えると,これは

と変形できる.ロジスティック回帰の目的とは,すなわちこのデータの分布を学習すると言ってもよい.
次に, DLR は次のような式を学習する.

これは,入力データの各特徴量をで変換してやって通常のロジスティック回帰の枠組みで学習する,という事に等しい.
しかし,をどう設計すればよいか,という問題が生じる.
ここで,「もしデータの各特徴量が独立であった場合,がどのような形で書けるか?」というのを考える.すると,を考える必要がなくなり,次のような式に変形することができる.

これは「もし独立ならはこのような式で書くことによって,がデータの完全な分布を表すことが可能になる.しかし実際は完全に独立ではないからが必要になる」ぐらいの事が言えると思われる(論文ではの式がまず与えられるので読んでる方は完全に意味不明になる).
ここで,ナイーブベイズ(NB)との関連を考えてみると,確かに特徴量の独立性を持ち出すあたりは似ているが以下の二点が異なっている.

  • NBでは厳密に独立性を考えているが,こちらでは証明の流れで使っただけでこだわりはない
  • NBではを求めてからを求めているが, DLR ではを直接モデリングしている

カーネル密度推定

ここまでをまとめると,DLRでは重みに加えて,を推定する必要がある.
[tex\phi_d]の二項目は最尤推定という名のただの数え上げで計算できる.問題は一項目.
特徴量がカテゴリ値の場合はこちらも最尤推定という名の数え上げで計算できる.
問題は連続値の場合.ここで Nadaraya-Watson カーネル密度推定(NWK)を用いる.
NWKは次のように書く.

ここで,連続値を持つ特徴量ごとにカーネルを用意する必要がある.また,新たにカーネルそれぞれにバンド幅と呼ばれるパラメータが登場する.カーネルはガウシアン.

最適化

つまりは,推定すべきパラメータは重みと連続値の場合における各カーネルのバンド幅という事になる
あとはクロスエントロピー最小化に基づいて最適化すれば良い(偏微分は気合で展開する,論文に詳細が書いてあるので参考になる).これで最適化できれば,モデルはパラメータフリーになる.
しかし問題がある.偏微分した際に,目的関数の分母にが含まれてしまい,で目的関数が最小化されてしまう.これについては,「データ点に思いっきりガウシアンがフィットしてしまうから学習の必要無しってことが起こっているのではないか」とid:sleepy_yoshiさんから指摘があった.
なので,学習用データを train と validation の二つにわけ,前者でを最適化したのちに後者でを最適化するという事を繰り返す.これを Hierarchical Optimization と論文中では呼んでいる.
大仰に書いてあるけどハイパーパラメーターのサーチなんてそういう風にやるのが普通じゃないかという突っ込みが入っていた.

実験

人工データ,公開データ,筆者らの医療データで実験をした.カーネルSVMと遜色ない程度の精度で計算時間が最高で100倍ぐらいになっている.これでモデルの可解釈性が保てるなら良いのではないか,という話で落ち着いていた.
注意が必要なのは,実験結果の図が細かな点が大量に書かれていて非常に気持ちが悪いという事.自分が印刷して読んだ時はその部分だけ破いて捨てた.

まとめ

色々あったけど, といういつものロジスティック回帰の枠組みで扱えるのが良いんじゃないかという点で落ち着いた.
あとでrubyあたりで実装してみたい.その前に1000クラスぐらい目的関数がある時にまともに動くロジスティック回帰をC++で実装したい.