2025年8月25日月曜日

GBDT 二値分類の勾配計算例

前提条件

  • ラベル \( y_i \in \{0,1\} \)
  • モデルのスコア(ロジット値)を \( F_i \) とし、予測確率はシグモイド関数で変換:
\[ p_i = \sigma(F_i) = \frac{1}{1 + e^{-F_i}} \]
  • 損失関数(Log Loss):
  • \[ L(y_i, p_i) = -[ y_i \log p_i + (1-y_i) \log (1-p_i) ] \]


損失関数の微分(勾配)

損失関数の勾配 \( g_i \) は L を \( F_i \) で微分して求める。チェーンルールを使うと、

\[ \frac{\partial L}{\partial F_i} = \frac{\partial L}{\partial p_i} \cdot \frac{\partial p_i}{\partial F_i} \]

各項は、

\[ \frac{\partial L}{\partial p_i} = -\frac{y_i}{p_i} + \frac{1-y_i}{1-p_i} \] \[ \frac{\partial p_i}{\partial F_i} = p_i (1 - p_i) \]

よって、

\[ \begin{align*} g_i & = \frac{\partial L(y_i, F_i)}{\partial F_i} \\ & = \left( -\frac{y_i}{p_i} + \frac{1-y_i}{1-p_i} \right) \cdot p_i (1 - p_i) \\ & = -y_i (1 - p_i) + (1 - y_i) p_i \\ & = p_i - y_i \end{align*} \]

つまり、勾配 \( g_i \) は「予測確率と正解ラベルの差」となる。
この勾配の負号(\(-g_i\))が疑似残差として使われ、回帰木の目的変数となる。


直観的解釈

ロジット値 \( F \) はシグモイド関数を通して確率 \( p \) に変換される。
\( F \) を正方向に増やすと予測確率 \( p \) も1に近付く。逆に、\( F \) を負方向に増やすと0に近付く。

  • F = 2 → p ≈ 0.88
  • F = 0 → p = 0.5
  • F = -2 → p ≈ 0.12

「\( p - y \)」という勾配が、「今のモデル予測\( p \)が正解\( y \)より高いか低いか」を表し、Fの上げ下げ・量を直接教えてくれる量となる。

  • p = 0.9, y = 1 → g = -0.1(h=0.1)
  • p = 0.1, y = 0 → g = +0.1(h=-0.1)

\( p < y \) なら「Fを上げる」ことで予測確率も上げる
\( p > y \) なら「Fを下げる」ことで予測確率も下げる

______________________________________________________________

計算例:5データ点による勾配ブースティング(2値分類)

前提条件
  • 入力 \( x_1 \sim x_5 \),ラベル \( y_1 \sim y_5 \)
  • \( y = [1, 0, 1, 0, 1] \)
  • 初期ロジット値 \( F_i^{(0)} = 0 \) (全データ)
  • 学習率 \( \eta = 0.1 \) (計算簡単化のため)
Step 1. 初期化
初期ロジット値
\( F_i^{(0)} = 0 \) (i=1〜5)
初期予測確率
\[ p_i^{(0)} = \sigma(F_i^{(0)}) = \frac{1}{1 + e^{0}} = 0.5 \] 
Step 2. 勾配および疑似残差の計算

i \( y_i \) \( p_i^{(0)} \) \( g_i^{(0)} \) 疑似残差
\( -g_i^{(0)} \)
110.5-0.5+0.5
200.5+0.5-0.5
310.5-0.5+0.5
400.5+0.5-0.5
510.5-0.5+0.5

Step 3. 疑似残差を目的変数に回帰木(弱学習器)学習
  • 単純化して、\( y=1 \) のデータには \( h(x)=+0.5 \)、\( y=0 \) のデータには \( h(x)=-0.5 \) を出力する回帰木を仮定(本来は特徴量で分岐)。

Step 4. モデルの更新
\[ F_i^{(1)} = F_i^{(0)} + \eta h_i^{(0)} \]  
i \( h_i^{(0)} \) \( F_i^{(0)} \) \( F_i^{(1)} \)
1+0.500.05
2-0.50-0.05
3+0.500.05
4-0.50-0.05
5+0.500.05

Step 5. 新しい確率 
\[ p_i^{(1)} = \sigma(F_i^{(1)}) = \frac{1}{1 + e^{-F_i^{(1)}}} \] 
  • \( F = 0.05 \) → \( p \approx 0.5125 \)
  • \( F = -0.05 \) → \( p \approx 0.4875 \)

i \( F_i^{(1)} \) \( p_i^{(1)} \)
10.050.5125
2-0.050.4875
30.050.5125
4-0.050.4875
50.050.5125

Step 6. 新しい疑似残差 
\[ g_i^{(1)} = p_i^{(1)} - y_i \]  
i \( y_i \) \( p_i^{(1)} \) \( g_i^{(1)} \) 疑似残差
110.5125-0.4875+0.4875
200.4875+0.4875-0.4875
310.5125-0.4875+0.4875
400.4875+0.4875-0.4875
510.5125-0.4875+0.4875

Step 7. (以降のステップも同様)
  • この新しい疑似残差を目的変数として、再度回帰木(弱学習器)を学習しロジット値を更新。
\[F_i^{(2)} = F_i^{(1)} + \eta h_i^{(1)}\]
  • \(h_i^{(1)} = +0.4875\)(y=1のデータ)、\(-0.4875\)(y=0のデータ) 

i \( h_i^{(1)} \) \( F_i^{(1)} \) \( F_i^{(2)} \)
1+0.48750.050.09875
2-0.4875-0.05-0.09875
3+0.48750.050.09875
4-0.4875-0.05-0.09875
5+0.48750.050.09875

Step 8. 新しい確率の算出
  • \( F = 0.09875 \) の場合:\( p = \frac{1}{1+e^{-0.09875}} \approx 0.5247 \)
  • \( F = -0.09875 \) の場合:\( p = \frac{1}{1+e^{0.09875}} \approx 0.4753 \)

この流れを何度も繰り返すことで、予測確率 p が徐々に正解ラベルに近付く。
学習率が小さいほど、各ステップの修正は少なくなり安定するが、収束には時間がかかる。

0 件のコメント:

コメントを投稿