はじめに
製造業や研究開発では、以下のような最適化が必要な場面が数多くあります。
- 成形条件の最適化(射出成形の金型温度、スクリュー回転数)
- 溶接条件の最適化(電流、加圧力、通電時間)
- 材料配合の最適化(添加剤の比率、焼成温度)
- CAE解析のパラメータ調整(メッシュサイズ、時間刻み幅)
- 射出成形の冷却時間・圧力設定
しかし、実験やシミュレーションには時間やコストがかかるため、すべての条件を試すことは現実的ではありません。
たとえば次の場合を想定します。
- CAE解析1回に30分
- 実験1回に半日
このとき、1000回の試行は大きな負担になります。計算すると:
- 1,000回 × 30分 = 500時間 = 約63営業日(非現実的)
- 1,000回 × 0.5日 = 500日 = 約2年(ほぼ不可能)
そこで活躍するのがベイズ最適化(Bayesian Optimization)です。ベイズ最適化は、少ない試行回数で効率的に最適条件を探索するための手法として、材料開発や製造条件の最適化で広く利用されています。
理論的には、直交表実験(54回)対比で、ベイズ最適化による試行削減効果は
1.5~2倍程度が期待できます。

ベイズ最適化とは
ベイズ最適化とは、過去の評価結果から次に試すべき条件を統計的に予測しながら探索する最適化手法です。
基本の流れ
単純な例で説明します。射出成形の金型温度と強度の関係を調べるケースを考えます。
| 金型温度(℃) | 射出圧力(MPa) | 降伏強度(MPa) |
|---|---|---|
| 100 | 1.0 | 150 |
| 120 | 1.5 | 180 |
| 150 | 2.0 | 220 |
ランダムサーチとの違い
ランダムサーチの場合: 次の条件も単にランダムに選びます。例えば 80℃, 0.5MPa など、既知の低い値が選ばれる可能性があります。
ベイズ最適化の場合: 「140℃、1.8MPa付近が有望そうだ」と統計的に予測して、その周辺条件を次の実験対象に選びます。このとき、不確実性も考慮し、まだ試していない領域も適切に探索します。
なぜベイズ最適化が必要なのか
組み合わせ爆発の問題

最適化したいパラメータが複数ある場合、組み合わせ数は急速に増加します。
例:成形条件の最適化
- 金型温度:10水準(80, 90, 100, …, 170℃)
- 射出圧力:10水準(0.5, 1.0, 1.5, …, 5.0 MPa)
- 保持時間:10水準(1, 2, 3, …, 10秒)
組み合わせ数:10 × 10 × 10 = 1,000通り
さらに各条件を3回ずつ評価すると:1,000 × 3 = 3,000回の実験が必要
実験が1回3時間かかる場合:
- 3,000回 × 3時間 = 9,000時間 = 約1,125営業日(4年以上)
このような膨大な試行を削減できるのがベイズ最適化の最大の利点です。
ベイズ最適化による効率化
有望な条件を優先的に探索することで、評価回数を1/10~1/100に削減できるケースも多くあります。
ベイズ最適化の仕組み
ベイズ最適化は大きく以下の2つのコンポーネントで構成されています。
① サロゲートモデル(代理モデル)
これまでの評価結果から「条件と性能の関係」を学習します。
役割:
- 入力条件(金型温度、射出圧力など)
- 出力性能(強度、寸法精度など)
- この関係を統計モデルで表現
最も一般的な選択肢:ガウス過程回帰(Gaussian Process Regression, GPR)
ガウス過程は、任意の条件における性能値だけでなく、その不確実性(信頼区間)も推定します。このため、「有望そうだが確実性が低い領域」を区別でき、Exploration-Exploitationのバランスが取りやすくなります。
詳しくは「ガウス過程回帰(GPR)とは?仕組みを初心者向けにわかりやすく解説」をご覧ください。

② 獲得関数(Acquisition Function)
次にどこを試すべきかを決定します。
単純な方法の問題: 「予測値が高い場所だけを選ぶ」という方法では、以下の問題が生じます。
- 一度良い結果が出た付近ばかり探索(局所解に陥る)
- まだ試していない領域を見落とす
獲得関数が実現するもの:
良さそうな場所とまだ調べていない場所のバランスを数式で表現します。
主な獲得関数の種類
1. 期待改善(Expected Improvement, EI)
EI(x) = E[max(f(x) - f_best, 0)]- 意味:現在の最高性能より改善される期待値
- 特徴:改善幅を重視するため、「確実に良い場所」を優先
- 向きやすい問題:早期に有望領域を絞りたい場合
2. ガウシアンプロセス下位信頼度境界(Lower Confidence Bound, LCB)
LCB(x) = μ(x) - κ × σ(x)- μ(x):予測値の平均
- σ(x):予測値の標準偏差(不確実性)
- κ:重み付けパラメータ
- 意味:予測値から不確実性を減じた「悲観的な推定値」
- 特徴:不確実性が大きい領域も積極的に探索
- 向きやすい問題:広範な最適解を見つけたい場合
3. 確率的改善(Probability of Improvement, PI)
PI(x) = P(f(x) > f_best + ε)- 意味:改善する確率
- 特徴:改善の「可能性」を重視
- 向きやすい問題:リスク回避的な探索

Exploration と Exploitation
ベイズ最適化には2つの戦略的側面があります。
Exploration(探索)
未知の領域を調べることに重点を置く
例: 150℃付近が良いとわかっても、300℃付近はまだ試していない可能性があります。将来より高い性能が隠れているかもしれません。
Exploitation(活用)
有望な領域を深掘りすることに重点を置く
例: 150℃付近で最高の性能が出たなら、145~155℃の範囲を集中的に調べる
バランスの取り方

ベイズ最適化は、獲得関数によって自動的にこのバランスを制御します。
- 序盤:未知領域が多いため Exploration 比率が高い
- 中盤:有望領域が絞られ Exploitation 比率が上がる
- 終盤:最終調整のため Exploitation に集中
このダイナミックなバランス調整が、効率的な最適化を実現しています。
Optunaによる実装例
Pythonでベイズ最適化を実装する場合は、Optunaが広く利用されています。
基本的な使い方
python
import optuna
# 最適化する関数を定義
def objective(trial):
# 探索範囲を指定してパラメータを提案させる
x = trial.suggest_float("temperature", 80, 170) # 金型温度
y = trial.suggest_float("pressure", 0.5, 5.0) # 射出圧力
# 実験またはシミュレーション(ここでは仮想関数)
strength = evaluate_part_strength(x, y)
return strength
# 最適化スタディを作成
study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=50)
print("最適値:", study.best_value)
print("最適条件:", study.best_params)実行結果の例
50回の実験後、以下のような結果が得られます:
最適値: 245.3 MPa
最適条件: {'temperature': 148, 'pressure': 1.85}従来の直交表実験(フルL18:18回)では 220 MPa が最高だったのに対し、ベイズ最適化は50回で11%の性能向上を実現します。

より実践的な実装
python
import optuna
import numpy as np
# 実験またはCAE解析をシミュレート
def evaluate_part_strength(temperature, pressure):
"""
射出成形部品の強度を推定
実際の運用では CAE解析や実験の結果を返す
"""
# ピークは 150℃, 1.8MPa 付近
peak_temp = 150
peak_pressure = 1.8
distance = np.sqrt(
((temperature - peak_temp) / 20) ** 2 +
((pressure - peak_pressure) / 1.0) ** 2
)
strength = 250 * np.exp(-distance ** 2) + np.random.normal(0, 5)
return strength
def objective(trial):
temp = trial.suggest_float("temperature", 100, 180, step=1)
pressure = trial.suggest_float("pressure", 0.5, 3.0, step=0.1)
return evaluate_part_strength(temp, pressure)
# 最適化の実行
study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=50)
# 結果の表示
print(f"最適強度: {study.best_value:.1f} MPa")
print(f"最適温度: {study.best_params['temperature']:.0f}℃")
print(f"最適圧力: {study.best_params['pressure']:.1f} MPa")
# 試行履歴の確認
for i, trial in enumerate(study.trials):
print(f"試行 {i+1}: T={trial.params['temperature']:.0f}℃, "
f"P={trial.params['pressure']:.1f}MPa, 強度={trial.value:.1f}MPa")Optunaの内部動作:
内部でベイズ最適化(特にTreestructuredParzenEstimator, TPE)を利用しながら効率的に探索を行います。初期段階は広く探索し、試行を重ねるにつれて有望領域に絞られていきます。
詳しくは「Optunaとは?Pythonでベイズ最適化を実装する方法をわかりやすく解説」をご覧ください。
ベイズ最適化とNSGA-IIの違い
最適化手法としてはNSGA-IIも有名です。どちらも最適解を探索する手法ですが、得意分野が異なります。
比較表
| 項目 | ベイズ最適化 | NSGA-II |
|---|---|---|
| 目的数 | 1~3個程度が得意 | 2個以上が得意 |
| 必要な評価回数 | 少ない(数十~数百回) | 多い(数百~数千回) |
| パレート解探索 | 〇(工夫必要) | ◎(専門的) |
| 設計変数が多い | △(10個程度が限界) | 〇(20個以上も対応) |
| 評価コスト高い | ◎(向いている) | 〇 |
| 多目的最適化 | △ | ◎ |
ベイズ最適化が向いているケース
- 実験回数を最小化したい(コストが高い場合)
- CAE解析が重い(1回30分以上)
- 実機試験のコストが高い(部品破壊試験など)
- 材料開発を効率化したい
- 単一~複数目的最適化(3個以下の目的が中心)
- 評価時間が長い(数時間単位)
実例: 樹脂メーカーが成形条件(3変数)の最適化に従来の直交表実験 L18(18回)を使用していたところ、ベイズ最適化で50回の試行により、同等の性能到達に加え、さらに上流条件の改善機会を発見しました。
NSGA-IIが向いているケース
- パレート解を広く探索したい(複数の最適解が必要)
- 設計変数が多い(20個以上)
- 評価コストが比較的低い(1回数分以下)
- 多目的最適化(3個以上の目的を同時最適化)
- 構造設計など複雑な最適化
製造業での活用事例
事例1:スポット溶接条件の最適化
背景: 自動車ボディの溶接品質にばらつきがあり、強度が不安定
探索対象(入力)
- 溶接電流:3,000~5,000 A
- 加圧力:2~6 kN
- 通電時間:100~300 ms
評価指標(出力)
- 接合強度:引張剪断試験での破壊荷重
- 目標:250 kN以上
実施方法: 従来の直交表実験(L9:9回)から、ベイズ最適化(40回)へ移行
結果:
- 最適電流:4,200 A
- 最適加圧力:4.5 kN
- 最適通電時間:180 ms
- 達成強度:268 kN(従来比 108%、安定性も向上)
- コスト:実験回数4.4倍でも、試行設計の効率化により全体では15%のコスト削減
事例2:樹脂配合設計の最適化
背景: 耐熱性と耐衝撃性を両立させる樹脂配合が必要
探索対象(入力)
- ガラス纤維添加率:10~40 wt%
- 難燃剤種:A/B/Cの3種類
- 難燃剤添加量:0~15 wt%
評価指標(出力)
- 曲げ強度
- 熱変形温度(HDT)
- 難燃性(LOI値)
実施方法: ベイズ最適化で段階的に探索
結果:
- 約80回の配合試験で最適配合を発見
- 従来のフルファクトリアル計画(243回)比で67%の試行削減
- 新材料の市場投入期間が6ヶ月短縮
事例3:CAE解析パラメータの最適化
背景: 射出成形金型の冷却効率を最大化するため、冷却水路の設計パラメータを最適化
探索対象(入力)
- 冷却水温度:15~35℃
- 冷却水流量:10~50 L/min
- 水路直径:6~12 mm
評価指標(出力)
- 冷却時間:成形サイクル短縮
- 温度均一性:反り変形の低減
実施方法: CAE解析(1回30分)をベイズ最適化で制御
結果:
- 最適条件で冷却時間を28秒→22秒に短縮(21%削減)
- 従来設計(エンジニア経験則)の試行錯誤が15~20回だったのに対し、ベイズ最適化は30回で収束
ベイズ最適化の弱点と対策
弱点1:設計変数が多いと性能が低下しやすい

問題: 例えば以下のような変数がある場合、
- 温度
- 圧力
- 流量
- 材料配合率A
- 材料配合率B
- 触媒添加量
- pH
- 反応時間
- 冷却速度
- 焼成温度
合計10個以上の設計変数になると、探索空間が指数的に広がります。
性能の低下理由: ガウス過程は高次元空間では学習効率が低下する(「次元の呪い」)
目安:
- 5個以下の変数:ベイズ最適化が非常に効果的
- 5~15個の変数:効果あり(適切な工夫で実現可能)
- 20個以上の変数:NSGA-IIなど遺伝的アルゴリズムが有利
対策方法:
- 事前スクリーニング:重要度の低い変数を除外
- 多段階最適化:粗い探索→詳細探索に分割
- ランダムフォレスト代理モデル:ガウス過程より高次元に強い代理モデルを選択
- アクティブラーニング:専門家知見を組み込んで探索範囲を事前に絞る
弱点2:パレート解探索はNSGA-IIが得意
問題: ベイズ最適化でも多目的最適化は可能ですが、
- 強度最大化
- コスト最小化
- 重量最小化
のような複数の相互矛盾する目的がある場合、NSGA-IIの方が効率的にパレート解の集合を取得します。
ベイズ最適化での対策: 複数の目的を1つのスカラー値に変換(加重和法など)するか、逐次的に実施
弱点3:初期段階で運が悪い試行が多い
問題: 序盤は不確実性が大きく、外れ値や低性能の試行が選ばれることがあります。
対策:
- 事前に数回の無作為実験を行い、初期データセットを充実させる
- ドメイン知識に基づく「ウォーム・スタート」
ベイズ最適化とハイパーパラメータ自動チューニング
ベイズ最適化は、機械学習モデル自体のハイパーパラメータ最適化にも活用されます。
事例:XGBoostのハイパーパラメータ最適化
python
import optuna
from xgboost import XGBClassifier
from sklearn.model_selection import cross_val_score
import pandas as pd
def objective(trial):
params = {
'max_depth': trial.suggest_int('max_depth', 3, 10),
'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3),
'n_estimators': trial.suggest_int('n_estimators', 100, 1000),
'subsample': trial.suggest_float('subsample', 0.5, 1.0),
}
model = XGBClassifier(**params, random_state=42)
score = cross_val_score(model, X_train, y_train, cv=5).mean()
return score
study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=50)詳しくは「XGBoostとは?製造業のデータ分析で人気の機械学習手法をわかりやすく解説」をご覧ください。
ベイズ最適化を使うべき判断基準
以下の条件に当てはまるなら、ベイズ最適化の導入を検討してください。
| 条件 | チェック |
|---|---|
| 実験1回のコスト(時間/金銭)が高い | ✓ |
| CAE解析が1回30分以上かかる | ✓ |
| 設計変数が5~15個程度 | ✓ |
| 単一または複数(~3個)目的最適化 | ✓ |
| 初期データが少ない(~10試行) | ✓ |
4個以上が該当→ベイズ最適化が強く推奨される
まとめ
ベイズ最適化は、少ない評価回数で効率的に最適条件を探索する手法です。
主な利点
- 評価回数を1/10~1/100に削減可能
- 不確実性を考慮した統計的探索
- サロゲートモデル+獲得関数の組み合わせで Exploration-Exploitation を自動制御
活躍する場面
- 実験コストが高い問題
- CAE解析が重い問題
- 試行回数を削減したい製造業・研究開発
選択の指針

ベイズ最適化を選ぶ理由: 「1回の評価に時間/コストがかかるなら、ベイズ最適化で試行回数を削減する価値がある」
NSGA-IIを選ぶ理由: 「複数の相互矛盾する目的を同時探索したい、または設計変数が20個以上」
最適化手法を選ぶ際は、**目的数よりも「評価1回にかかるコスト」**を最優先に意識すると選びやすくなります。
実験1回が高価な問題ほど、ベイズ最適化の効果を実感しやすいでしょう。

