スケーリング(広義の意味で)は、最適化手法のパフォーマンスに大きな影響を与えることがよくあります。 収束許容度やその他の基準は必然的に「小さい」と「大きい」の暗黙の定義に基づいているため、異常なスケーリングや不均衡なスケーリングを持つ問題は、一部のアルゴリズムに困難をもたらす可能性があります。 現在、ライブラリにはユーザーが直接呼び出せるスケーリングルーチンはありませんが、疎LP、QP、またはNLP問題を解くルーチンや一部の密ソルバールーチンでは自動的にスケーリングを実行できます。そのようなルーチンには’Scale Option’というオプションパラメータがあり、設定することができます。詳細は個々のルーチンのドキュメントを参照してください。 以下のセクションでは、問題のスケーリングに関するいくつかの一般的なコメントを提示します。
6.1 変数の変換
変数変換は、スケーリングの一手法として、問題の物理的特性を反映した元の表現から、最適化に望ましい特性を持つ変数へと変換することを指します。一般的に、以下の条件を満たすことが有益です:
- 関心領域内で全ての変数が同程度の大きさを持つ
- どの変数の一定の変化も\(f(x)\)に同様の影響を与える。理想的には、任意の変数の単位変化が\(f(x)\)の単位変化を引き起こす
- 変数変換により\(f(x)\)の評価時の桁落ち誤差を回避する
通常は変数の線形変換に限定すべきですが、場合によっては非線形変換も考慮できます。最も一般的で適切な変換は以下の形式です:
\(x_{\text{new}} = D x_{\text{old}}\)
ここで\(D\)は定数係数を持つ対角行列です。しかし、我々の経験からは、以下の変換をより多く活用すべきだと示唆されています:
\(x_{\text{new}} = D x_{\text{old}} + v\)
ここで\(v\)は定数ベクトルです。
例えば、変数\(x_3\)がデータにフィットさせるガウス曲線のピーク位置を表し、極値が150と170である問題を考えてみましょう。この場合、\(x_3\)は150から170の範囲にあることがわかります。可能なスケーリングの一つは、新しい変数\(\bar{x}_3\)を次のように定義することです:
\(\bar{x}_3 = \frac{x_3}{170}\)
しかし、より良い変換は以下のように定義することでしょう:
\(\bar{x}_3 = \frac{x_3 - 160}{10}\)
このようなスケーリングは、変数の範囲を標準化し、最適化アルゴリズムの数値的安定性を向上させる目的があります。ただし、問題の特性によっては、単純な線形変換では不十分な場合もあります。
\(f(x)\)の評価精度を向上させるには、\(f(x)\)を評価するルーチンをコーディングする前に変数をスケーリングすることが効果的な場合が多々あります。例えば、先述のガウス曲線フィッティングの問題では、\(x_3\)が常に\((x_3 - x_m)\)の形で現れる可能性があります。ここで\(x_m\)は平均ピーク位置を表す定数です。
6.2 目的関数のスケーリング
目的関数のスケーリングについては、変数のスケーリングの議論で既に触れました。\(f(x)\)に正の定数を掛けたり、定数を加えたりしても、問題の解は変わりません。一般的に、関心領域内で目的関数が1のオーダーになることが望ましいです。例えば、元の定式化で\(f(x)\)が常に\(10^{+5}\)のオーダーである場合、最適化ソルバー内で関数を評価する際に\(f(x)\)の値を\(10^{-5}\)倍するべきです。
\(f(x)\)の計算に定数項が含まれる場合、通常はそれを省略するべきです。つまり、\(f(x)\)を\(x_1^2 + x_2^2 + 1000\)や\(x_1^2 + x_2^2 + 1\)ではなく、\(x_1^2 + x_2^2\)として定式化する方が良いでしょう。\(f(x)\)の計算にこのような定数を含めると、有効数字の損失につながる可能性があります。
ただし、目的関数のスケーリングは問題の特性に大きく依存します。単純な定数倍だけでなく、問題の構造を考慮したより複雑なスケーリングが必要な場合もあります。
6.3 制約のスケーリング
「適切にスケーリングされた」制約の集合には、主に2つの特性があります。第一に、各制約は変数の摂動に対してwell-conditionedであるべきです。第二に、制約同士がバランスよく設定されるべきです。つまり、全ての制約が解決プロセスにおいて「同等の重み」を持つべきです。
線形または非線形制約付き問題の解は、\(i\)番目の制約に正の重み\(w_i\)を掛けても変わりません。アクティブセットソルバーによって得られた解の近似において、適切にスケーリングされたアクティブな線形制約は(一般に)「正確に」(つまり、機械精度によって定義される許容度内で)満たされます。これは、一般に「正確に」満たされない(例えば、\(\hat{g}_1(x^*) = 10^{-8}\)、\(\hat{g}_2(x^*) = -10^{-6}\)など)アクティブな非線形制約とは対照的です。通常、この不一致は、\(x\)の単位変化が各制約に同様の変化をもたらすように制約に重みを付けることで最小化できます。
重みを導入するもう一つの理由は、制約の大きさがラグランジュ乗数の推定値に与える影響、そしてその結果としてアクティブセット戦略に与える影響に関連しています。これは、異なる重みの集合によって、アルゴリズムが異なる反復列を生成する可能性があることを意味します。
制約のスケーリングは複雑なプロセスであり、問題の特性や使用するアルゴリズムに大きく依存します。適切なスケーリングを行うには、問題の構造と数値的特性を深く理解する必要があります。
更なる議論については、Gill et al. (1981) “Practical Optimization”を参照してください。この文献では、最適化問題のスケーリングに関する詳細な分析と実践的なアドバイスが提供されています。