最適化の実行¶
最適化クラス Optimizer
は、「目的関数の定義」に従って事前に定義したブラックボックス関数を最適化フローに従って最適化するためのクラスです。以下の順番で、前準備、最適化クラスのインスタンス化、初期学習データの生成および追加を行い、最適化を実行します。
最適化の前準備¶
以下のように、ブラックボックス関数、サロゲートモデル関数、ソルバークライアントを設定します。
ブラックボックス関数¶
「目的関数の定義」に従って、@blackbox
デコレーターにより定義します。ここでは、このように作成したブラックボックス関数を my_blackbox_func
とします。
サロゲートモデル関数¶
サロゲートモデル関数クラスとは、ブラックボックス関数を多項式で表現するサロゲートモデル関数及びその構築に関するクラスです。モデル関数として
から選択します。下記はモデル関数として FM (FMTrainer
) を用いる場合の例ですが、モデル関数やモデル構築方法に関する様々な設定を行うことが可能です。
from amplify_bbopt import FMTrainer
my_trainer = FMTrainer()
my_trainer.epochs = 100 # エポック数を 100 に設定
my_trainer.optimizer_params = {"lr": 1} # 学習率を 1 に変更
my_trainer.lr_scheduler_class = None # 学習率スケジューリングを使用しない
Note
サロゲートモデル関数に Factorization Machine を使う場合、ブラックボックス最適化手法としては、Factorization Machine with Quadratic-Optimization Annealing (FMQA) となります。Kernel Model を使う場合、Polynomial-Based Kernels with Quadratic-Optimization Annealing (Kernel-QA) となります。
【FMQA 関連論文】Kitai, K., Guo, J., Ju, S., Tanaka, S., Tsuda, K., Shiomi, J., Tamura, R.: Designing metamaterials with quantum annealing and factorization machines. Phys. Rev. Res. 2, 013319 (2020).
【Kernel-QA 関連論文】Minamoto, Y., and Sakamoto, Y.: A black-box optimization method with polynomial-based kernels and quadratic-optimization annealing. arXiv:2501.04225 (2025)
ソルバークライアント¶
Amplify-BBOpt では、最適化サイクル中において、Amplify SDK 経由でイジングマシンを実行することでモデル関数の最適化を行います。
そのために、各ソルバーを抽象化したソルバークライアントを作成して、接続先、API トークン、実行パラメータなどを指定する必要があります。Amplify SDK でサポートしているイジングマシン(ソルバークライアント)から 1 つ選び、そのマシンに対する API トークンやパラメータを設定します。下記は Fixstars Amplify Annealing Engine (Amplify AE) を使う場合の例となります。
from datetime import timedelta
from amplify import FixstarsClient
my_client = FixstarsClient()
my_client.token = "ENTER_YOUR_API_TOKEN" # API トークンの設定
my_client.parameters.timeout = timedelta(seconds=1) # アニーリング実行時間を 1 秒に設定
最適化クラスによる最適化の実行¶
上記で作成した my_blackbox_func
, my_trainer
, my_client
に基づき、以下のように Optimizer
クラスをインスタンス化します。
その後、必要に応じて(少量の)初期学習データを追加後、Optimizer.optimize
により最適化サイクルを実行します。
from amplify_bbopt import Optimizer
# 最適化クラスのインスタンス化
optimizer = Optimizer(
blackbox=my_blackbox_func, # @blackbox で定義したブラックボックス関数
trainer=my_trainer, # サロゲートモデル関数クラスのインスタンス
client=my_client, # イジングマシンのソルバークライアント
)
# 10サンプルからなる初期学習データを生成・追加
optimizer.add_random_training_data(num_data=10)
# 最適化サイクルを 10 回実行する
optimizer.optimize(10)
Note
最適化開始前に初期学習データを 1 つ以上追加しておく必要があります。上記プログラムの様に、インスタンス化したOptimizer
の
add_random_training_data()
メソッドを用いることで、ランダム生成した解とその評価値のペアからなるサンプルを、初期学習データとして追加することができます。
また、データが既に存在する場合や、ユーザ自身で学習データを作成している場合、初期学習データとして Optimizer
クラスのインスタンス時に与えることも可能です。その場合は、学習データを Dataset
として、コンストラクタの training_data
引数として与えます。
import numpy as np
from amplify_bbopt import Dataset, Optimizer
# ブラックボックス関数への入力 (例:2つの入力ベクトルから構成される2次元配列)
dataset_x = np.array([[1, 2, 3], [-1, 0, 1]])
# それぞれの入力に対応するブラックボックス関数の評価値から構成される1次元ベクトル
dataset_y = np/array([1, 5])
# ユーザが作成したデータセットを持つ最適化クラスを作成する
optimizer = Optimizer(
my_blackbox_func,
my_trainer,
my_client,
training_data=Dataset(dataset_x, dataset_y),
)
# 最適化サイクルを実行する
optimizer.optimize(10)
最適化結果の取得¶
最適化サイクルで新たに見つかった解は Optimizer.history
に追加されます。
その中でブラックボックス関数の評価値が最小である最良解とそれに対応するブラックボックス関数値は、以下のようにして取得できます。
print(optimizer.best.values) # ベスト解(入力値)
print(optimizer.best.objective) # ベスト解に対応する目的関数値
最適化結果をより詳しく見るために、履歴データ等も取得可能です。詳細については、結果の評価を参照してください。