iws.DataFit における正則化には 2 つの形があります。事前分布 は 1 つのフィットパラメータと iws.stats の分布を組み合わせたものです。ペナルティ や 制約 は任意のフィットパラメータに対する pybamm の式で、目的関数に付与し、1 つのパラメータ上の分布では表せない関係を記述します。正則化が必要な理由や事前強度の選び方は、正則化 (英語ガイド) を参照してください。
分布
正則化されたフィット
priors を渡すと、事前分布の平均からの偏差が(逆分散に比例して)コスト関数に正則化項として加わります。
式に対するペナルティと制約
事前分布は 1 つのパラメータに作用します。物理的な関係が複数のパラメータにまたがる場合は、フィット対象パラメータと同名のpybamm.InputParameter を使って pybamm の式として書き、目的関数に付与します。
制約はハードな上限ではなくソフトなペナルティであり、どのオプティマイザでも同じ方法で適用されます。ask-tell オプティマイザも、すべての
iws.optimizers.Scipy* ラッパーも同様で、scipy が制約を扱えないメソッド(Powell、Nelder-Mead、L-BFGS-B、TNC)を指定した ScipyMinimize も含みます。scipy 自身の constraints= 引数には渡されません。ソフトな制約なので、フィット結果が境界をわずかに超えることがあります。違反量がコストに対して無視できるようになるまで regularizer_weight を大きくしてください。
ペナルティ項と制約項は、どちらのオプティマイザモードでもパイプライン側で 2 乗されます。スカラーオプティマイザでは w * expr**2 がコストに加わり、最小二乗オプティマイザでは残差が追加され、オプティマイザがそれを 2 乗します。残差は SSE/MSE では sqrt(w) * expr で、残差のスカラー化が異なるコスト(例: 2 乗和を半分にする GaussianLogLikelihood)では、項が w * expr**2 になるよう再スケールされます。fun には 2 乗する前の量を渡してください。自分で 2 乗すると項が 4 乗になり、小さな違反がほとんど効かなくなります。
次の例では、カットオフ時の正極の残存容量(ヘッドルーム)を 0.15 Ah 以上に保つため、不足分に片側 2 乗ペナルティを課します。ヘッドルームに余裕がある範囲ではゼロで、負極が空になるのとちょうど同時に正極が満杯になるようなフィットに向かうときだけ大きくなります。
regularizer_weight は、ペナルティを効かせたい領域でデータコストと同程度になるように選びます。ペナルティは正規化を含むコストの値にそのまま加算されます。デフォルトのコスト SSE は残差の 2 乗和をデータの絶対値の平均で割るため、データ点数に比例して大きくなります。3.7 V のセルで 1,000 点の電圧データを RMSE 9 mV でフィットするとコストは約 1000 * 0.009**2 / 3.7 = 0.022 で、regularizer_weight=2.0 のとき 0.1 Ah の不足は 2.0 * 0.1**2 = 0.02 となり、電圧の誤差全体とほぼ同じ大きさになります。シンボルの fun は to_config() で pybamm の JSON 形式にシリアライズされ、サーバー側で再構築されるため、同じオブジェクトをローカルでも client.pipeline.create 経由でも使えます。
Parameter への事前分布の付与
事前分布が当該パラメータに固有のものである場合は、別の dict ではなく Parameter に直接付けることもできます。
dict 形式の事前分布
スキーマの設定は、プレーンな dict としても書けます。JSON や YAML から設定を読み込むときに便利です。priors マッピングでは、次の 2 つの等価な形式を受け付けます。
name は無視されます — パラメータ名が文字どおり "distribution" の場合でも同様です。
厳格なバリデーション
事前分布・分布・サンプラーは送信時に識別ユニオン(discriminated union)で検証されます。これにより、タイプミスや古い設定をランタイムの不明瞭なクラッシュにする前に、提出時点で検出できます。 次のような誤りはValidationError として明示的に拒否されます。
- 未知の分布名(例:
{"distribution": "Guassian", ...})。 - 分布・事前分布・サンプラー設定の不明なキーやタイプミス。
- フィールドと一致しない
type識別子(例:priorsの下に{"type": "Penalty", ...})。 - 事前分布・分布・サンプラーが期待される位置に渡されたスカラーやリスト。
type エイリアスは、分布設定の内部でのみ distribution 識別子の代わりに引き続き受け付けられます。たとえばネスト形式の内側の dict {"type": "Normal", "mean": 3.0, "std": 0.2} は Normal に解決されるため、既存のシリアライズ済み設定はそのままラウンドトリップします。ただし type が distribution のエイリアスになるのは分布レベルだけです。事前分布マッピングの最上位では type は事前分布の識別子(必ず "Prior")として扱われるため、フラット形式の事前分布は分布を type ではなく distribution で指定する必要があります。
なぜ拡散係数に LogNormal か
固相拡散係数は桁にまたがる範囲(しばしば ~ m²/s)に分布します。生の値への Normal 事前分布では、平均 ± 標準偏差で桁オーダの不確かさを表現しづらいです。LogNormal 事前分布はパラメータを対数スケールで扱うため、「平均 ± 1 標準偏差」が係数 に相当し、より自然です。上記の例の mean=-32.2 は の自然対数なので、典型的な粒子内拡散係数を中心とする事前分布になっています。
正則化 (理論)
リッジ回帰、MAP 推定、バイアス・分散トレードオフ (英語ガイド)。
データフィッティング概要
事前分布を目的関数・オプティマイザと組み合わせる方法。