← 機械学習テキスト 一覧

🎓 レベル:標準 | 重要度:B(標準)

📎 前提:訓練・検証・テストと交差検証(探索は検証データで評価する)

要点(BLUF)

1. ハイパーパラメータとは — 「学習で決まらない」つまみ

機械学習には2種類の量があります。

パラメータハイパーパラメータ
モデルの重み(θ,w,b\theta, w, b など)モデル/学習の設定(学習率・λ\lambda・木の深さ・kk
誰が決めるデータから学習(勾配降下・正規方程式)学習の外側で人/探索が指定
いつ決まる訓練中訓練を始める前
線形回帰の係数リッジの正則化強度 λ\lambda、SGD の学習率 η\eta、決定木の最大深さ、k-NN の kk

要するに:パラメータは「損失を最小化して自動で求まる」中身、ハイパーパラメータは「損失最小化の条件そのものを決める外側のつまみ」です。λ\lambda を学習で決めようとすると「正則化を消した(λ=0\lambda=0)方が訓練損失は必ず下がる」ので、訓練データだけでは決められない——だから検証データで別建てに選ぶ必要があります。

2. 最適化問題としての定式化

ハイパーパラメータの組を λ\boldsymbol{\lambda}(学習率・λ\lambda・深さ…をまとめたベクトル)とします。各 λ\boldsymbol{\lambda} に対して、その設定でモデルを訓練し直し、検証性能を測る関数

λ\*=argmaxλΛ  f(λ),f(λ)=(その設定で訓練したモデルの検証スコア)\boldsymbol{\lambda}^\* = \arg\max_{\boldsymbol{\lambda}\in\Lambda}\; f(\boldsymbol{\lambda}),\qquad f(\boldsymbol{\lambda}) = \text{(その設定で訓練したモデルの検証スコア)}

を最大化したい、というのが HPO です。ここで ff には厄介な性質があります。

要するに:HPO は「勾配なし・評価が高価・少しノイズあり」のブラックボックス最大化。だから「いかに少ない試行で良い λ\boldsymbol{\lambda} に当てるか」が勝負になります。

3. 評価の作法 — 交差検証で測り、テストは触らない

f(λ)f(\boldsymbol{\lambda}) の「検証スコア」は、原則交差検証で測ります(訓練・検証・テストと交差検証)。単一の検証分割だと、たまたまの分割運でスコアが揺れて、運の良い λ\boldsymbol{\lambda} を選んでしまうからです。kk-fold の平均スコアで評価すれば、その揺れがならされます。

決定的に重要なルール:テストデータは HPO に1度も使わない。

flowchart LR
    A["全データ"] --> B["訓練+検証<br/>(HPOに使う)"]
    A --> C["テスト<br/>(最後に1回だけ)"]
    B --> D["交差検証で f(λ)を評価<br/>→ 最良の λ* を探索"]
    D --> E["λ* で全訓練データ再学習"]
    E --> F["テストで最終評価<br/>(汚染なしの実力値)"]
    C --> F

テストを探索に混ぜると、テストスコアが「実力」ではなく「テストに合わせ込んだ結果」になり、本番性能を楽観的に見積もってしまいます(第8章で詳述)。テストは最後の最後、λ\*\boldsymbol{\lambda}^\* を決めきった後に1回だけ触る封印データです。

4. グリッド探索 — 全組合せを総当たり

最も素朴な方法です。各ハイパーパラメータについて候補値のリストを用意し、その**直積(全組合せ)**を一つずつ試します。

要するに:グリッドは「漏れなく全部見る」安心感と引き換えに、つまみが増えると爆発します。低次元(2〜3個)でなら今でも実用的です。

5. ランダム探索 — 同じ予算ならこちらが当たりやすい

各ハイパーパラメータを分布(連続なら一様や対数一様、離散なら候補集合)からランダムに引いて指定回数だけ試します。Bergstra & Bengio(2012)が、同じ試行回数ならランダム探索はグリッド探索と同等以上だと理論・実験で示しました。直観に反しますが理由は明快です。

なぜランダムが効くのか — 「効くつまみは少数」

実問題では、性能に効くつまみはごく一部で、残りはほとんど効かないことが多い(しかも「どれが効くか」は事前に分からない)。

graph TD
    A["2つのつまみ・予算9回"] --> B["グリッド:3×3<br/>効く軸(横)は3点しか見ない<br/>残り6回は効かない軸に浪費"]
    A --> C["ランダム:9点バラまき<br/>効く軸(横)に9点ぶんの解像度<br/>無駄な軸に格子を割かない"]
    B --> D["効く軸の探索解像度=3"]
    C --> E["効く軸の探索解像度=9"]

グリッドは「効かない軸」にも律儀に格子点を割り当てるため、9回中3回ぶんしか「効く軸」を動かせません(効く軸の値は3種類だけ)。一方ランダムは9点を投げるので、効く軸については9通りの値を試せます——同じ予算で効く軸の解像度が3倍。次元が増えるほどこの差は開きます。

「60回ルール」(理論的裏付け)

ランダム探索の心強い目安があります。良い設定が探索空間の上位 5% に入っていると仮定すると、1回の試行でそこに当たる確率は 0.050.05nn 回引いて1回も当たらない確率は (10.05)n(1-0.05)^n なので、少なくとも1回当たる確率は

P(当たり1)=1(10.05)nP(\text{当たり} \ge 1) = 1 - (1 - 0.05)^{n}

n=60n=601(0.95)600.9541-(0.95)^{60}\approx 0.954要するに:上位5%の当たり領域があるなら、ランダムに60回投げれば約95%の確率でそこに刺さる。次元数に依存しないのが効く点です(グリッドは次元が増えると同じ網羅に指数回かかる)。

6. ベイズ最適化 — 過去の試行から「次の一点」を賢く選ぶ

グリッドもランダムも過去の結果を次の選択に活かしません(毎回独立に投げるだけ)。ベイズ最適化(Bayesian Optimization, BO)は「これまで試した (λ,f)(\boldsymbol{\lambda}, f) の履歴から ff の形を推測し、次に試すと最も得な一点を選ぶ」逐次戦略です。評価が高価な ff最小回数で攻めるのに向きます。部品は2つ。

(1) 代理モデル(surrogate)— ff の形を確率で近似

本物の ff(フル訓練)は高価なので、安く評価できる代理モデルで「まだ試していない λ\boldsymbol{\lambda} での ff の予測」を作ります。定番は**ガウス過程(Gaussian Process, GP)**で、各点 λ\boldsymbol{\lambda} について

を同時に返します。観測点の近くは σ\sigma が小さく、未探索の遠い場所は σ\sigma が大きい——「分かっている所」と「まだ分からない所」を確率で表現できるのが GP の強みです。GP の数理(多変量正規・カーネルによる事後分布)は統計側の話なので深入りはここではしません。

(2) 獲得関数(acquisition function)— どこを次に試すか

代理モデルの μ\muσ\sigma をもとに「次に評価すると最も得な点」を数値化するのが獲得関数 a(λ)a(\boldsymbol{\lambda}) です。これを最大化する点を次の試行に選びます。獲得関数は**活用(exploitation)探索(exploration)**を1つの式で天秤にかけます。

UCB(Upper Confidence Bound) — 一番分かりやすい形:

  aUCB(λ)=μ(λ)+κσ(λ)  \boxed{\;a_{\text{UCB}}(\boldsymbol{\lambda}) = \mu(\boldsymbol{\lambda}) + \kappa\,\sigma(\boldsymbol{\lambda})\;}

第1項 μ\mu は「今分かっている範囲で良さそうな所」=活用、第2項 σ\sigma は「自信がない=伸びしろがある所」=探索。κ\kappa がその配合比で、大きいほど探索寄りになります。要するに:「期待値が高い所」か「不確かで化けるかもしれない所」を狙う、という人間の意思決定をそのまま式にしたものです。

EI(Expected Improvement) — 実務で最も使われる獲得関数。現在の最良値 f+=maxif(λi)f^+ = \max_i f(\boldsymbol{\lambda}_i)どれだけ超えられそうかの期待値です。Z=μ(λ)f+σ(λ)Z = \dfrac{\mu(\boldsymbol{\lambda}) - f^+}{\sigma(\boldsymbol{\lambda})} とおくと(σ>0\sigma>0 のとき)

aEI(λ)=(μ(λ)f+)Φ(Z)+σ(λ)ϕ(Z)a_{\text{EI}}(\boldsymbol{\lambda}) = \big(\mu(\boldsymbol{\lambda}) - f^+\big)\,\Phi(Z) + \sigma(\boldsymbol{\lambda})\,\phi(Z)

ここで Φ\Phi は標準正規分布の累積分布関数、ϕ\phi はその密度関数です。第1項は「平均がすでに最良を上回っている度合い(活用)」、第2項は「不確かさが大きく上振れの余地がある度合い(探索)」を表し、両方を自動で勘案します。要するに:EI は「今のベストを更新できる見込み額」を最大化する点を選ぶ——平均が高いだけでも、不確かで上振れしそうでも高くなる、バランスの取れた基準です。

BO のループ

flowchart TD
    A["初期点を数個ランダム評価<br/>(f を実測)"] --> B["代理モデル(GP)を当てはめ<br/>各点の μ・σ を得る"]
    B --> C["獲得関数 a(λ)=EI / UCB を最大化<br/>→ 次に試す λ を1点選ぶ"]
    C --> D["その λ で実際に訓練し f を評価<br/>(高価な1回)"]
    D --> E["履歴に追加し GP を更新"]
    E --> F{"予算(試行回数)を<br/>使い切ったか?"}
    F -- "いいえ" --> C
    F -- "はい" --> G["これまでの最良 λ* を返す"]

代理モデルへの当てはめと獲得関数の最大化は安いので、高価な本物の評価 ff を毎回最も得な1点に絞れます。結果として、グリッド/ランダムより少ない試行回数で良い設定に到達しやすい。代償は逐次的(前の結果を待つ)で並列化しにくいことと、GP が高次元(数十次元超)でスケールしにくいことです。

7. 早期打ち切り系 — 見込みのない設定を早く捨てる(要最新確認)

深層学習では「フル訓練して初めてスコアが分かる」のが重く、有望でない設定にも最後まで計算を払うのが無駄です。Successive Halving(SHA)/ Hyperband / ASHA は「途中経過で見込みの悪い設定を早期に打ち切り、有望なものに計算資源を集中する」多腕バンディット的アプローチです。

これらはランダム探索(どの設定を試すか)+早期打ち切り(各設定にどれだけ予算を割くか)の組合せで、ベイズ最適化と組み合わせる実装(BOHB など)もあります。この領域は実装・ライブラリの進化が速いので要最新確認です。

8. ⚠️ よくある誤解・落とし穴

9. 手法の使い分け(まとめ)

graph TD
    A["HPO したい"] --> B{"つまみは何個?"}
    B -- "2〜3個・予算潤沢" --> C["グリッド探索<br/>(網羅・再現性)"]
    B -- "多い・予算限られる" --> D{"並列計算機は?"}
    D -- "多数あり" --> E["ランダム探索 / ASHA<br/>(独立投げ・早期打ち切り)"]
    D -- "少ない・評価が高価" --> F["ベイズ最適化(EI/UCB)<br/>(少試行で良点へ)"]
    C --> G["効くつまみだけ対数スケールで広く"]
    E --> G
    F --> G

HPO は「勾配なし・高価・ノイジーなブラックボックス最大化」。グリッドは網羅だが次元で爆発、ランダムは効くつまみが少数のとき同予算で有利(60回ルール)、ベイズ最適化は代理モデル+獲得関数で少試行に強い、Hyperband/ASHA は早期打ち切りで予算を有望設定へ集中。どの手法でも「検証で測る・テストは封印・桁で効く軸は対数スケール」は共通の作法です。

対応するシミュレーション

simulations/grid_vs_random_search.py:性能が実質1つのパラメータ xx だけで決まる状況で、同じ25回の試行をグリッド探索ランダム探索で行います。グリッドは xx を5種類しか試せず最適値が格子の隙間に落ちると近づけないのに対し、ランダムは xx を25通り試せて最適値を引き当てやすいこと(Bergstra & Bengio 2012)を可視化します。さらに賢いのがベイズ最適化。

グリッド vs ランダム探索の被覆

関連ノート