アンサンブル・ハイパーパラメータ¶
キーワード:バギング、ブースティング、ブートストラップ、スタッキング、基本的なハイパーパラメータ調整、学習率、隠れ層の数(レイヤー層数)、ユニット数、ドロップアウトの割合、バッチサイズ、ハイパーパラメータの最適化、グリッドサーチ、ランダムサーチ、ベイズ最適化、ラベル平滑化
要点
- アンサンブルは複数のモデルの予測を組み合わせて精度を上げる。バギング=並列に学習して平均(分散を減らす)、ブースティング=直列に学習して前の誤りを補う(バイアスを減らす)、スタッキング=予測を入力に別のモデルを学習。
- 平均の効果は、モデル間の相関 \(\rho\) が低いほど大きい。\(\rho=1\) なら何個束ねても分散は下がらない。
- ハイパーパラメータは学習前に人が決める値(学習率が最重要)。探索法はグリッド → ランダム → ベイズ最適化の順に効率が上がり、評価は必ず検証データで行う。
アンサンブル学習¶
- 複数のモデル \(f_1,\dots,f_M\) の出力を組み合わせて 1 つの予測にする。
- 回帰:平均 \(\bar{f}(\mathbf{x})=\tfrac1M\sum_m f_m(\mathbf{x})\)(重み付き平均も可)。
- 分類:多数決(ハード投票)、またはクラス確率の平均(ソフト投票)。確率を使うソフト投票のほうが情報が多い。
平均で分散が減る理由¶
各モデルの予測の分散が \(\sigma^2\)、モデル間の相関係数が \(\rho\) のとき、
\[
\mathrm{Var}\Bigl[\frac1M\sum_{m=1}^{M}f_m\Bigr]=\frac{1}{M^2}\Bigl(M\sigma^2+M(M-1)\rho\sigma^2\Bigr)=\rho\,\sigma^2+\frac{1-\rho}{M}\,\sigma^2
\]
- 検算:\(M=1\) で \(\sigma^2\)。\(\rho=0\)(独立)で \(\sigma^2/M\)。\(\rho=1\)(同じモデル)で \(\sigma^2\) のまま。
- 平均してもバイアスは変わらない。分散だけが下がる。モデルを多様にする(相関を下げる)ことが、個数を増やすより重要。
動かしてみる
- \(\rho=0\) にして \(M\) を増やすと、分散は \(1/M\) で下がり続けます。
- \(\rho=0.3\) では、\(M\) を 30 まで増やしても分散は 0.3 より下がりません(破線が下限 \(\rho\sigma^2\))。
- \(\rho=1\) では曲線が水平で、何個束ねても効果がありません。
バギング¶
- Bagging(Bootstrap Aggregating):訓練データからブートストラップ標本を \(M\) 個作り、それぞれでモデルを独立に(並列に)学習して、平均または多数決で結合する。
- ブートストラップ標本:元の \(n\) 個のデータから、重複を許して \(n\) 個を無作為に選んだもの。1 つのデータが 1 回の標本に一度も選ばれない確率は
\[
\Bigl(1-\frac1n\Bigr)^{n}\xrightarrow{\,n\to\infty\,}e^{-1}\approx0.368
\]
- したがって、各標本には元データの約 63.2 % が含まれる。選ばれなかった約 36.8 % は OOB(Out-Of-Bag)データとして、そのモデルの検証に使える(別に検証データを取り分けなくてもよい)。
- 少しのデータの違いで予測が大きく変わる、分散の大きい(不安定な)モデル(深い決定木など)に効く。
- ランダムフォレスト:バギングに加えて、分岐ごとに使う特徴をランダムに一部だけにして、木どうしの相関 \(\rho\) を下げたもの。→ 決定木・アンサンブル
ブースティング¶
- 直列に学習する。前のモデルが苦手だったデータを重視して次のモデルを学習し、弱学習器を足していく。バイアスの減少が主な効果(過学習しやすいので、学習率や木の深さを抑える)。
- AdaBoost(二値分類、\(y\in\{-1,+1\}\)):データの重み \(w_i\) を、間違えたデータほど大きくする。
\[
\varepsilon_m=\sum_i w_i\,\mathbb{1}[h_m(\mathbf{x}_i)\ne y_i],\qquad
\alpha_m=\frac12\ln\frac{1-\varepsilon_m}{\varepsilon_m},\qquad
w_i\leftarrow\frac{w_i\,e^{-\alpha_m y_i h_m(\mathbf{x}_i)}}{Z_m},\qquad
H(\mathbf{x})=\mathrm{sign}\Bigl(\sum_m\alpha_m h_m(\mathbf{x})\Bigr)
\]
- \(Z_m\):重みの和を 1 にするための正規化定数。誤り率 \(\varepsilon_m\) が小さいモデルほど \(\alpha_m\) が大きい。
- 勾配ブースティング:損失の負の勾配(二乗誤差なら残差)に次のモデルを当てはめて足す。
\[
F_m(\mathbf{x})=F_{m-1}(\mathbf{x})+\nu\,h_m(\mathbf{x}),\qquad h_m\approx-\frac{\partial L}{\partial F}\bigg|_{F_{m-1}}
\]
- \(\nu\):縮小率(学習率)。GBDT・XGBoost・LightGBM が代表。
スタッキング¶
- 複数の異なるモデル(レベル 0)の予測値を入力特徴として、別のモデル(メタ学習器、レベル 1)を学習する。
- レベル 0 の予測は、学習に使っていないデータ(クロスバリデーションの out-of-fold 予測)で作る。学習データそのものの予測を使うと、過学習した予測をメタ学習器が信じてしまう(リーク)。
- 多様な種類のモデルを組み合わせるとよい。
| バギング | ブースティング | スタッキング | |
|---|---|---|---|
| 学習の流れ | 並列(独立) | 直列(前の誤りを使う) | 2 段(予測 → メタ学習器) |
| 主に減らすもの | 分散 | バイアス | 両方(モデルの多様性) |
| データの扱い | ブートストラップ標本 | 誤りに応じた重み | out-of-fold 予測 |
| 例 | ランダムフォレスト | AdaBoost、GBDT | Kaggle などの多段モデル |
深層学習でのアンサンブル¶
- 初期値・データの順序を変えて別々に学習した複数のネットワークを平均する(単純だが、学習・推論の費用が \(M\) 倍)。
- スナップショットアンサンブル:学習率を周期的に上下させ、各周期の終わりのパラメータを集める(1 回の学習で複数のモデルが得られる)。
- ドロップアウトは、ユニットを落とした膨大な部分ネットワークの暗黙のアンサンブルとみなせる。推論時は全ユニットを使い、重みをスケールして近似的に平均をとる。→ 正則化
- 残差ネットワークは、様々な長さの経路の集まり(ショートカットを通る・通らない)を暗黙に束ねたものとも解釈できる。
- 推論時は入力を変換して複数回予測して平均する TTA(Test-Time Augmentation)。→ データ拡張
- 推論コストを下げたいときは、アンサンブル(教師)の出力を 1 つの小さなモデル(生徒)に写し取る蒸留を使う(温度付きソフトマックス。→ 活性化関数)。
ハイパーパラメータの選択¶
ハイパーパラメータは、学習前に人が決める値(学習で更新される重みやバイアスとは区別する)。汎化性能は、これとデータ分割で大きく変わる。
| ハイパーパラメータ | 目安・調整のしかた |
|---|---|
| 学習率 \(\eta\) | 最も重要。大きすぎると発散・振動、小さすぎると遅く、局所解に留まる。\(10^{-5}\sim10^{-1}\) を対数スケールで探す。Adam で \(10^{-3}\) 前後、SGD で \(10^{-2}\sim10^{-1}\) が出発点。学習の途中で下げるスケジュールも使う |
| 隠れ層の数・ユニット数 | 増やすと表現力は上がるが、過学習・計算量が増える。まず小さく始めて、訓練誤差が下がらなければ増やす |
| ドロップアウトの割合 | 全結合層で 0.5、畳み込み層や Transformer で 0.1 前後が目安。大きすぎると学習不足 |
| バッチサイズ | 大きいと勾配が安定して並列化しやすいが、メモリを使い、汎化が悪化することがある。変えるときは学習率も合わせる(バッチを \(k\) 倍にしたら学習率も約 \(k\) 倍、が出発点:線形スケーリング則) |
| 正則化の強さ(重み減衰 \(\lambda\) など) | \(10^{-5}\sim10^{-2}\) を対数スケールで探す |
| エポック数 | 検証誤差が上がり始めたら止める(早期終了) |
| 最適化手法の係数(Momentum の \(\beta\)、Adam の \(\beta_1,\beta_2\) など) | 既定値のまま使うことが多い。→ 最適化 |
探索の方法¶
| 手法 | 方法 | 特徴 |
|---|---|---|
| グリッドサーチ | 各パラメータの候補を決め、全組合せを試す | 網羅的だが、パラメータが増えると組合せが指数的に増える |
| ランダムサーチ | 範囲から無作為に組合せを選んで試す | 同じ試行回数で、各パラメータがより多くの異なる値を試せる |
| ベイズ最適化 | 過去の結果から性能の予測モデルを作り、有望な点を選んで試す | 1 回の評価が重いとき(深層学習)に少ない試行で済む |
| Hyperband(早期打ち切り) | 多数の設定を短い学習で試し、悪いものを打ち切って、残りに予算を回す | 試行数が多くても計算が減る |
- ランダムサーチがグリッドに勝つ理由:多くの問題では、効くパラメータが少数(学習率など)。\(M\) 回試すとき、2 パラメータのグリッドは各パラメータで \(\sqrt{M}\) 個の値しか試せないが、ランダムなら \(M\) 個の異なる値を試せる。
- ベイズ最適化:目的(検証性能)を代理モデル(ガウス過程など)で近似し、獲得関数が最大の点を次に評価する。獲得関数の例が期待改善量(EI)。現時点の最良値を \(f^{+}\)、代理モデルの予測を平均 \(\mu(\mathbf{x})\)・標準偏差 \(s(\mathbf{x})\) として(最大化の場合)、
\[
\mathrm{EI}(\mathbf{x})=\mathbb{E}\bigl[\max(0,\ f(\mathbf{x})-f^{+})\bigr]=(\mu-f^{+})\,\Phi(z)+s\,\phi(z),\qquad z=\frac{\mu-f^{+}}{s}
\]
- EI は、\(\mu\) が大きい点(活用)と \(s\) が大きい点(探索)の両方で大きくなる。\(\Phi,\phi\):標準正規分布の累積分布関数と密度関数。→ ガウス過程
進め方の注意¶
- 評価は検証データで行い、テストデータは最後の 1 回だけ使う(テストで選ぶと楽観的な性能になる)。データが少ないときはクロスバリデーション。→ 評価
- 学習率や \(\lambda\) は対数スケールで探す。最初は粗い範囲で短く学習し、有望な範囲を絞って細かく探す(粗から密へ)。
- 結果は乱数(初期値・データ順)でぶれるので、差が小さいときは複数回試して比べる。
- 先に少量のデータで過学習できるかを確かめると、モデルや実装の不具合に気づける。
ラベル平滑化¶
正解ラベルの one-hot を少しなだらかにして、出力が過信(確率 1 に張り付くこと)になるのを防ぐ正則化。\(K\) クラス、平滑化の量 \(\epsilon\)(例 0.1)として、
\[
t_k^{\mathrm{LS}}=(1-\epsilon)\,t_k+\frac{\epsilon}{K},\qquad
L=-\sum_{k=1}^{K}t_k^{\mathrm{LS}}\log y_k=(1-\epsilon)\Bigl(-\sum_k t_k\log y_k\Bigr)+\epsilon\Bigl(-\frac1K\sum_k\log y_k\Bigr)
\]
- 正解クラスの目標が \(1-\epsilon+\epsilon/K\)、他のクラスが \(\epsilon/K\) になる(例:\(K=4,\ \epsilon=0.1\) なら \(0.925\) と \(0.025\)。和は 1)。
- 損失は、通常の交差エントロピーと、一様分布との交差エントロピーの重み付き和になる。正解のロジットを無限に大きくする必要がなくなる。
- 誤差を \(\epsilon\) だけ他クラスに均等配分する別の書き方(正解 \(1-\epsilon\)、他の \(K-1\) クラスに \(\epsilon/(K-1)\) ずつ)もあり、\(\epsilon\) の意味がわずかに違う。
- Inception-v3、Transformer(\(\epsilon=0.1\))で使われる。→ Transformer
- 損失関数としての詳しい扱い(流儀 (a)(b) の比較)は 多層パーセプトロン・出力層と損失関数、損失関数まとめ。
試験の着眼点¶
- バギング=ブートストラップ標本 × 並列 × 平均/多数決で分散を減らす。ブースティング=逐次に誤りを重視してバイアスを減らす。スタッキング=予測値を入力にしたメタ学習器。
- ブートストラップ標本に選ばれない確率は \((1-1/n)^n\to e^{-1}\approx0.368\)。これが OOB データ。
- 平均の分散は \(\rho\sigma^2+(1-\rho)\sigma^2/M\)。相関が高いと個数を増やしても効かない。
- ランダムフォレスト=バギング+特徴のランダム選択。GBDT=負の勾配に当てはめる逐次加算。
- ハイパーパラメータは学習前に決める値(重みは学習で更新される)。最重要は学習率で、対数スケールで探す。
- 探索:グリッド(組合せが指数的に増える)、ランダム(同じ試行回数で、グリッドより多くの値を試せる)、ベイズ最適化(代理モデルと獲得関数)。
- ハイパーパラメータの調整には検証データを使い、テストデータは使わない。
- ラベル平滑化:\(t^{\mathrm{LS}}=(1-\epsilon)t+\epsilon/K\)。過信を抑える正則化。
参考¶
- Random Search for Hyper-Parameter Optimization(Bergstra, Bengio, 2012)
- Practical Bayesian Optimization of Machine Learning Algorithms(Snoek ほか, 2012)
- Hyperband: A Novel Bandit-Based Approach to Hyperparameter Optimization(Li ほか, 2016)
- Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour(Goyal ほか, 2017)
- Rethinking the Inception Architecture for Computer Vision(Szegedy ほか, 2015)