本日の輪読会で僕が担当した論文のメモランダムということで、置いときます。
概要
Gradient Boosted Feature Selection (Xu, Huang, Weinberger and Zheng, KDD 2014)
タイトルが示すように特徴量選択をやりたいというのが第一のモチベーションで、これをgradient boosted machineでやろうというお話。ちなみに昨今のKaggleやKDD cupではxgboostが大流行しているわけだが、元はと言えばこれは要はgradient boosted treeである。なので多分これはxgboostの枠組みでもやれるのではないかと勝手に期待してゐる。
1 INTRODUCTION / 2 RELATED WORK
特徴選択が機械学習にとって重要だというのは今更言わなくてもみんな分かっているであろうお話。最も広く用いられている特徴選択手法としてLasso(L1正則化項つき回帰)が挙げられるが、これは要は線形回帰の手法なので非線形では使えないとかそういう話がズラズラ続くので、この辺はばっさり割愛。
ということで、端的に言えば問題意識としては「線形でも非線形でもゴリゴリL1正則化みたいなことをやりたい」という一点に尽きていて、そのためには非線形でも強力な分類器を使うしかなくて、その点ではランダムフォレストかxgboostしかないよね、というのがここでの論点。そこだけ踏まえてこの次に行きましょう。
ちなみにここでは@myamada0さんのHSIC Lassoとかも紹介されているので、興味ある人はどうぞ。
3 BACKGROUND
以下データセットは入力ベクトルと対応するラベルから成り、ラベルの生成分布は未知とする。ラベルが二値・多クラス・連続値であるかどうかは問わない。ただしここでは基本的に二値に着目する。
3.1 Feature selection with the norm
Lassoの復習。L1正則化学習は以下のように書ける。
(1)
ここでは二乗損失でである。もちろん損失関数は他にも定義できて、例えば二値分類ならlog-lossつまりとなる。
3.2 The capped norm
L1正則化には目的が2つある。1つは汎化性能を上げること、そして特徴選択のスパース性を上げることである。ただしこの両者はある程度トレードオフの関係にあるため、最適化に当たっては何かしらの制約をかける必要がある。これを補正するためのアイデアとして、キャップつきL1ノルムという考え方がある。
(2)
通常のL1ノルムに対してこの考え方を取り入れる利点は、ひとたび特徴量選択に用いられたらそれ以上ペナルティを与えない、即ち多くの特徴量に対してペナルティを与えたからといって小さな重みに不要なアドバンテージを与えない、という点である。これはL0ノルム(これはで表される:ただし)の良い近似であるとも言える。つまり、特徴量を使うか否かに対してのみ罰則項として働き、重みの大きさには関与しないということでもある。(2)式のが十分に小さければ、即ちであれば、選択された特徴量の次元数はで正しく表される。言い換えると、でペナルティを与えるということは、そもそも残す特徴次元数そのものに対してペナルティを与えるということに非常に近似的である。ただし、このキャップつきL1ノルムは非凸なので最適化は容易ではない。
キャップつきL1ノルムは通常のL1 / L2ノルムと併用でき、適切な正則化係数を付すことでトレードオフをコントロールできる。
(3)
ここではである。
4 GRADIENT BOOSTED FEATURE SELECTION
(3)式それ自体はまだ線形のままなので、これを非線形にする。線形のものを非線形にするというとカーネル法やboostingが挙げられる。HSIC Lassoはカーネル法を用いているが、計算負荷が高い。そこでこの論文ではよりスケーラブルな方法ということでboostingを用いることにする。
Boostingそのものの説明は例えば朱鷺の森の解説記事でも読んでもらうとして、まずを全ての可能な弱学習器としての回帰木の集合とする。もちろん精度にも木の数にも限りがあるので、は有限、ただしそれなりに大きな数とする。入力がなるにマッピングされているとして、ここでは(3)式の線形分類器を(4)式のように学習させる。
(4)
ここでは弱学習器の回帰木を選択するスパースなベクトルである。(4)式そのものはかなりの高次元になるが、がスパースなことを考えればその最適化は扱いやすい。一般性を失うことなく、集合における木はソートして最初のに対する個の入力が非ゼロだとすると、最終的な分類器は以下のようになる。
(5)
Feature selection
(4)式は2つの罰則項を持つ。が、これはもはや重み付けではなく弱学習器としての木に対する正則化を行う式になっている。これがそのまま特徴量選択の意味合いを持つ。木のアンサンブルから選択される特徴量の個数をモデリングするために、ここで二値行列を定義する(ただし木が特徴量を用いる場合のみとする)。これらを合わせると、特徴量を選択するような木に対して与えられる全体の重み付けは(6)式のように表せる。
(6)
ここでを特徴量に紐付けられた実際の重みにペナルティを与えるように変形すると、最終的な最適化計画は以下のようになる。
(7)
既に述べたように、もしが十分に小さければ(即ち)、と置けて、なおかつ特徴選択のためのペナルティがそのまま用いられた特徴次元数と一致する。
4.1 Optimization
(7)式の最適化計画は、非凸な上に微分不可能である。けれどもここではgradient boostingを使って最適化してみる。まずを損失関数とし、をに対する勾配とする。Gradient boostingはcoordinate descentと同様に捉えることができる。即ち毎ステップごとに最急勾配を持つ次元を更新していく、というやり方である。まず全ての弱学習器回帰木の集合をnegation closed、即ち各々のに対しても存在するとする。これにより常に負の勾配だけを追いかけることができ、常には増大し続ける。これで必ず非負の最適なが存在することになる。次元において最急負勾配を探索するという操作は(8)式のように表せる。
(8)
以下、全ての可能な弱学習器回帰木に対してイテレートせずとも近似的に最小化できる戦略について示す。
-regularization
最適化における各ステップは固定されたステップサイズの分だけの1つの次元に対して増えるため、のL1ノルムは回のイテレーション後となる。これは言い換えると、のL1ノルムにペナルティを加えるということは回イテレーションでearly stoppingをかけるのと等価だということを意味する。そこで、以下の項は落とし、代わりに等価なハイパーパラメータとしてを導入する。
Gradient Decomposition
あるイテレーションにおいて最急勾配を見つけるためには、勾配を2つの要素に分解する必要がある。1つは損失関数に対するもの、もう1つはキャップつきL1ノルム罰則項に対するものである。
(9)
(ここで元の(7)式からは第2項後ろの絶対値記号を外してある:理由は簡単でとも非負であるため)
の勾配はなる点ではwell-definedではない。だがが減少することはないため、(10)式に見えるように右側極限値を取ることができる。
(10)
仮にそしてがステップサイズとすれば、は特徴量が過去のイテレーションで既にある木の中で使われている場合にのみ成り立つ。ここで特徴量がまだ使われていない場合に、そうでなければで表すとする。これを用いれば、(10)式のを場合分けせずに1つの勾配で表せる。
(11)
ただしとなるのは木から最初に特徴量が選択された時に限る。言い換えると、第2項は多くの新しい(過去に選択されていない)特徴量を使ってしまうような木に対して効果的にペナルティを与えるということでもある。
Greedy Tree construction
(11)式により、ようやくどの木に対しても勾配を計算できるようになった。ただし最適なを見つけるには依然として全ての木を探索するしかない。そこで、ここではその問題を既に定式化した損失関数を最小化させるベストの木を探索する問題への転換を目指す。これは古典的な決定木のCARTアルゴリズムで近似できる。
そのためには(11)式の第1項をchain ruleでその手の問題になるように別々の微分の積同士の関係にバラす必要がある。その結果が(12)式である。ただしはi番目の入力である。
(12)
ここでは全てののただの線形和で、全ての学習データに対する予測値であることに注意。よってである。仮に負の勾配を導入すれば、(12)式はさらに(13)式のように最定式化できる。
(13)
なおここではは正規化された木に限った(即ち)。この(13)式に2つの定数項、即ちを加えれば、以下の式が完成する。
(14)
これはまさにペナルティつき二乗損失そのもの、"impurity function"である。そしてその解は回帰木に対するgreedy CARTアルゴリズム(つまりxgboostの原型に当たるアルゴリズム)で効率的に導くことができる。(14)式の第1項は損失関数の負の勾配に最も合うように特徴量を分割し、第2項は過去のイテレーションで用いられた特徴量を切り分ける働きを担っている(筆者注:boostingとしての要素は第2項のが担っていて、過去に一度学習に使われた場合は以後使われないという操作を反映している)。以上のアルゴリズムを擬似コードに改めたものがAlgorithm 1である。
4.2 Structured Feature Selection
ここでは事前知識としてある程度のスパース性が特徴量に存在している場合にどうするかという話題がなされている(らしい)が、GBFSではその点にも対応できるという話がされている。この後のRESULTSパートに絡む話で言うと、事前に特徴量をある個数のbagにまとめられるケースに、できるだけ少ないbag(特徴量の特定のかたまり)のみで精度を出せるようにしたい、みたいな話への対応という話題。ということで詳細は面倒なので割愛。
5 RESULTS
検証に用いた環境はLinux 2.6.32.x86_64のオンプレのデスクトップで6コアIntel i7 (2.66 GHz)、96 GB RAMだそうです。
5.1 Synthetic data
これはもうFig.1を見たまんまで、こんな非線形のものを綺麗に分離するなんて非線形カーネルSVMでもないと無理では。。。というところをGBFSならできまぁす!というお話。
5.2 Structured feature selection
Princetonの"Colon"というデータセット(結腸がんのデータセット)に対して適用してみたもの。がん化した結腸が40サンプル、健常な結腸が22サンプルあって、6500のヒト遺伝子について測定がなされている。これは分子生物学的に9つのクラスタ(bag)に分けられるので、そのうちのどれが結腸がんにより強く関与するか?を特定したいという課題。そこでFig.2を見るとこれまた一目瞭然で、他の既存手法に比べてGBFSがずば抜けて綺麗に1つのbagに原因遺伝子を絞り込めているのが分かる。
5.3 Benchmark data sets
もう面倒なので図だけ貼っていく。詳細が気になる人は本文読んで下さい。
上記各データセットのholdoutに対するclassification error rates一覧。GBFS強いですねー。
Fig.4はKDD cup 1999でのデータに適応したもの。特徴量を絞り込めた上で尚且つerror rateを抑えられているのが分かる。Fig. 5はGBFSによって選んだ特長量でガウシアンカーネルSVMを学習させたらテストデータへのerror rateが一番低くなったよ的な主張。Fig.6はSMK-CAN-187という187行しかないのに19,993次元もあるデータに対するerror rateを見たもので、これもGBFSが良いスコアを叩き出しているのが見て取れる。
6,7,8 DISCUSSION etc.
果てしなく面倒なので全て割愛。興味のある人は本文が公開されているのでご自身でどぞー。ただ、ちょっと思ったのが「GBFSすげーって言ってもランダムフォレストで特徴量選択してもスコア大して変わらなくね?」。。。感想はご随意に。
9 Misc
DMLCのxgboostのGitHub見に行ったら、こんなissueが立ってました。tomtung commented on 19 Sep
as described in http://alicezheng.org/papers/gbfs.pdf
Basically it seems like: when measuring the goodness of a tree node split (for learning a regression tree), add a tunable constant penalty if the feature used for splitting hasn't been used by existing trees.
Seems quite simple, and can be a nice alternative for people who use feature importance to select features.
お前がやれよ、とか言われそうw
読後感など
正則化についてはちろっと以前もブログで書いたことがありますが、要はカーネル法で非線形化すると重くて嫌だからboostingでやりました(baggingでやるというとランダムフォレストが先にあるので)という話なのかなと。むしろそこが出発点で、途中の誤差関数の変形のところはそこを遡ってやってるみたいな印象を受けました。
ちなみに輪読会の席で出た疑問としては「結局をハイパーパラメータにしたのは筋悪では?」というもの。確かに、可能な全ての弱学習機回帰木のどこまでを網羅するかという範囲だけでコントロールするのは、やや面白くないかもという印象はあります。でも、かといってこれをどうしたらもっと綺麗になるかというとアイデアもなく。。。
そして、RESULTSのところを見ると予測精度面では結構ランダムフォレストの特徴量選択による結果とあんまり変わらない部分もあるというのがw とは言えColonデータでの特徴量選択のシャープさには見事なものがあると思ったので、やっぱりxgboostに実装してもらって普及させる方が狙いとしては重要になるのかも?ってところですかねぇ。。。