サロゲートモデル性能向上¶
QA-BBO においては、サロゲートモデルの予測性能が最適化成功の鍵となります。特に、本ライブラリが対象とする最小化問題の場合、ブラックボックス関数値(目的関数値)が比較的小さなサンプル群に対する予測性能が重要となります。
Attention
一般的に、モデルの予測性能といった場合、2乗誤差などの予測精度が連想されます。一方、ブラックボックス最適化においては、ブラックボックス関数値とサロゲートモデル予測値の (順位)相関が重要 です。各サイクルにおいて、このような相関係数が正であることはもちろん、サイクルと共に、平均的に 0.5 を超える、1 に近づくことを 1 つの指標としてサロゲートモデル構築の妥当性を判断すると良いでしょう。
Tip
Amplify-BBOpt では、サロゲートモデル構築毎に相関係数を計算・出力しています。相関係数は次のように算出しています。
学習データ全体から、
percentile_cutoffsの閾値で定義される目的関数値の下位サンプルを抽出下位サンプルに対して、構築済みサロゲートモデルで予測値を求め、対応する真値との相関係数を算出
このように算出した下位サンプルに対する相関係数は、毎サイクル、以下のように出力されます。
<=10%: 0.654, <=25%: 0.693, <=50%: 0.721, all: 0.872
これらは、目的関数値の下位 10%、下位 25%、下位 50% 及びサンプル全体に対しての相関係数を示します。下位サンプルの閾値(パーセンタイル)は、次のように指定可能です(デフォルトは、[10, 25, 50, 100])。
from amplify_bbopt import KMTrainer
trainer = KMTrainer()
trainer.percentile_cutoffs = [20, 50, 100] # 下位 20%, 50%, 100% を指定
サロゲートモデル予測値と目的関数値との相関係数を適宜確認することで、最適化されないなどの失敗を早期に検知・回避しやすくなります。
学習データ変換¶
最小化問題を取り扱うブラックボックス最適化の場合、最適化サイクルが進むと共に、ブラックボックス関数値は、真の最適解に対応する値に徐々に漸近していく予想され、学習データサンプル全体のダイナミックレンジは比較的大きくなる傾向があります。このような大ダイナミックレンジの学習データにおいて、小さなサンプル群に対する予測性能を向上するようなモデル構築を行う方法の 1 つとして、学習データ変換があります。
目的関数値の指数変換¶
大きなダイナミックレンジを有するデータセットに対して、適切にモデルを構築するのは一般的に困難であり、以下のようなデータの指数変換によって改善することがあります[1]。
ここで、 \(y\) はゼロ付近に漸近することが想定される元の目的関数値、\(\hat{y}\) はスケーリング後の目的関数値、\(c_m\) は、本変換手法に関するハイパーパラメータで、通常は、初期学習データに含まれる目的関数値の平均値を使います。
Hint
もし最適解におけるブラックボックス関数値がゼロ付近ではないことが想定される場合は、適切にオフセットをかけると良いでしょう。
例えば、何かの正解率 (%) を向上させるようなブラックボックス最適化問題の場合、ブラックボックス関数値は正解率の負値(\(-100\le y\le 0\))とし、正解率の負値を最小化する問題を実装すると考えられ、最適化において、目的関数値は必ずしもゼロに漸近しません。このような場合、指数変換は以下のようなオフセットを掛けたあとで実施します。
ここで、上記の場合、\(y_{offset} = -100\) を考慮します。ブラックボックス関数の特性から \(y_{offset}\) を見積もることが困難な場合、初期学習データの最小値を \(y_{offset}\) として考慮しても構いません。オフセット後、指数変換を実施します。
また、指数変換後の値から、元の関数値への逆変換は、次のように実施可能です。
このような指数変換は以下のようなメリットがあります。
小さい目的関数値サンプル間の差を強調できる
指数関数の特性により、\(y\) が小さい領域では変化が急であり、わずかな差でも \(\hat{y}\) の変化が大きくなります。つまり、小さい \(y\) の情報がモデル構築に大きく反映されるようになります。従って、最小値の探索などの、小さい \(y\) の予測がより重要な場合に有利に働きます。
大きい目的関数値の影響を圧縮できる
大きな \(y\) に対しては、\(\exp(-y/c_m)\) が 0 に近づくため、\(\hat{y}\) の変化が小さくなります。つまり、最小化には無関係な比較的大きな値を有するサンプルの影響を抑えることができます。
回帰モデルのフォーカスを調整できる
通常の回帰では MSE や MAE によって全体の誤差を均等に最小化しますが、この変換を使うと、損失関数が小さな \(y\) の領域でのモデル性能に重点を置くよう誘導することができます。
このようにスケーリングされた値 \(\hat{y}\) をブラックボックス関数から出力することで、より効果的なサロゲートモデル構築が可能になる場合があります。
ExpScaler による学習データ変換¶
Amplify-BBOpt では、上記の指数変換を簡単に適用するための ExpScaler クラスを提供しています。このクラスを使用することで、ブラックボックス関数を変更することなく、内部的に学習データの変換を行います。変換された学習データは、サロゲートモデル関数の構築時のみに適用されるため、最適化で考慮されるブラックボックス目的関数値には影響を与えません。
基本的な使い方¶
ExpScaler のインスタンスを Optimizer の surrogate_data_transformer 引数に渡すことで、サロゲートモデルの学習時に自動的に指数変換が適用されます。
from amplify_bbopt import ExpScaler, Optimizer
# ExpScaler のインスタンスを作成
scaler = ExpScaler()
# Optimizer に surrogate_data_transformer として渡す
optimizer = Optimizer(
blackbox=my_blackbox_func,
trainer=my_trainer,
client=my_client,
surrogate_data_transformer=scaler,
)
Note
ExpScaler では、オフセット値 \(y_{offset}\) として、対象のデータセット \(y\) の最小値が自動的に設定されます。
パラメータのカスタマイズ¶
ExpScaler は、以下のパラメータをカスタマイズできます。
cm_method: \(c_m\) の計算方法を指定します。"mean"(デフォルト): \(y - y_{offset}\) の平均値を使用"median": \(y - y_{offset}\) の中央値を使用
from amplify_bbopt import ExpScaler
# 中央値を使って c_m を計算
scaler = ExpScaler(cm_method="median")
use_data: パラメータ計算に使用するデータを指定します。"initial_data"(デフォルト): 最初の変換時のデータでパラメータを固定"dynamic": 毎回の変換時にパラメータを再計算
from amplify_bbopt import ExpScaler
# 毎サイクル、全学習データからパラメータを再計算
scaler = ExpScaler(use_data="dynamic")
Note
use_data="initial_data" を使用すると、最適化サイクル全体を通じて一貫したスケーリングが適用されます。一方、use_data="dynamic" を使用すると、学習データが増えるにつれてスケーリングパラメータが更新されます。