コンテンツにスキップ

アンサンブル・ハイパーパラメータ

キーワード:バギング、ブースティング、ブートストラップ、スタッキング、基本的なハイパーパラメータ調整、学習率、隠れ層の数(レイヤー層数)、ユニット数、ドロップアウトの割合、バッチサイズ、ハイパーパラメータの最適化、グリッドサーチ、ランダムサーチ、ベイズ最適化、ラベル平滑化

要点

  • アンサンブルは複数のモデルの予測を組み合わせて精度を上げる。バギング=並列に学習して平均(分散を減らす)、ブースティング=直列に学習して前の誤りを補う(バイアスを減らす)、スタッキング=予測を入力に別のモデルを学習。
  • 平均の効果は、モデル間の相関 \(\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\)。過信を抑える正則化。

参考