Adaboostは「弱い識別をくり返して、強い識別器を作る」事を目標とた学習アルゴリズムです。
やりたいことは単純で、以下のような関数をつくりたいのです。
f(x) = \sum w_t * eval_t( 特徴量 ) |ここで t は 1..T上記式は、ある特徴を評価関数(eval関数)に突っ込み、重み(w)かけ、それを複数回足しあわせた線形和を求めるを表現しています。結果が1に近ければ正解、0に近ければ不正解となります。上記のステップtは、よく論文で1..Tとの表現されてます。このラージTの値は自由に決まります。例えば「識別精度が95%超えたらやめる」というようにしておき、10回目で超えたに96%になったとします。この場合、Tは10となります。
AdaBoostの目標は、各ステップ毎の「w_t」 と「eval_t()」を算出することです。
Adaboost 学習具体例
まずD1を定義します。
D_1 = \frac{1}{ m}まだ、Dの存在が何かわからないと思いますが、とりあえず今は気にせず前へ進みます。D2, D3, D4 .. DTと次々と求めていく作業がAdaboostの学習作業となります。D2以下は以下のように表されます。
D_2 = \frac{D_1 * exp( -w_1 * y_i * eval_1( 学習画像_i )}{2}上記を学習する画像分回します(iがその画像枚数分存在します)。yはPosかNegかのフラグです。Posであれば1, Negであれば-1となっています。ここでw_1が出てきています。これは、以下のように表されます
w_1 =\frac{\frac{log( 1 - ε_1)}{ ε_1}}{2}ε_1は以下のように表されます。
ε_1=\sum D_1 * EVAL( eval_1( 学習画像i ) != y_i )
上記式において評価関数が決定されます。なお決定した評価関数(eval_1)はDを求めるときに用いている関数と全く同じです。評価関数は、「学習画像をいれて、正解と一致しているかどうか」を返す事を目的としています。そんな関数は、誰もわかりません。最適な評価関数を決定するためにはGreedy,つまり全探索が行われています。通常、Adaboostの学習は非常に時間がかかりますが、その理由は表関数の決定に膨大な時間がかかるためです。
全探索の結果、εが最小となるような評価関数を決定します。これが全体の流れです。評価関数が決まり、エラーがわかったため、重みが決定することができます。重みと評価関数が決まったため、D2が算出されます。あとはD3でも同じようにくり返していけば結果を得ることができます。
カスケード接続について
Adaboostではよくカスケード接続が用いられます。カスケード接続とは、Adaboostで得た学習を多段の串のように接続して構成していくことです。
一回の学習で99%と目標まで学習を進めていくのではなく、60%程度で学習を打ち止めをします。
そして、またAdaboostで識別機を作ります。これも60%の精度で止めていき…を繰り返し、識別器を団子のように串刺しで横に並べます。コレがカスケード接続です。尚、次の識別器には、通過してしまった40%の失敗データ+新しいデータセットでまた学習をし直していきます。
後段のカスケードの学習はどんどん難しくなっていきます。顔検出などではこうした構造が用いられています。
参考文献
https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0