10.4 指数損失とAdaBoost

神秘の公式はどこから来たのか

AdaBoostには、いくつかの「謎の公式」があります。 なぜ信頼度はlog((1-err)/err)なのか?なぜ重みは指数関数で更新するのか? 実は、これらすべてが「たった1本の数式を最小化する」という操作から自然に流れ落ちます。 その数式こそが「指数損失」です。

「なぜ?」が積み重なる公式群

前の章で、AdaBoost.M1のアルゴリズムを学びました。一言で言えば、

「間違えたデータを目立たせ、その目立つデータを次の弱学習器に重点的に学ばせる。 それを何度も繰り返して多数決を取る」

というアルゴリズムです。手順は単純で、重みを増やしては弱学習器を学習させ、それを重ね合わせるだけ。

しかし、よく見るといくつもの「なぜ?」が浮かびます。

疑問1: 信頼度の式

$$\alpha_m = \log\frac{1 - \text{err}_m}{\text{err}_m}$$

なぜ対数が出てくるのか?なぜこの形なのか?

疑問2: 重み更新の式

$$w_i \leftarrow w_i \cdot \exp(\alpha_m \cdot I(y_i \neq G_m(x_i)))$$

なぜ「指数関数」を使うのか?線形に増やしてはダメなのか?

疑問3: 最終予測の式

$$G(x) = \text{sign}\left(\sum_m \alpha_m G_m(x)\right)$$

なぜ加重「多数決」なのか?

3つの謎の公式が1つの指数損失に収束するアニメーション
3つの公式すべてが、たった1本の式から自然に導かれる

AdaBoostを最初に提案したFreundとSchapireは、これらをPAC学習理論という別の動機から導きました。 式が綺麗に出るのは「偶然」のようにも見えます。

ところがFriedmanらは2000年、こう言ったのです:

「これらの公式はすべて、たった一つの『目的関数』を最適化した結果として自然に出てくる」

その「目的関数」が、これから紹介する 指数損失(exponential loss) です。

指数損失 — 「外れたら大爆発」の罰金

まず、これから主役になる「指数損失」を見ましょう。

二値分類問題で、ラベル $y \in \{-1, +1\}$ と 予測スコア $f(x) \in \mathbb{R}$(実数値)を考えます。

ここで重要:$f(x)$$\{-1, +1\}$ そのものではなく、実数値の「信頼度スコア」です。 「$f(x)$ が正で大きいほど『クラス $+1$ だ』と強く主張」 「負で大きいほど『クラス $-1$ だ』と強く主張」という具合。 最終的な分類予測は $\text{sign}(f(x))$ で決めるので、符号だけが分類結果になります。

このとき、指数損失は次の単純な形をしています:

$$L(y, f(x)) = \exp(-y \cdot f(x))$$

たったこれだけです。

ここで重要な量が マージン $y \cdot f(x)$

指数損失は、このマージンに対して指数的に減少・増加します。 マージンが大きい正の値では損失はゼロに急速に近づき(罰金ゼロ)、 マージンが負の方向では損失は爆発的に増加します(重い罰金)。

つまり指数損失は「間違えた時にとんでもなく重い罰金を課す」損失関数です。 これは「自信を持って間違える」ことを極端に嫌います。

指数損失曲線とマージンの関係を示すアニメーション
横軸はマージン yf(x)、縦軸は損失。誤分類領域(左)で損失が爆発的に増加する

なぜこの形が嬉しいのでしょうか?理由は2つあります:

  1. 計算が綺麗:指数関数の積は和になるので、 後で重みが綺麗に分解できます(これが後の導出の核心です)
  2. 滑らか:階段関数(0-1損失)と違って微分可能なので、最適化に使えます

指数損失の定義をもう一度確認しましょう:

$$L(y, f(x)) = \exp(-y \cdot f(x))$$

この式が言っているのは「マージン $yf(x)$ が大きいほど損失は小さく、 負ならば爆発的に大きくなる」ということ。 極端な誤分類を強く罰する設計です。

舞台設定 — 前向き段階的加法モデリングを当てはめる

さて、いよいよ謎を解いていきましょう。

私たちが作ろうとしているのは、複数の弱学習器の重み付き和:

$$f(x) = \sum_{m=1}^M \beta_m G_m(x)$$

ここで $G_m(x) \in \{-1, +1\}$ は弱分類器、$\beta_m$ はその係数です。

これを一気に最適化するのは難しいので、前向き段階的加法モデリングという戦略を取ります:

「一段ずつ、$(\beta_m, G_m)$ を貪欲に追加する。一度追加したものは絶対に変更しない

ここが重要です。第 $m$ ステップに来た時点で、 既に決まっている

$$f_{m-1}(x) = \beta_1 G_1(x) + \beta_2 G_2(x) + \cdots + \beta_{m-1} G_{m-1}(x)$$

凍結された確定値として扱います。 私たちが選ぶのは次の1段 $(\beta_m, G_m)$ だけ。

その選び方は単純で、指数損失の総和を最小化するだけ:

$$(\beta_m, G_m) = \arg\min_{\beta, G} \sum_{i=1}^N \exp\left[-y_i \big(f_{m-1}(x_i) + \beta G(x_i)\big)\right]$$

ここで決定的な観察があります。指数の中の$-y_i f_{m-1}(x_i)$ は確定済みなので、 各データ点ごとに「もう値が決まっている定数」です。$\beta$$G$ には依存しません。

そこで、指数法則 $e^{a+b} = e^a \cdot e^b$ を使って、 指数を分解します:

$$\exp\left[-y_i f_{m-1}(x_i) - y_i \beta G(x_i)\right] = \underbrace{\exp(-y_i f_{m-1}(x_i))}_{w_i^{(m)}} \cdot \exp(-y_i \beta G(x_i))$$

第1項を $w_i^{(m)}$ とおくことで、 式が一気にシンプルになります。

$$(\beta_m, G_m) = \arg\min_{\beta, G} \sum_{i=1}^N w_i^{(m)} \exp(-\beta y_i G(x_i))$$
指数の分解から重みが出現するアニメーション
指数法則 e^(a+b) = e^a · e^b を使うと、過去の項が「重み」として分離される

ここに 重み $w_i^{(m)}$ が自然に登場したのです!

これは天才的な仕組みです。$w_i^{(m)}$ は「これまでの予測 $f_{m-1}(x_i)$$i$ 番目のデータがどれだけ外れているか」を測る量であり、 これまで誤分類されてきたデータほど $w_i^{(m)}$ は大きくなります。 次の弱学習器は、自動的にそれらに重点を置いて学習するわけです。

「重み」という概念は後付けで導入されたのではなく、指数損失の構造から必然的に湧き出てきたものなのです。

ステップ $m$ で解くべき問題をまとめると:

$$(\beta_m, G_m) = \arg\min_{\beta, G} \sum_{i=1}^N w_i^{(m)} \exp(-\beta y_i G(x_i))$$

ここで $w_i^{(m)} = \exp(-y_i f_{m-1}(x_i))$。 この $w_i^{(m)}$ は「これまでの累積誤差の重み」を表しており、$\beta$$G$ には依存しません—— つまり最適化の前から既に決まっている定数です。

第1幕 — 弱学習器の最適な選び方

これで舞台は整いました。次に、目的関数を2段階で攻略します。

第1段階:$\beta > 0$ を固定したとき、 最適な $G_m$ は何か?」

$y_i G(x_i) \in \{-1, +1\}$ という性質を使うと、 目的関数は次のように分解できます:

$$\sum_{i=1}^N w_i^{(m)} \exp(-\beta y_i G(x_i)) = e^{-\beta} \sum_{y_i = G(x_i)} w_i^{(m)} + e^{\beta} \sum_{y_i \neq G(x_i)} w_i^{(m)}$$

つまり「正解した側」には $e^{-\beta}$(小さい数)が掛かり、 「誤分類した側」には $e^{\beta}$(大きい数)が掛かります。

ここでさらに式変形すると:

$$\big(e^{\beta} - e^{-\beta}\big) \sum_{i=1}^N w_i^{(m)} I(y_i \neq G(x_i)) + e^{-\beta} \sum_{i=1}^N w_i^{(m)}$$

第2項 $e^{-\beta} \sum_i w_i^{(m)}$$G$ に依存しない定数。 第1項の係数 $(e^{\beta} - e^{-\beta})$$\beta > 0$ の下で正。

したがって、目的関数を最小化する $G$「重み付き誤分類数を最小化する分類器」に他なりません:

$$G_m = \arg\min_G \sum_{i=1}^N w_i^{(m)} I(y_i \neq G(x_i))$$

ここで重要なポイント:重み $w_i^{(m)}$ は固定弱学習器は 「今の重み付きデータで、最も良い分類器」を選ぶだけです。 これがAdaBoostの「ステップ(a)」と完全に一致します。

重み付きデータに対して最適な決定株を選ぶアニメーション
点の大きさが重みを表す。決定境界を左右にスライドさせ、加重誤差が最小になる位置を探す

第1ステップで得られる最適弱学習器:

$$G_m = \arg\min_G \sum_{i=1}^N w_i^{(m)} I(y_i \neq G(x_i))$$

これは「現在の重み $w_i^{(m)}$ の下での加重誤分類数を最小化する分類器」。AdaBoostの手順そのものです。

第2幕 — 係数の最適な値

弱学習器 $G_m$ が決まったので、 次は最後の謎、係数 $\beta_m$ の決定です。

目的関数を $\beta$ について微分してゼロと置きます。 先ほどの分解式:

$$J(\beta) = (e^{\beta} - e^{-\beta}) \sum_i w_i^{(m)} I(y_i \neq G_m(x_i)) + e^{-\beta} \sum_i w_i^{(m)}$$

ここで加重誤差率を導入します:

$$\text{err}_m = \frac{\sum_i w_i^{(m)} I(y_i \neq G_m(x_i))}{\sum_i w_i^{(m)}}$$

これは「重み付き全体の中で誤分類が占める比率」。$\sum_i w_i^{(m)} = W$ と書くと:

$$J(\beta) = W \cdot \left[(e^{\beta} - e^{-\beta}) \cdot \text{err}_m + e^{-\beta}\right]$$

これを $\beta$ で微分してゼロと置くと、$\frac{d}{d\beta}(e^\beta - e^{-\beta}) = e^\beta + e^{-\beta}$$\frac{d}{d\beta} e^{-\beta} = -e^{-\beta}$ を使って:

$$\frac{dJ}{d\beta} = W \cdot \left[(e^{\beta} + e^{-\beta}) \cdot \text{err}_m - e^{-\beta}\right] = 0$$

ここから、$W > 0$ なのでカッコの中身がゼロ、 両辺を $e^{-\beta}$ で割ると:

$$(e^{2\beta} + 1) \cdot \text{err}_m = 1$$

整理して:

$$e^{2\beta} \cdot \text{err}_m = 1 - \text{err}_m \quad \Longleftrightarrow \quad e^{2\beta} = \frac{1 - \text{err}_m}{\text{err}_m}$$

両辺の対数を取って2で割ると、ついに——

$$\beta_m = \frac{1}{2} \log\frac{1 - \text{err}_m}{\text{err}_m}$$

これがAdaBoostにおける $\alpha_m$正体です。 厳密に言うと、$\alpha_m = 2 \beta_m$ という関係です。 表記の慣習の違いで中身は全く同じものを別の縮尺で測っているだけです。

目的関数J(β)の最小化を示すアニメーション
U字型の損失曲線 J(β)の最小点が β_m = (1/2)log((1-err)/err) に位置する

この $\beta_m$ の形には深い意味があります:

つまり、信頼度は誤差率に応じて自動的にスケーリングされるのです。

第2ステップで得られる最適係数:

$$\beta_m = \frac{1}{2} \log\frac{1 - \text{err}_m}{\text{err}_m}, \quad \text{ただし} \quad \text{err}_m = \frac{\sum_i w_i^{(m)} I(y_i \neq G_m(x_i))}{\sum_i w_i^{(m)}}$$

誤差率 $\text{err}_m$ が小さいほど $\beta_m$ は大きくなり、 その弱学習器に強い発言権が与えられます。

大団円 — 重み更新の自動生成

最後のピースです。$\beta_m$$G_m$ が決まったので、モデルを更新します:

$$f_m(x) = f_{m-1}(x) + \beta_m G_m(x)$$

すると次のステップの重み$w_i^{(m+1)} = \exp(-y_i f_m(x_i))$ は:

$$w_i^{(m+1)} = \exp(-y_i f_{m-1}(x_i)) \cdot \exp(-\beta_m y_i G_m(x_i)) = w_i^{(m)} \cdot \exp(-\beta_m y_i G_m(x_i))$$

ここで $y_i, G_m(x_i) \in \{-1, +1\}$ なので、$y_i G_m(x_i)$ は「正解なら $+1$、 誤分類なら $-1$」という値を取ります。 場合分けして表にしてみると:

状況$y_i G_m(x_i)$$-y_i G_m(x_i)$$I(y_i \neq G_m(x_i))$$2I(\cdot) - 1$
正解$+1$$-1$$0$$-1$
誤分類$-1$$+1$$1$$+1$

$-y_i G_m(x_i)$」と「$2I(y_i \neq G_m(x_i)) - 1$」 の列が完全に一致していることに注目してください。つまり:

$$-y_i G_m(x_i) = 2 \cdot I(y_i \neq G_m(x_i)) - 1$$

代入して整理すると:

$$w_i^{(m+1)} = w_i^{(m)} \cdot \exp(\alpha_m \cdot I(y_i \neq G_m(x_i))) \cdot e^{-\beta_m}$$

ここで $\alpha_m = 2 \beta_m = \log\frac{1-\text{err}_m}{\text{err}_m}$ です。 最後の因子 $e^{-\beta_m}$すべての重みを同じ値で掛け算するだけ。 比率には影響しないので最適化に対しても無関係です(あるいはAdaBoostの正規化ステップに吸収されます)。

これで本質的に得られる更新規則は:

$$w_i^{(m+1)} = w_i^{(m)} \cdot \exp(\alpha_m \cdot I(y_i \neq G_m(x_i)))$$

完全にAdaBoost.M1の更新規則そのものです。

指数の式変形からAdaBoostの重み更新式が現れるアニメーション
数式変形(上)と散布図での重み変化(下)を同時に確認できる

つまり——

AdaBoostとは、指数損失を貪欲に最小化する前向き段階的加法モデルそのものだった。

「謎の公式」だったすべてが、たった1本の数式

$$L(y, f(x)) = \exp(-y f(x))$$

から自動的に流れ落ちる。これがFriedmanらの発見した美しさです。

最終的な重み更新規則:

$$w_i^{(m+1)} = w_i^{(m)} \cdot \exp\big(\alpha_m \cdot I(y_i \neq G_m(x_i))\big), \quad \alpha_m = 2\beta_m = \log\frac{1-\text{err}_m}{\text{err}_m}$$

これがAdaBoost.M1のアルゴリズムにおける重み更新ステップ(ステップ2(d))と一致します。

振り返り — なぜこの発見が重要なのか

ここまでで、AdaBoostが「指数損失の貪欲最小化」と等価であることを示しました。 これは単なる数学的な好奇心の話ではありません。

意味1: AdaBoostに「統計的な顔」が与えられた

それまでAdaBoostは「学習理論」の中で論じられていました。指数損失との等価性が見つかったことで、 「これは関数空間における勾配降下である」「指数損失の母集団最小化解は対数オッズである」 といった、統計学的な解釈が可能になりました。

意味2: 一般化への扉が開いた

「指数損失」を「他の損失関数」に取り換えれば、別のブースティングアルゴリズムが作れる—— これがLogitBoost(二項対数尤度)やL2Boost(二乗誤差)、さらに勾配ブースティングへと発展していく原動力になりました。

意味3: 弱点も見えた

指数損失はマージンが負に大きくなると爆発的に増加します。 これは「外れ値」や「ラベルノイズ」に脆弱だということです。 次のセクション(10.5、10.6)では、この問題と、よりロバストな損失関数の話に進みます。

ブースティング反復数に対する指数損失と誤分類率の推移
誤分類率が0になっても指数損失はまだ下がり続ける。AdaBoostは「自信を持って正解すること」を追求している

下のグラフで注目してほしいのは:誤分類率が0になっても、指数損失はまだ下がり続けるという点です。 AdaBoostは単に「誤分類数」を減らしているのではなく、「自信を持って正解する」ことを追求しているのです。

訓練データ上の指数損失の平均:

$$\frac{1}{N} \sum_{i=1}^N \exp(-y_i f_m(x_i))$$

これが反復 $m$ につれて単調に減少する—— AdaBoostは「指数損失の貪欲降下法」だからこそ、この単調性が保証されます。 誤分類率が0になっても、各データ点のマージンを増やすことで指数損失はさらに下げられます。

まとめ — AdaBoostの4つの公式の起源

このページで明らかになったのは、次の一文で要約できます:

AdaBoost.M1は、指数損失 $L(y, f(x)) = e^{-yf(x)}$ を最小化する 前向き段階的加法モデルそのものである。
AdaBoostの公式起源
重み $w_i^{(m)} = e^{-y_i f_{m-1}(x_i)}$指数の積の分解
弱学習器選択 = 加重誤差最小化$\beta$ 固定で $G$ について最適化
$\alpha_m = \log\frac{1-\text{err}_m}{\text{err}_m}$$G$ 固定で $\beta$ について微分=0
重み更新 $w_i \leftarrow w_i e^{\alpha_m I(\text{誤})}$指数の積から自然に出る

「天才の閃き」と見えていたものが、実は 「シンプルな目的関数 + 貪欲最適化」という枠組みに過ぎなかった—— この発見こそが、その後のブースティング研究を爆発的に進めた原動力です。

次のセクション(10.5)では、「なぜ指数損失を使うのか?」という根源的な問いに進みます。 指数損失を最小化することは、実は 対数オッズ比 $\frac{1}{2}\log\frac{P(Y=1|x)}{P(Y=-1|x)}$ を推定することと等価—— これがAdaBoostに「確率モデル」としての解釈を与えてくれます。