Bayesian Optimization
ベイズ最適化では、過去の評価と確率モデルを活用し、計算リソースが限られた高コストなMLワークロードにおいて、高性能な設定を見つけます。
ベイズ最適化は、評価コストの高い関数について、過去の評価から学習し、高い性能を発揮する設定を見つける手法です。入力が結果に与える影響の確率モデルを構築し、そのモデルを使って次の実験を選択します。機械学習では、限られた計算予算内で優れた学習構成を見つけるのに役立ちます。
その基礎には、Harold Kushnerによる1964年の逐次探索法と、Jonas Mockusによる1975年のベイズ極値探索の定式化があります。現在では、ハイパーパラメータチューニングや自動機械学習の中心的な手法です。
ベイズ最適化の仕組み#
目的関数は、候補となる構成の品質を測定します。モデルの学習では、選択したハイパーパラメータで学習を行い、検証データで性能を測定して評価します。調整可能な入力には、学習率、バッチサイズ、正則化の強度などがあります。
代理モデルは、目的関数を計算コストの低い方法で近似したものです。一般的な選択肢はガウス過程です。これは、考えられる関数の確率分布であり、結果とその不確実性の両方を予測します。ベイズ更新では、事前の仮定と観測された評価を組み合わせて、事後分布を生成します。獲得関数はこの分布を使って次の候補を選択し、その測定結果は評価予算を使い切るまで代理モデルにフィードバックされます。
これは機械学習ベースの最適化手法です。代理モデルは構成と結果のペアから学習します。不確実性の定量化により、追加測定の価値を判断しやすくなります。
獲得関数と探索#
候補の選択では、良い性能が予測される設定を優先する活用と、不確実な領域を調べる探索のバランスを取ります。一般的な獲得関数は、このバランスをそれぞれ異なる方法で表現します。
- 期待改善量(EI):候補が基準となる結果をどれだけ上回ると期待されるかをスコア化します。
- 改善確率(PI):指定されたマージンを基準となる結果より上回る確率をスコア化します。
- 上側信頼限界(UCB):最大化の場合、予測平均に不確実性ボーナスを加え、不確実性の高い候補をより優先します。
これらの獲得戦略は、モデルの学習や物理実験の実行と比べて、評価コストが低くなります。これらの最適化により、次に実施するコストの高い評価が決まります。
機械学習とコンピュータビジョンでの応用#
個々の評価にかなりの時間がかかり、探索対象に影響力の大きい変数が適度な数だけ含まれる場合、ベイズ最適化は特に有用です。確立された応用分野には、エンジニアリング設計、材料実験、強化学習のコントローラー調整があります。
コンピュータビジョンでは、畳み込みニューラルネットワークの学習設定を選択します。Jasper Snoek、Hugo Larochelle、Ryan P. Adamsは、2012年の実用的なベイズ最適化アルゴリズムでこの応用を実証するとともに、構造化サポートベクターマシンやトピックモデルのチューニングも行いました。
Ultralytics YOLOでは、Ray Tuneとの統合を通じてベイズ探索を利用できます。use_ray=Trueとsearch_alg="bayesopt"を設定すると、学習ハイパーパラメータにベイズ最適化が選択されます。YOLO26の物体検出では、探索によりタスクのデフォルトの平均適合率指標を最大化します。
関連手法とOptuna#
グリッドサーチでは事前に定義した組み合わせの集合を評価し、ランダムサーチでは構成を独立にサンプリングします。ベイズ最適化では、過去の結果を使って以降の選択を導きます。勾配降下法では微分を使ってパラメータを更新しますが、ベイズ最適化では評価と代理モデルを通じて、評価コストの高いブラックボックス目的関数を扱います。
Optunaのサンプリングアルゴリズムには、ガウス過程ベイズ最適化、ランダムサンプリング、ツリー構造Parzen推定器(TPE)があります。TPEは、良い結果と悪い結果に対応するパラメータ分布をモデル化し、次に、これらの密度の比が大きい候補を優先します。Optunaは最適化フレームワークであり、選択したサンプラーが探索戦略を決定します。
Pythonの例#
pip install bayesian-optimizationを使ってbayesian-optimizationをインストールします。この例では、パッケージの最適化入門例で使用されている目的関数と境界を使います。
from bayes_opt import BayesianOptimization
def objective(x, y):
"""Return the objective value to maximize."""
return -(x**2) - (y - 1) ** 2 + 1
optimizer = BayesianOptimization(
f=objective,
pbounds={"x": (2, 4), "y": (-3, 3)},
random_state=1,
verbose=0,
)
optimizer.maximize(init_points=2, n_iter=15)
best = optimizer.max
print(f"Best objective: {best['target']:.4f}")出力には、2回のランダム評価と15回の獲得関数に基づく評価を行った後で測定された最良の目的関数値が表示されます。これらの境界内での正確な最大値は-3であり、そのときの値はx=2、y=1です。










