サロゲート管理#

Layer 3: Extend Components

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互換境界

archive、candidates_x: np.ndarray、ctx、refit

SurrogatePrediction、fit の完了状態

互換Stage、逐次互換ランタイム

graph-native境界

GenomeBatch、FeatureEncoder、FeatureBatch、宣言済みサービス

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#

クラス

方式

GlobalSurrogateManager

アーカイブ全体で1回グローバルにフィットし、全候補を一括予測する

LocalSurrogateManager

候補ごとにk近傍でローカルフィット

CompositeSurrogateManager

名前付きの予測チャンネルを組み合わせる

PairwiseSurrogateManager

ペア比較サロゲートで勝率を予測する

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とサロゲート精度評価と動的切り替えを参照してください。

アーカイブベースの取得関数#

これらの取得関数は候補の幾何学的な特徴をアーカイブと直接比較してスコア化するため、サロゲートの予測を必要としません。

クラス

パラメータ

スコアの意味

NoveltyAcquisition

k=1

アーカイブへのk近傍平均距離が大きいほど良い

InverseDensityAcquisition

eps=1.0

ε近傍密度の逆数

MaximinDistanceAcquisition

なし

候補間の最小距離とアーカイブまでの最小距離の合計

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)))

関連コンポーネント#

参照#