深層学習

ハイパーパラメータ探索

グリッド探索・ランダム探索・ベイズ最適化を、試行の使い方と逐次的な打ち切りの観点で整理する。

  • B|標準
  • 深層学習

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

ひとことで言うと

ハイパーパラメータ探索は、学習前に決める設定値の候補を試し、検証性能のよい組合せを見つける手続きです。ここで比べるのはモデルの重みではなく、試行をどこへ割り当てるかという探索戦略です。

複数のつまみが付いた機械を調整するとき、全組合せを順番に触る方法もあれば、まずランダムに触って反応のあるつまみを探し、次の試行を寄せていく方法もあります。探索法の差は、同じ回数でどれだけ情報を得るかに現れます。

なぜ必要か

候補が各軸に kk 個あり、軸が dd 個なら、グリッド探索の試行数は kdk^d です。軸を1つ増やすだけで必要な計算量が乗算されるため、深層学習では粗い候補しか置けません。しかも、データセットごとに効くハイパーパラメータは異なり、ほとんど影響しない軸もあります。

JMLRの研究は、ニューラルネットワークなどを対象に、同じ探索領域でランダムに試す方法がグリッドより短時間で同等以上のモデルを見つけ得ることを示しました。理由は、重要な軸を変えないまま無関係な軸だけを刻む試行を避け、重要な軸の異なる値を早く広く試せるからです。これは「ランダムなら必ず勝つ」という主張ではなく、同じ予算で比較したときの有力なベースラインという位置付けです。

探索空間1軸の候補数軸が増えたとき
グリッドkk 個全組合せが kdk^d に増える
ランダム分布から生成試行数 TT を先に固定できる

仕組み

ハイパーパラメータを θ\boldsymbol{\theta}、検証データで測る目的値を f(θ)f(\boldsymbol{\theta})、試行回数を TT とします。探索は、候補 θ1,…,θT\boldsymbol{\theta}_1,\ldots,\boldsymbol{\theta}_T を決めて学習・評価し、最良の目的値を選ぶ処理です。

θ∗=arg⁡min⁡t∈{1,…,T}f(θt)\boldsymbol{\theta}^{\ast}=\mathop{\arg\min}_{t\in\{1,\ldots,T\}} f(\boldsymbol{\theta}_t)

ここで θ∗\boldsymbol{\theta}^{\ast} は選ばれた設定、ff は小さいほどよい損失です。グリッド探索は各軸を等間隔に切って直積を作ります。ランダム探索は各軸の分布から独立に候補を生成するため、同じ TT でも各軸の値の組合せが広がります。

ベイズ最適化のような逐次型では、過去の試行 (θt,f(θt))(\boldsymbol{\theta}_t,f(\boldsymbol{\theta}_t)) を使って、次に評価する候補を決めます。未評価領域を広げる探索と、よさそうな領域を掘る活用のバランスを取り、評価済みの結果を次の試行へ反映できる点がランダム探索との違いです。ただし、過去の結果を使うぶん、代理モデルや候補選択の設計が必要になります。

さらに、学習を最後まで走らせず、途中の検証値が悪い試行を打ち切る方法があります。これは探索点そのものを賢く選ぶ機構とは別で、限られた計算予算を有望な試行へ回す仕組みです。逐次探索と枝刈りを組み合わせると、次の候補を決める情報を集めながら、見込みの薄い計算を早く止められます。

試験でどう問われるか

問われ方正解に寄る条件引っかけ
グリッドの試行数kdk^d として次元増加を説明するk+dk+d と足し算にする
ランダム探索の利点効かない軸に試行を固定的に消費せず、重要な軸を広く試せるランダムなので常に最適になる
ベイズ最適化の特徴過去の評価結果を使って次の候補を逐次決める全候補を先に列挙する
枝刈りの役割学習途中の不良試行を打ち切り、計算予算を再配分する探索点の選択そのものと同一視する

実装で確かめる

次元が増えるとグリッドの点数だけが急増し、ランダム探索は試行予算を一定に保てることを確認します。実際の学習の代わりに、2軸目だけが目的値へ強く効く簡単な関数を使います。

import numpy as np

rng = np.random.default_rng(0)
k, d, T = 8, 4, 32
grid = np.array(np.meshgrid(*[np.linspace(-1, 1, k)] * d)).T.reshape(-1, d)
random = rng.uniform(-1, 1, size=(T, d))
def loss(x):
    return (x[:, 1] - 0.35) ** 2 + 0.01 * x[:, [0, 2, 3]].sum(1) ** 2
print(len(grid), len(random), loss(random).min())

取り違えやすいもの

手法候補の決め方過去の試行の利用
グリッド探索各軸を等間隔に切った全組合せ使わない
ランダム探索分布から独立に候補を生成基本的に使わない
ベイズ最適化観測結果から次の候補を逐次選ぶ使う
枝刈り学習途中の試行を継続・打ち切りする途中経過を使うが、候補選択とは別機能

「探索」と「チューニング」は同じ意味ではありません。焦点は候補の評価順序と計算の停止点です。各ハイパーパラメータの値域や採用基準は別途決めます。

想起チェック

グリッド探索が高次元で苦しくなる理由は

各軸の候補数を掛け合わせるため、kdk^d で試行数が増えます。

ランダム探索が同じ試行数で有利になり得る理由は

効かない軸の組合せを固定的に消費せず、性能に効く軸の値を広く試せるからです。ただし常勝という意味ではありません。

枝刈りは探索アルゴリズムのどの部分を節約するか

学習途中で見込みの薄い試行を打ち切り、残りの計算を別の試行へ回します。次の候補を選ぶ仕組みとは区別します。

出典