Adaboost

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

おすすめサイト

投稿者: 等々力 康弘

画像処理エンジニア。組み込みソフト出身。 株式会社モルフォにてR&D部門、主に機械学習業務に携わり、顔認識&顔検出のアルゴリズム開発に従事。国内特許数件、国際特許1件。 モルフォ社退社後、株式会社Dynaptico創業(CEO)。アメリカ人、スウェーデン人と3名とフードデリバリーサイトmaishoku.comを立ち上げる。社長業の他、開発業務においてバックグラウンド関連全般(Djangoを用いいたバックエンドサーバ&APIサーバーの作成、 リバースプロキシなどの負荷分散サーバ関連、OCRプログラムの作成、CISCOルータの管理, 、seleniumを用いたテストサーバーの構築、Androidアプリの開発等々)に携わる。 2019年DynapticoのCEOを辞職。 2020年2月にComputer Scienceに特化した株式会社OctOpt創業。 OSはUbuntu。Appleが苦手。Swiftのバージョンアップ対応とか死ぬほど嫌い。 Python/C++/C Twitter: @rocky_house シフト自動調整スケジュールサイトをVue.js+graphene djangoで構築. https://www.allshifter.com

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です