サロゲート管理#
Surrogateがfit/predictだけを扱うのに対し、SurrogateManagerはモデルのフィットとバッチ予測を協調させます。オプティマイザに設定した獲得関数が、返された予測をスコア化します。
Optimizer.set_surrogate_manager()は、Optimizer.set_surrogate()(SurrogateをLocalSurrogateManagerでラップする簡易版)とは別のトップレベル差し替え点です。
SurrogateManagerの役割#
SurrogateManagerの抽象メソッドはpredict()です。フィットと世代フックには既定実装があります。
predict(candidates_x, archive, ctx=None, *, refit=True) -> SurrogatePrediction(抽象メソッド):候補を予測します。refit=True(既定値)の場合は、予測前にサロゲートを再学習します。
fit(archive, ctx=None) -> None:既定では何もしません。アーカイブが変化しない場合に、predict(..., refit=False)を連続して呼び出す前に1回だけ呼ぶ事前フィット用フックです。
last_accuracy: SurrogateAccuracy | None(クラス属性):直近のfitが計算した精度指標。詳細はサロゲート精度評価と動的切り替えで扱います。
on_generation_end(gen, archive, ctx=None) / with_on_generation_end(fn):世代末フック。同じくコピー+チェーン方式で拡張できます。
二つの境界で受け取る値と返す値は次のとおりです。
境界 |
受け取る値 |
返す値 |
主な利用者 |
|---|---|---|---|
Stage互換境界 |
|
|
互換Stage、逐次互換ランタイム |
graph-native境界 |
|
Surrogateがフィット・予測できる特徴と予測結果 |
コンポーネント、Compiler、構造化ランタイム |
Stage互換経路の現行vector形式のManager APIでは、fit(archive, ctx=None)とpredict(candidates_x: np.ndarray, archive, ctx=None, *, refit=True) -> SurrogatePredictionを使います。現行APIには、GlobalSurrogateManager(surrogate, training_set=None, accuracy_evaluator=None)、LocalSurrogateManager(surrogate, training_set=None, accuracy_evaluator=None)、PairwiseSurrogateManager(surrogate, training_set=None, n_ref=10)などのコンストラクタも含まれます。構造化ランタイムでは、Surrogateの入力境界はGenomeBatch → FeatureEncoder → FeatureBatch → Surrogateです。FeatureEncoderは意味変換を行い、Surrogateが学習できる特徴を決めます。これはSamplingServiceのような空間の能力とは異なります。現行実装ではSurrogateManagerの契約がServiceRequirement("FeatureEncoder")を宣言し、VectorSpaceが既定のエンコーダをサービスとして登録するため、数値ベクトル空間は追加設定なしで解決されます。ObjectSpace、PermutationSpace、SequenceSpaceは、利用者がFeatureEncoderを指定しないとエラーになります。Surrogateへ渡す内容は利用者が決めます。
組み込みSurrogateManager#
クラス |
方式 |
|---|---|
|
アーカイブ全体で1回グローバルにフィットし、全候補を一括予測する |
|
候補ごとにk近傍でローカルフィット |
|
名前付きの予測チャンネルを組み合わせる |
|
ペア比較サロゲートで勝率を予測する |
GlobalSurrogateManager(surrogate, training_set=None, accuracy_evaluator=None)は、training_set省略時にArchiveObjectiveSet()が使われます。
LocalSurrogateManager(surrogate, training_set=None, accuracy_evaluator=None)は、training_set省略時にKNNObjectiveSet(n_neighbors=50)が使われます。n_neighborsはLocalSurrogateManager自体のコンストラクタ引数ではなく、既定のtraining_setが持つパラメータです。候補間で同一のsurrogateインスタンスを使い回して再フィットする実装のため、スレッドセーフではありません。
CompositeSurrogateManager(managers)は各名前付きマネージャーのpredict()を呼び出し、複数チャンネルのSurrogatePredictionを返します。CompositeAcquisitionを使うとチャンネルごとに取得関数を評価し、結果のスコア配列をproduct_combineまたはrank_weighted_combine(weights=None)で組み合わせられます。
PairwiseSurrogateManager(surrogate, training_set=None, n_ref=10)は、training_set省略時にPairwiseComparisonSet()が使われます。
各マネージャーのtraining_set/accuracy_evaluator引数の詳細は、それぞれTrainingSetとサロゲート精度評価と動的切り替えを参照してください。
アーカイブベースの取得関数#
これらの取得関数は候補の幾何学的な特徴をアーカイブと直接比較してスコア化するため、サロゲートの予測を必要としません。
クラス |
パラメータ |
スコアの意味 |
|---|---|---|
|
|
アーカイブへのk近傍平均距離が大きいほど良い |
|
|
ε近傍密度の逆数 |
|
なし |
候補間の最小距離とアーカイブまでの最小距離の合計 |
SurrogateManagerとアーカイブベースの取得関数の拡張#
独自の予測方式が必要な場合はSurrogateManagerを継承してpredict()を実装します。独自のアーカイブベース基準が必要な場合はAcquisitionFunctionを継承して評価契約を実装します。
import numpy as np
from saealib import AcquisitionFunction, AcquisitionResult
class ConstantAcquisition(AcquisitionFunction):
"""A minimal acquisition that assigns every candidate the same score."""
def evaluate(self, candidates_x, prediction, archive, ctx=None, *, prepared=None):
return AcquisitionResult(scores=np.ones(len(candidates_x)))
関連コンポーネント#
Surrogate:
SurrogateManagerが協調させるfit/predictの実体TrainingSet:各
SurrogateManagerが学習データの抽出に使うAcquisitionFunction:
AcquisitionStageで予測をスコア化するサロゲート精度評価と動的切り替え:
accuracy_evaluator/last_accuracyの詳細strategies:
SurrogatePredictStageとAcquisitionStageを組み立てる
参照#
saealib.NoveltyAcquisitionsaealib.InverseDensityAcquisitionsaealib.MaximinDistanceAcquisition