生成モデルで形状を作る — VAE・GAN・拡散モデルをCFDのShapeGeneratorとして使う
はじめに
CFDの形状最適化では、翼型ならキャンバーや翼厚、流路なら断面積比や曲率半径といった数個〜数十個のパラメータで形状を表すのが一般的です。 以前CFD最適化システムのクラス設計という記事で、形状最適化ループを ShapeGenerator / Solver / Evaluator / Optimizer という4つの責務に分解する考え方を紹介しましたが、このパラメトリックな表現は ShapeGenerator の最も素朴な実装にあたります。
ただしパラメトリック表現には天井があります。 パラメータ数を絞るほど最適化はしやすくなりますが、その分だけ表現できる形状のバリエーションも狭くなります。 逆に自由度を上げようとすると、今度は「もっともらしい形状」を保つのが難しくなります。 制御点を好き勝手に動かせば、すぐに製造不可能な、あるいは流体力学的に意味のない形状ができあがってしまいます。
生成モデルは、この問題に別の角度から答えます。 既存の設計データという「もっともらしい形状の集合」から出発し、そこに共通する構造を低次元の潜在空間として学習する。 最適化はパラメータ空間ではなく、この潜在空間の中で行う。 そうすることで、少ない自由度のまま、パラメトリック表現よりずっと広い形状のバリエーションを扱えるようになります。
今回は VAE・GAN・拡散モデルという3つの生成モデルを順に辿り、最後にこれらを ShapeGenerator としてどう組み込むかを考えます。
潜在空間を学習する — VAE
VAE(Variational Autoencoder)は、エンコーダで形状 を潜在変数 に写し、デコーダで から を再構成するように学習します。 学習の目的関数は次のELBO(証拠下限)です。
第1項は再構成の良さ、第2項は潜在変数の分布 を事前分布 (通常は標準正規分布)に近づける正則化です。 この正則化があるおかげで、潜在空間には「近くの点は近い形状に対応する」という滑らかな構造ができます。
この滑らかさが、ShapeGeneratorとして使うときに効いてきます。 を直接最適化変数として扱えば、既存の連続最適化手法やベイズ最適化がそのまま使えます。 以前最適化手法の選択やベイズ最適化を理解するで扱った話が、パラメータの代わりに潜在変数を対象として素直に乗ってくるわけです。
弱点は生成される形状がぼやけやすいことです。 再構成誤差を画素・ボクセル単位の平均で評価するため、細かい凹凸やエッジが平均化されて丸まってしまう傾向があります。
敵対的学習で鮮明さを取り戻す — GAN
GAN(Generative Adversarial Network)は、潜在変数 から形状を作るGeneratorと、それが本物か生成物かを見分けるDiscriminatorを敵対的に学習させます。
Generatorは Discriminator を騙せるように、Discriminatorは騙されないように、互いに競わせながら学習を進めます。 再構成誤差の平均化を経由しないため、VAEより鮮明でリアルな形状が生成される傾向があります。
一方で、この方式は学習が不安定になりやすいことで知られています。 Generatorが限られた種類の形状ばかり出力するようになるモード崩壊が典型例です。 また、潜在空間の滑らかさもVAEほどには保証されません。 ELBOのような正則化項がないため、 を少し動かしただけで形状が大きく飛ぶ領域ができやすく、最適化変数としてそのまま扱うには工夫が要ります。
ノイズ除去過程として生成する — 拡散モデル
拡散モデルは、データに少しずつノイズを加えていく forward process と、その逆をたどってノイズから形状を復元する reverse process の組で構成されます。
forward processは単純にノイズを加えるだけなので学習は不要です。 学習するのは、これを逆にたどる reverse process です。
実装上は、各ステップで加わったノイズ をモデル に予測させる、次の単純な目的関数で学習することが多いです。
GANのような敵対的な最適化がなく、目的関数がノイズ予測という素直な回帰問題に帰着するため、学習はVAE・GANに比べて安定しやすく、生成される形状の多様性も高くなる傾向があります。 さらに、reverse processの各ステップに目標性能や境界条件を条件として与えるconditional diffusionにすれば、「この性能を満たす形状を生成する」という逆設計(inverse design)の方向にも使えます。
弱点は生成コストです。 1つの形状を作るのに reverse process を数十〜数百ステップ繰り返す必要があり、VAEやGANの1回のデコードに比べて明らかに重くなります。 ステップ数を減らす高速化手法も研究されていますが、それでも「最適化の1反復ごとに新しい形状を1つ生成する」という使い方には、まだコストの重さが残ります。
ShapeGeneratorとしての組み込み方
以前の記事のクラス設計に戻ると、ShapeGeneratorの責務は「設計変数を受け取り、形状を返す」ことでした。 生成モデルを使う場合、この設計変数の実体が潜在変数 に置き換わり、ShapeGeneratorの中身は学習済みデコーダの推論呼び出しになります。 Solver・Evaluator・Optimizerは変わらず、Optimizerが探索する変数の意味だけが「翼厚・キャンバー」から「潜在空間上の座標」に変わるイメージです。
ここまで見た3つの生成モデルは、この差し替えのしやすさが異なります。 VAEは潜在空間が滑らかなので、Optimizerをほぼそのまま流用できます。 GANは生成品質は高いものの、潜在空間の構造が保証されないため、Optimizerが有効に探索できない領域ができてしまうことがあります。 拡散モデルは、Optimizerが1点ずつ問い合わせて逐次探索する使い方には生成コストが重く、むしろ条件付き生成で目標性能に近い形状候補をまとめて多数サンプリングし、そこからSolver・Evaluatorで絞り込むという使い方のほうが相性が良いはずです。
実務上の壁
生成モデルをShapeGeneratorとして使うには、まず学習データとして十分な量の既存設計データが必要です。 これは以前CFDデータのデータマネジメントで触れたAI Readyの話がそのまま前提になります。 境界条件やメッシュ生成ロジックが揃っていない寄せ集めのデータでは、潜在空間が学習対象のデータセットの癖を強く反映してしまい、実際に欲しい設計空間をカバーできません。
もう1つの壁は、生成された形状の物理的な妥当性です。 潜在空間上のある点をデコードした結果が、メッシュとして破綻していたり、明らかに製造不可能だったりすることがあります。 これはVAE・GAN・拡散モデルのいずれにも共通する問題で、生成後にSolverへ渡す前の形状バリデーションや修復処理が別途必要になります。
形状をどう表現するか(ボクセル、SDF、点群、メッシュ)という選択も避けて通れません。 これは以前サロゲートモデルのアーキテクチャを選ぶで扱ったCNN・PointNet・GNNの使い分けと表裏一体で、生成モデルのエンコーダ・デコーダ側にも同じ制約がかかってきます。
整理すると
| モデル | 学習の安定性 | 潜在空間の滑らかさ | 生成品質 | 逆設計への向き | 生成コスト |
|---|---|---|---|---|---|
| VAE | 安定 | 滑らか(最適化向き) | ぼやけやすい | △ | 低い(1回のデコード) |
| GAN | 不安定になりやすい | 保証されない | 鮮明 | △〜○(条件付きGAN) | 低い(1回のデコード) |
| 拡散モデル | 比較的安定 | 明示的な保証はないが多様性は高い | 高い | ○(conditional diffusion) | 高い(多段のステップ) |
おわりに
生成モデルは、パラメトリック表現では届かなかった形状の自由度を最適化に持ち込む手段として、ShapeGeneratorの選択肢を広げてくれます。 ただしVAE・GAN・拡散モデルは得意なことが違うので、「Optimizerで潜在空間を直接探索したいのか」「目標性能から形状を逆生成したいのか」という目的から逆算してモデルを選ぶ必要があります。 そして、どのモデルを選んでも、学習データのAI ReadyさとSolverに渡す前の形状バリデーションという実務上の壁は残ります。 生成モデルは魔法ではなく、これまで整理してきたCFD最適化システムのいち部品として、既存の設計と地続きに組み込むものだと捉えるのが実務的だと思います。
