Sobol感度指標 — 分散分解に基づくグローバル感度解析
理論と物理
Sobol指標とは
先生、Sobol感度指標って何がわかるんですか? 感度解析っていろいろ種類がありますよね。
ざっくり言うと、入力パラメータがどれだけ出力のばらつきに寄与しているかを定量化する手法だ。第1次Sobol指標 $S_i$ は主効果、全次Sobol指標 $S_{Ti}$ は交互作用も含めた寄与率を表す。
「寄与率」っていうのは、具体的にはどういう意味ですか?
例えば $S_i = 0.8$ なら、そのパラメータだけで出力分散の80%を説明できる。設計パラメータが10個あっても、実質的に重要なのは2〜3個ということが多い。Sobol指標はそれを数値で見せてくれるんだ。
へぇ、10個も設計変数があるのに重要なのは2〜3個なんですか! それがわかったら、あとの7〜8個は固定していいってことですね。
そのとおり。CAEの実務で言えば、自動車の衝突シミュレーションで板厚・材料特性・摩擦係数・溶接条件…と入力パラメータが山ほどあるけど、Sobol指標で「板厚と材料の降伏応力だけで出力ばらつきの90%を説明できる」とわかれば、他のパラメータは公称値で固定してもいい。計算コストが激減する。
Sobol感度指標は、1993年にロシアの数学者 I.M. Sobol が提案した分散分解(ANOVA分解)に基づくグローバル感度解析手法である。局所的な偏微分に基づく感度解析とは異なり、パラメータ空間全域にわたるモデル応答のばらつきを評価する。
ANOVA分解(分散分解)
$k$ 個の独立な入力変数 $X_1, X_2, \ldots, X_k$ を持つモデル出力 $Y = f(X_1, \ldots, X_k)$ について、ANOVA分解(高次元モデル表現: HDMR)は以下のように書ける:
ここで $f_0 = E[Y]$ は全平均、$f_i(X_i)$ は変数 $X_i$ の主効果、$f_{ij}$ は2次交互作用項である。この分解が一意になるためには、各項が互いに直交する(積分すると零になる)条件が必要であり、入力変数が互いに独立であることが前提となる。
分散についても同様に分解できる:
各 $V_i, V_{ij}, \ldots$ は対応する項の分散であり、総分散 $V[Y]$ への部分分散の寄与を表す。
第1次Sobol指標 $S_i$
具体的にはどういう数式になるんですか?
第1次Sobol指標は、$X_i$ を固定したときの条件付き期待値の分散を、出力全体の分散で割ったものだ。
ここで、
- $E_{X_{\sim i}}(Y \mid X_i)$:$X_i$ を固定し、それ以外の全変数 $X_{\sim i}$ について平均をとった条件付き期待値
- $V_{X_i}[\cdot]$:その条件付き期待値の、$X_i$ に関する分散
- $V[Y]$:出力 $Y$ の無条件分散(全分散)
$S_i$ は 0〜1の範囲 をとり、$S_i = 0$ なら $X_i$ は出力に全く影響しない。$\sum_{i=1}^{k} S_i = 1$ のとき交互作用がゼロ(加法的モデル)を意味する。
「$X_i$ 以外の全変数について平均をとる」というのがミソなんですね。$X_i$ だけを動かして、他を全部ならすとどれだけ出力がブレるか、と。
その理解で完璧だ。全分散の定理 $V[Y] = V_{X_i}[E_{X_{\sim i}}(Y|X_i)] + E_{X_i}[V_{X_{\sim i}}(Y|X_i)]$ から導かれる式だからね。第1項が「$X_i$ の主効果で説明できる分散」、第2項が「$X_i$ を固定しても残る分散」。
全次Sobol指標 $S_{Ti}$
$S_{Ti}$ は $X_i$ が関与するすべての交互作用項を含めた総合的な寄与率を表す。第1次指標との差 $S_{Ti} - S_i$ が大きいほど、$X_i$ は他の変数との交互作用が強い。
$S_i$ と $S_{Ti}$ の違いを実例で教えてもらえますか?
例えば、ある熱交換器の設計で入力が3つ(流速 $X_1$、管径 $X_2$、材料熱伝導率 $X_3$)だとする。結果が:
- $S_1 = 0.45,\ S_{T1} = 0.52$ — 流速は主効果が大きく、交互作用は少し
- $S_2 = 0.10,\ S_{T2} = 0.35$ — 管径は主効果は小さいが、他変数との交互作用が大きい
- $S_3 = 0.30,\ S_{T3} = 0.33$ — 熱伝導率はほぼ主効果のみ
管径 $X_2$ は $S_2$ だけ見ると「影響小さい」と判断しがちだが、$S_{T2}$ を見ると無視できない。流速と管径の組み合わせ(レイノルズ数的な効果)が交互作用として出ているんだ。
なるほど! $S_i$ だけ見て「この変数は不要」と切り捨てると危ないケースがあるんですね。
だからこそ、パラメータ固定の判断には必ず $S_{Ti}$ を使う。$S_{Ti} \approx 0$ なら安全に固定できる。$S_i$ だけで判断してはいけない。これは実務で本当に重要なポイントだ。
高次交互作用指標
2次の交互作用指標は以下のように定義される:
ここで $S_{ij}^{\text{closed}} = \frac{V_{X_i, X_j}[E_{X_{\sim ij}}(Y|X_i, X_j)]}{V[Y]}$ は $X_i$ と $X_j$ の閉じた2次指標である。理論上は任意の次数まで計算可能だが、計算コストが指数的に増大するため、実務では $S_i$ と $S_{Ti}$ の2つで十分なことが多い。
Sobol指標の性質まとめ
- $0 \leq S_i \leq S_{Ti} \leq 1$:第1次指標は全次指標以下
- $\sum_{i=1}^k S_i \leq 1$:等号は交互作用ゼロ(加法的モデル)のとき
- $\sum_{i=1}^k S_{Ti} \geq 1$:等号は交互作用ゼロのとき
- 入力の独立性が前提:相関のある入力に対しては一般化されたSobol指標(Kucherenko 2012)やShapley効果を使う
局所感度解析との違い
- 局所感度解析(偏微分 $\partial Y/\partial X_i$):基準点周辺の線形的な応答のみ捉える。計算コストが低いが、非線形効果や交互作用は見えない
- グローバル感度解析(Sobol):パラメータ空間全域のばらつきを評価。非線形・交互作用もすべて捉える。ただしモンテカルロ的なサンプリングが必要で計算コストは高い
- Morris法(スクリーニング):「重要 or 不重要」の2値的な判断に向く。Sobol指標の前段階として使うことが多い
数値解法と実装
Saltelli推定量
定義式はわかったんですけど、実際にどうやって $S_i$ や $S_{Ti}$ を計算するんですか? あの条件付き期待値の分散って、解析的には求められないですよね?
いい質問だ。実務ではSaltelli (2002, 2010) が提案したモンテカルロ推定量を使う。まず2つの独立なサンプル行列 $\mathbf{A}$ と $\mathbf{B}$(各 $N \times k$)を生成する。次に、$\mathbf{A}_B^{(i)}$ という行列を作る——これは $\mathbf{A}$ の $i$ 列目だけ $\mathbf{B}$ の $i$ 列目に入れ替えたものだ。
Saltelli推定量の手順:
Step 1:$N$ 行 $k$ 列のサンプル行列 $\mathbf{A}$ と $\mathbf{B}$ を独立に生成(準モンテカルロ列推奨)。
Step 2:各 $i = 1, \ldots, k$ に対して混合行列 $\mathbf{A}_B^{(i)}$ を構成。$j$ 列目は:
Step 3:モデル $f$ を $\mathbf{A}$, $\mathbf{B}$, $\mathbf{A}_B^{(1)}, \ldots, \mathbf{A}_B^{(k)}$ の全行に対して評価。合計 $N(k+2)$ 回のモデル評価が必要。
Step 4:推定量を計算。
ここで $V[Y]$ は $\mathbf{A}$ と $\mathbf{B}$ の全サンプルから推定する。
つまり、$\mathbf{A}$ と $\mathbf{B}$ の2セットを作って、1列ずつ入れ替えることで「この変数だけ変えたらどうなるか」を調べるんですね。
そう、まさにそれ。この「列入れ替え」トリックのおかげで、定義式の多重積分をモンテカルロで効率よく推定できる。ちなみにJansen (1999) やSobol-Jansen推定量など、$S_{Ti}$ の推定式にはバリエーションがあって、Jansen推定量の方がバイアスが小さいとされている。上に書いたのはJansen推定量だ。
準モンテカルロサンプリング
サンプル行列の生成で「準モンテカルロ列推奨」って書いてありましたが、普通のランダムじゃダメですか?
使えるけど収束が遅い。擬似乱数のモンテカルロは収束速度が $O(1/\sqrt{N})$ だけど、Sobol列やHalton列などの準モンテカルロ法を使うと $O((\log N)^k / N)$ まで改善する。実務では同じ精度を1/10程度のサンプル数で達成できることも多い。
| サンプリング法 | 収束速度 | 特徴 | 推奨場面 |
|---|---|---|---|
| 擬似乱数MC | $O(N^{-1/2})$ | 実装が簡単、クラスタリングあり | 次元数が少なく計算が軽いとき |
| Sobol列(QMC) | $O(N^{-1}(\log N)^k)$ | 低食い違い量、高次元でも有効 | 標準的な推奨。SALibデフォルト |
| Halton列 | 同上 | 高次元で品質劣化しやすい | 低次元($k \leq 10$)向き |
| ラテン超方格(LHS) | $O(N^{-1/2})$程度 | 周辺分布は正確にサンプリング | Sobol列が使えない場合の代替 |
サロゲートモデルとの併用
CAEシミュレーション1回に何時間もかかる場合、$N(k+2)$ 回もモデル評価するのは厳しくないですか? パラメータ10個で $N=1000$ だと12,000回…
まさにそこが実務の壁だ。解決策としてサロゲートモデル(代理モデル)を使う。少ないCAE評価点(数十〜数百点)で応答曲面を構築し、Sobol指標の推定にはサロゲートモデルに大量サンプルを投げる。
- 多項式カオス展開(PCE):展開係数から解析的にSobol指標を直接計算できる。最も効率的
- Kriging(ガウス過程回帰):予測の不確かさも定量化できるのが強み
- ニューラルネットワーク:高次元・強非線形に向くが、学習データ量が必要
PCEだと展開係数からSobol指標が出るんですか! それは便利ですね。
PCEの展開 $Y \approx \sum_{\boldsymbol{\alpha}} c_{\boldsymbol{\alpha}} \Psi_{\boldsymbol{\alpha}}(\mathbf{X})$ で、第1次指標は $S_i = \sum_{\boldsymbol{\alpha} \in \mathcal{A}_i} c_{\boldsymbol{\alpha}}^2 / \sum_{\boldsymbol{\alpha} \neq \mathbf{0}} c_{\boldsymbol{\alpha}}^2$ と、係数の2乗和の比で表される。モンテカルロサンプリングが不要になるから圧倒的に速い。UQLab や OpenTURNS がこの方法をサポートしている。
Bootstrap信頼区間
Sobol指標の推定値には統計的な不確かさが伴う。Bootstrap法で信頼区間を評価するのが標準的だ:
- 元の $N$ サンプルから重複を許して $N$ 個を再サンプリング
- 再サンプリングデータでSobol指標を再計算
- これを $B$ 回(通常1000回以上)繰り返し
- 得られた $B$ 個の推定値からパーセンタイル信頼区間を構成
信頼区間が広い場合はサンプル数 $N$ を増やす必要がある。SALibでは sobol.analyze() の calc_second_order オプションで自動的にBootstrap信頼区間が計算される。
実践ガイド
Sobol解析のワークフロー
実際にSobol解析をやるとき、最初から最後まで何をすればいいんですか?
6ステップだ。
- 問題定義:出力QoI(Quantity of Interest)と入力パラメータ $X_1, \ldots, X_k$ を明確にする。各入力の確率分布(一様分布・正規分布等)を決める
- スクリーニング(任意):パラメータ数が多い場合(20個以上)、まずMorris法で重要でないパラメータを除外する
- サンプル行列生成:Saltelli法で $\mathbf{A}, \mathbf{B}, \mathbf{A}_B^{(i)}$ を生成。SALibの
saltelli.sample()を使うのが最も楽 - モデル評価:生成された全サンプル点でCAEモデルを実行。並列計算を推奨
- Sobol指標の計算:評価結果を集めて推定量を計算。SALibの
sobol.analyze()を使う - 結果の解釈と意思決定:$S_i, S_{Ti}$ からパラメータの重要度をランキングし、設計の最適化や不確かさ低減に反映する
サンプルサイズの決め方
$N$ はどれくらいにすればいいですか? 大きいほど良いのはわかるんですけど、予算もあるし…
目安を表にまとめよう。
| パラメータ数 $k$ | $N$(基本サンプル数) | 総モデル評価回数 $N(k+2)$ | 備考 |
|---|---|---|---|
| 3〜5 | 1,024〜2,048 | 5,120〜14,336 | 直接Sobol法で十分対応可能 |
| 5〜10 | 2,048〜4,096 | 14,336〜49,152 | サロゲートモデル推奨ラインに近づく |
| 10〜20 | 4,096〜8,192 | 49,152〜180,224 | サロゲートモデル必須。事前にMorrisスクリーニング推奨 |
| 20+ | — | — | 直接Sobol法は非現実的。PCEまたはMorris→Sobolの2段階戦略 |
$N$ は2の累乗がいいんですか?
Sobol列(準モンテカルロ)を使うときは $N = 2^p$ が最適。低食い違い量の性質を最大限に活かせる。擬似乱数なら任意の $N$ でいいけどね。
結果の解釈とパラメータ固定
Sobol指標が出たあと、具体的にどういう判断をするんですか?
3つの判断基準だ:
- $S_{Ti} \approx 0$(例えば $< 0.01$)→ そのパラメータは公称値で固定してよい。次元削減
- $S_i$ が大きい → そのパラメータのばらつきを制御(公差を厳しくする等)すれば出力のばらつきを効果的に低減できる
- $S_{Ti} - S_i$ が大きい → 他のパラメータとの交互作用が強い。単独で制御しても効果が薄い場合がある
例えば自動車のドアパネルの板金プレスで、板厚・降伏応力・摩擦係数・プレス速度・ブランクホルダー力の5パラメータがあったとして…
実際そういうケースで、Sobol解析すると典型的にはこうなる:
- 板厚: $S_1 = 0.40,\ S_{T1} = 0.48$ — 最も支配的
- 降伏応力: $S_2 = 0.25,\ S_{T2} = 0.35$ — 2番目に重要、交互作用もあり
- 摩擦係数: $S_3 = 0.12,\ S_{T3} = 0.18$ — 中程度の寄与
- プレス速度: $S_4 = 0.02,\ S_{T4} = 0.03$ — ほぼ影響なし → 固定可
- ブランクホルダー力: $S_5 = 0.08,\ S_{T5} = 0.10$ — 小さいが無視はできない
この結果から、「板厚と降伏応力の管理が最優先」「プレス速度は気にしなくてよい」という明確な設計指針が出る。
Python SALib実装例
SALib(Sensitivity Analysis Library)を使った最小限のコード例:
import numpy as np
from SALib.sample import saltelli
from SALib.analyze import sobol
# 問題定義
problem = {
'num_vars': 3,
'names': ['thickness', 'yield_stress', 'friction'],
'bounds': [[0.8, 1.2], # mm
[200, 350], # MPa
[0.05, 0.20]] # 摩擦係数
}
# Saltelliサンプリング(Sobol列使用)
param_values = saltelli.sample(problem, 2048, calc_second_order=True)
# → shape: (2048*(3+2), 3) = (10240, 3)
# モデル評価(ここを実際のCAEソルバーに置き換える)
Y = np.zeros(param_values.shape[0])
for i, X in enumerate(param_values):
Y[i] = your_cae_model(X[0], X[1], X[2])
# Sobol指標の計算
Si = sobol.analyze(problem, Y, calc_second_order=True,
conf_level=0.95, print_to_console=True)
# 結果
print("S1:", Si['S1']) # 第1次指標
print("ST:", Si['ST']) # 全次指標
print("S2:", Si['S2']) # 2次交互作用指標
print("S1_conf:", Si['S1_conf']) # 95%信頼区間
実務のコツ
CAEモデルの実行にバッチスケジューラ(PBS, SLURM等)を使う場合、SALibのサンプル行列を生成→CSVエクスポート→バッチジョブとして並列投入→結果回収→SALib解析、というフローが効率的。SALibの sample と analyze は独立して呼べるので、モデル評価のステップは自由に実装できる。
ソフトウェア比較
主要ツール比較
Sobol感度解析をやるのに使えるソフトって何がありますか?
オープンソースから商用まで充実している。ざっと比較しよう。
| ツール名 | ライセンス | Sobol推定法 | サロゲートモデル | 特徴 |
|---|---|---|---|---|
| SALib(Python) | MIT(OSS) | Saltelli, Jansen, Martinez | 外部連携 | 最も手軽。CLI/API両対応。Sobol列内蔵 |
| OpenTURNS(Python/C++) | LGPL(OSS) | Saltelli, Martinez, PCE解析的 | PCE, Kriging内蔵 | 不確かさ定量化の総合ライブラリ |
| UQLab(MATLAB) | 無料(学術) | Saltelli, PCE解析的 | PCE, Kriging, SVC | ETH開発。PCEベースが非常に強力 |
| Dakota | LGPL(OSS) | Saltelli | PCE, Kriging, RBF | Sandia国立研究所。大規模HPC向き |
| Ansys optiSLang | 商用 | 自動選択 | MOP(多項式) | Ansys Workbench統合。GUIベースで楽 |
| SimLab | 無料(EU JRC) | Saltelli | なし | 教育・入門向けGUIツール |
| MATLAB UQ Toolbox | 商用 | Sobol, PCE | PCE | MATLAB環境に統合 |
選定の指針
結局どれを選べばいいんですか?
- 初めてSobol解析をやる → SALib一択。pip installして10行で結果が出る
- PCEベースで効率よくやりたい → UQLab(MATLAB)か OpenTURNS(Python)
- 大規模HPCジョブと連携 → Dakota。SLURM/PBS統合がしっかりしている
- GUIで手軽に、Ansys既存ユーザー → optiSLang。Workbenchから直接パラメトリックスタディ
- 相関入力への対応が必要 → OpenTURNSが最も柔軟
先端技術
群Sobol指標(Group Sobol Indices)
パラメータ数がすごく多いとき、グループにまとめて評価する方法ってありますか?
群Sobol指標(Group Sobol Indices)がそれだ。例えば「材料パラメータ群」(ヤング率・ポアソン比・降伏応力)と「幾何パラメータ群」(板厚・フィレット半径)のように、物理的に関連するパラメータをグループ化して、グループ単位での寄与率を評価する。
数学的には、$\mathbf{X}_u = \{X_i : i \in u\}$ としてグループ $u$ のSobol指標を $S_u = V[E(Y|\mathbf{X}_u)] / V[Y]$ と定義する。計算はSaltelli法の拡張で可能。SALibも groups パラメータで対応している。
時間依存Sobol指標
過渡解析の場合、各時刻 $t$ でのSobol指標 $S_i(t), S_{Ti}(t)$ を計算する。時刻によって支配的なパラメータが変わることがあり、例えば衝突解析では:
- 初期($t < 5$ ms):衝突速度 $S_1(t) \approx 0.8$ が支配的
- 中期($5 < t < 20$ ms):材料パラメータが $S_2(t) \approx 0.5$ に増大
- 後期($t > 20$ ms):摩擦や境界条件の影響が増す
時間依存解析では、各時刻を独立にSobol解析するか、主成分分析(PCA)で時系列データを縮約してからSobol解析を行う方法がある。
Shapley効果との比較
最近「Shapley効果」っていうのを聞いたんですけど、Sobol指標と何が違うんですか?
ゲーム理論のShapley値を感度解析に応用したものだ。Sobol指標は入力変数が独立であることを前提にしているが、Shapley効果は相関のある入力にも対応できる。
Shapley効果 $Sh_i$ は、変数 $X_i$ のすべての可能な結託(サブセット)に対する限界的な分散寄与の平均として定義される。$\sum_{i=1}^k Sh_i = V[Y]$ が常に成立し、「公平な分配」を実現する。ただし計算コストは $O(2^k)$ のサブセット評価が必要で、パラメータ数が増えると爆発する。
| 特性 | Sobol指標 | Shapley効果 |
|---|---|---|
| 入力の独立性 | 必要 | 不要(相関OK) |
| $\sum_i = V[Y]$ の保証 | $\sum S_i \leq 1$(等号は加法的のとき) | 常に等号成立 |
| 交互作用の分離 | $S_i$ と $S_{Ti}$ で明確に分離 | 交互作用は分配される |
| 計算コスト | $O(N \cdot k)$ | $O(N \cdot 2^k)$ |
| 実装ツール | SALib, Dakota, UQLab, etc. | shapley_effects(R/Python) |
トラブルシューティング
指標が負になる
SALibで計算したら $S_i$ がマイナスになったんですけど… 定義上は0以上ですよね?
よくある問題だ。原因は主に2つ:
- サンプル数 $N$ が不足:推定量はモンテカルロ推定なので、$N$ が小さいと統計的な揺らぎで負値が出る。$N$ を倍にして再計算してみよう
- そのパラメータの真の $S_i$ がほぼゼロ:寄与がゼロに近い変数は推定量のノイズに埋もれて負になりやすい。信頼区間を見て、ゼロをまたいでいるなら「影響なし」と判断して問題ない
$\sum S_i$ が1を超える
第1次指標を全部足したら1.15になったんですが…
理論的には $\sum S_i \leq 1$ だから、これも推定精度の問題だ。対処法:
- $N$ を増やす(最低でも2048以上)
- Sobol列(QMC)を使っているか確認。擬似乱数だと収束が遅い
- モデル出力に外れ値・不連続がないか確認。シミュレーションが途中で破綻しているケースがある
$N$ を増やしても収束しない
$N$ を2048、4096、8192と増やしたのに $S_i$ の値がかなり変わるんです。
これは深刻なケースだ。可能性としては:
- モデルの出力分散が非常に大きい(裾の重い分布)→ 出力のロバスト化(対数変換等)を検討
- 入力に相関があるのに独立を仮定している → 相関を考慮した手法(Kucherenko法、Shapley効果)に切り替え
- モデルが非常に強い非線形性を持つ → サロゲートモデルで平滑化してからSobol解析を行う
- モデルにノイズがある(確率的シミュレーション)→ 同一入力で複数回実行して出力を平均する
まずは「$N$ を倍にしたときに推定値の変化が10%以内に収まるか」を収束判定の目安にするといい。
よくある失敗TOP3
- Morris法なしでいきなり高次元Sobol解析 — パラメータ20個以上でSaltelli法を直接適用すると、$N(k+2) = N \times 22$ 回のモデル評価が必要。まずMorris法で10個以下に絞るのが定石
- $S_i$ だけ見て $S_{Ti}$ を無視 — 交互作用が強いパラメータを見落とし、パラメータ固定後に予測精度が劣化する
- 入力の確率分布を適当に設定 — 一様分布の範囲を広くしすぎると非物理的な領域まで探索し、Sobol指標の値が実態と乖離する。事前に物理的に妥当な範囲を吟味すること
関連トピック
なった
詳しく
報告