多目的最適化とパレートフロント — トレードオフを可視化し、意思決定者に選ばせる

はじめに — 「性能を上げつつコストを下げる」は一つの数字にできない

実際の設計最適化案件では、目的が一つだけということはむしろ稀です。 空力性能を上げたいが重量は増やしたくない、精度は欲しいが計算コストは抑えたい、といったように、複数の目的が互いにトレードオフの関係にあることがほとんどです。

こうした問題に対して最もよくある誤った近道は、複数の目的を重み付き和で一つのスカラー値に押し込んでしまうことです。 目的関数 = w1 × 性能 + w2 × (-コスト) のような式を立て、あとはこれまで扱ってきた単一目的の最適化手法にそのまま投げる、というやり方です。 これは実装としては簡単ですが、なぜ本質的な問題を先送りにしているだけなのかを、今回は整理してみます。

重み付き和の限界 — 重みの決め方が恣意的で、非凸な領域を見逃す

重み付き和のアプローチには、実務上見過ごせない弱点が2つあります。

1つ目は、重み w1, w2 をどう決めるかという問題です。 性能とコストのように単位も性質も異なる量を比較する「正しい」重みは、多くの場合そもそも存在しません。 プロジェクトの初期段階では、性能とコストのどちらをどれだけ優先すべきかがまだ定まっていないことも多く、重みを先に決め打ちすることは意思決定を最適化ループの外から中に持ち込んでしまうことになります。

2つ目は、より本質的な限界で、重み付き和では探索できないパレート最適解が存在するという点です。 目的空間(各目的を軸にとった空間)でトレードオフ曲線が非凸な形をしている場合、重みをどう変えても曲線の凹んだ部分にある解には到達できないことが知られています。 つまり重み付き和は「たまたま到達できる解」しか返さず、それが本当に見るべき選択肢の全体像なのかどうかを保証してくれません。

パレート最適性 — 「支配」という関係で優劣を決める

この限界を乗り越える鍵は、複数の解を1つのスカラー値に潰さず、ベクトルのまま比較するという発想です。 ここで使われるのがパレート支配(Pareto domination)という関係です。

ある解Aが解Bを支配するとは、Aがすべての目的においてB以上に優れており、かつ少なくとも1つの目的においてBより厳密に優れていることを指します。 支配されない解の集合をパレートフロントと呼び、パレートフロント上の解は「他のどの解を持ってきても、全目的を同時に改善することはできない」という意味で最適です。

diagram rendering…

上の図で設計A〜Dは、コストを上げるほど性能も上がるという関係にあり、互いに他を支配していません。つまりこの4点はすべてパレートフロント上にあります。 一方で設計Eは、設計Cより高コストであるにもかかわらず性能はCより低いため、Cに支配されています。パレート最適化の目的は、Eのような支配された解を除外し、A〜Dのような「どれを選んでも一長一短」の解の集合を過不足なく求めることです。

多目的最適化アルゴリズム

パレートフロントを直接求めるアルゴリズムとして最も広く使われているのが、NSGA-II(Non-dominated Sorting Genetic Algorithm II)です。 最適化手法の選択についてで扱った遺伝的アルゴリズム(GA)の直系の拡張にあたり、個体群を世代ごとに進化させるという骨格は変わりません。違うのは、個体の優劣をどう評価するかです。

  • 非支配ソート: 個体群を「誰にも支配されない集合(第1フロント)」「第1フロントを除いた中で誰にも支配されない集合(第2フロント)」というように階層的にランク付けします。第1フロントに近い個体ほど次世代に残りやすくなります。
  • 混雑度(crowding distance): 同じフロント内での優劣は、目的空間上での近傍個体との距離(混雑度)で決めます。混雑度が高い(周囲に個体が少ない)個体を優先的に残すことで、フロントの一部分に個体が偏らず、まんべんなく広がったパレートフロントが得られます。

この2つの仕組みにより、NSGA-IIは単一の解ではなく「パレートフロント上に分布した解の集合」を1回の最適化で返します。

GA系だけでなく、他の系譜のアルゴリズムにも多目的版が存在します。 CMA-ESにはMO-CMA-ESという多目的拡張があり、ベイズ最適化にも期待ハイパーボリューム改善量(EHVI)のような多目的版の獲得関数を使う拡張があります。 評価回数を絞りたい高コストなシミュレーションが相手であれば、多目的ベイズ最適化のほうが現実的な選択になることも少なくありません。

パレートフロントを可視化する

2目的問題であれば、上のquadrantChartのような散布図でパレートフロントをそのまま可視化できます。 3目的になると3D散布図が使えますが、4目的以上になると、そのままでは人間の目で把握できなくなります。

こうした場合によく使われるのが平行座標プロットです。各目的を縦軸として並べ、1つの解を各軸を通る折れ線として描画します。 折れ線の傾き方を見ることで、「この目的を良くすると、あの目的が犠牲になりやすい」といった目的間の相関を視覚的に読み取れます。 目的数が多い場合でも、少なくとも「パレートフロント上にどんな多様性があるか」の全体感を掴む手段として実務でよく使っています。

「選ばせる」設計 — Evaluatorは複数の目的値ベクトルを返す

CFD最適化システムのクラス設計で扱ったShapeGenerator → Solver → Evaluator → Optimizerという構成では、Evaluatorが設計変数から評価値を計算する役割を担っていました。 単一目的の最適化ではこの評価値はスカラーでしたが、多目的最適化ではEvaluatorは複数の目的値からなるベクトルを返すように設計します。 Optimizer側もNSGA-IIのような多目的アルゴリズムに差し替えるだけで、ShapeGeneratorSolverのコードには一切手を入れる必要がありません。

最適化ループの出力も、単一の「最良解」ではなく、パレートフロント上に分布する解の集合になります。 この時点でまだ最終的な1つの設計を選んでいないというのが重要なポイントです。 性能とコストのどちらを優先するかという意思決定は、最適化アルゴリズムの中ではなく、フロント全体を見た上で人間(意思決定者)が最後に行うべき判断です。 重みを最適化の前に固定してしまう重み付き和のアプローチと比べると、この「選択を最後まで引き延ばす」という設計思想の違いが、多目的最適化を使う最大の理由だと感じています。

実務では、フロントの中でも目的間のトレードオフの傾きが急に変わる点(knee point、膝の折れ曲がりのような点)を候補として提示することが多いです。 knee pointは「これ以上その目的を改善しようとすると、他の目的が急激に悪化し始める」境界にあたるため、明確な優先順位がまだない段階での有力な初期候補になります。

目的が増えすぎるとどうなるか — 実務上の落とし穴

目的数が増えるほど、パレートフロント上の解のほとんどが互いに支配し合わなくなり、フロント自体が膨れ上がっていきます(many-objective optimizationと呼ばれる領域で、4目的を超えたあたりから顕著になる現象です)。 こうなると「フロントを求めた」こと自体の情報量が薄れ、可視化も意思決定も難しくなっていきます。

このため実務では、目的をやみくもに増やすのではなく、事前に目的同士の相関を確認し、強く相関する目的は片方に集約する、あるいは要求仕様として満たすべき下限・上限がある目的は最適化の目的からは外して制約条件に回す、といった目的の整理を最適化ループを組む前に行うことが多いです。 アルゴリズムを高度化する前に、まず「何を目的として最適化すべきか」を絞り込むことが、多目的最適化を実務で機能させる上での最初の関門だと考えています。

おわりに

複数の目的を重み付き和で1つに潰してしまうと、重みの決め方という恣意性が入り込むだけでなく、非凸なトレードオフ領域にある解を最初から探索対象外にしてしまいます。 パレート最適性という「支配」に基づく比較軸を導入し、NSGA-IIのようなアルゴリズムでフロント全体を求めることで、意思決定を最適化アルゴリズムの中に埋め込まず、フロントを見た人間の判断に委ねられるようになります。

性能かコストか、精度か速度か——こうした問いに唯一の正解はなく、状況によって答えは変わります。 最適化ループの役割は、その問いに代わりに答えることではなく、答えるための材料であるパレートフロントを過不足なく提示することだと捉えています。