【翻訳】Neural Networks for Steady-State Fluid Flow Prediction : Part 1

AIの流体解析への応用に興味があり、[タイトルの記事](https://medium.com/@jannik.zuern/neural-networks-for-steady-state-fluid-flow-prediction-part-1-856ef056da54)に辿り着きました。
本記事は、その純粋な日本語訳です。肉付けや私個人の解釈は一切載せておりません。　
記事は3パートに分かれていますので、残りについても和訳次第順次アップロードして行きます。

尚、著者Jannik Zürn氏の直接の許可を頂いた上で翻訳しております。
また、忠実な訳を心がけ、極力意訳はしないようにしています。
しっくりくる日本語が見当たらない場合は、（）付きで英語も記載しております。
翻訳自体は、以前にインターネットの翻訳コンテストにはじめて応募して入賞致しました。
自分自身の英語力の向上にも寄与することを期待しています。
「AI x CFD」に挑戦されている、あるいはこれから挑戦しようとしている方々のお役に立てれば幸いです。

#Neural Networks for Steady-State Fluid Flow Prediction : Part 1

この記事は、ニューラルネットワーク、特にFCNが、事例から学習することにより、障害物周りの流体の流れをどのように学習するかについての大観を説明することを目的としている。

この一連の記事は、３つのパートに分けられている。

#####パート1：CFDに対するデータ駆動型の手法

#####パート2：実装の詳細

#####パート3：結果


###導入
数値流体力学(CFD)を用いて流体流れの問題を解くことは、計算機のハードと計算時間の両方の観点において、過酷となりうる。
ニューラルネットワーク(Artificial Neural Networks:ANNs)は、普遍的に近似することができるもの(Universal approximators)であり、多数の変数間の非線形の依存関係を学習することができる。本記事は、CFDの精度の大半を維持しつつも、計算時間をかなり減少させるために、ANNsを流体流れの問題を解くことに応用することを目的としている。

層流に対してなされる重要な観察によってもたらされるのは、シミュレーション領域内のある点の流体の流れが、離れた所の流れにそれほど依存しないのに対して、その近傍の流れに大部分を依存しているという事実である。流体の障害物の形状が変化したためにある領域の流体の流れが変化するならば、この領域の近傍に変化が見られる一方、シミュレーション領域から遠方の全体の振る舞いには大きな変化が見られないと想像できる。最新の数値ソルバーは、障害物の小さな変化と結果として生じる流れの僅かな変化との直接的な関係を活用していない。数値ソルバーには、以前のシミュレーションの「記憶」が全くない。本研究は、シミュレーションした形状と発達した流れとの間の関係を学習することを組み合わせて、以前のシミュレーションの記憶をANNにより学習可能であることを主張する。ANNへの十分な訓練データと適切なネットワークアーキテクチャを与えることで、ニューラルネットワークがうまくいけば高精度で以前見たことがない形状の流れ場を予測することができると期待できる。一旦ネットワークが訓練されると、ある状況の下では流体流れ場の推測が迅速に行われることによって、このCFDに対するデータ駆動型の手法に計算時間の優位性がもたらされる。

###訓練データをつくる
ニューラルネットワークは、単に対象物の形状のみに基づいた流体の振る舞いを予測することができて然るべきである。単純化のため、本研究ではネットワークに流速ベクトルを予測させることにのみ焦点を当てる。密度や圧力などの他の重要な場の量はネットワークの訓練データの一部としていないが、原理的に考慮することは可能である。

障害物の形状、向き、サイズに関して十分に多様なトレーニングセットを作るために、異なる種類と形状のジオメトリを作る方法が見つけられなければならなかった。形状に求められるのは、ニューラルネットワークに異なる種類の形状とそれぞれに応じた周囲の流れ場の関係性を学習させるのに十分に多様であるということに加えて、具体的なジオメトリのトポロジーに応じてメッシュのパラメータをカスタマイズする必要なしに、メッシュが作成可能でなければならないということである。このような制約の為に、本研究ではランダムな二次元多角形を作成する事に焦点を当てた。視覚的な人工物(visualization artifacts)を避け、滑らかな形状を作るために、障害物周辺の尖った角はラプラシアンフィルターによる平滑化処理を使って、滑らかにしている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360150/233f1dc3-f776-f915-6821-0a6c1544cb4e.png)
　　　　　　　　　　　　　トレーニングデータとして使われた平滑化された多角形

対処すべき重大な問題は、シミュレーション設定のジオメトリがどのようにニューラルネットワークに代表されるのかということである。特定の形状周りの流体の流れをシミュレーションするために、ジオメトリはメッシュに変換されなければならない。このメッシュは、四面体あるいは六面体などの基本的な要素からなる。僅かにシミュレーションされるジオメトリを修正したり、あるいは要素サイズなどのメッシュのパラメータを変化させるだけで、メッシュにおける要素のパラメータと要素の全体の数が変わる可能性がある。FCNは全くサイズが同じ入力対象のみを扱うように設計されている。任意のメッシュを規則的な格子点の値にマッピングする明快な方法は、メッシュをボクセル化する(voxelize)ことである。この処理は、メッシュを規則的な格子に重ね合わせて、各点においてメッシュの内容に応じて値をそれぞれの格子セルに割り当てることによって達成される。このプロセスはボクセル化(voxelization)と呼ばれる。格子はあらゆる入力のジオメトリに対して全く同じ次元を持っているので、ジオメトリのトポロジの詳細を保存したままに、あらゆる入力のジオメトリに対して単一のネットワークアーキテクチャを可能としている。

　　　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360150/08e7672e-0d2c-0937-3184-174bdda69b64.png)　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360150/7eb86e3b-19fe-dd22-8d3c-e05667470220.png)

　　　　　　　　　　　　　　　　　垂直y方向(左)と水平x方向(右)の流速分布

シミュレーションデータは同様にボクセル化されている。したがって、シミュレーションデータはテンソル［高さ,幅,2］からなる。なぜならば、二次元速度ベクトルには2つの速度の要素があるからである。

訓練データを作るための全体的な作業の流れは、以下のように集約することができる。

1. <b>ジオメトリ生成</b>：異なる形状を持つ個なる障害物のジオメトリを作成する。それらジオメトリは後のメッシュ作成プログラムへインポートする為にSTLファイル及びジオメトリのボクセル格子の情報を含むNumpy配列としてエクスポートされる。

2. <b>OpenFOAM caseファイル設定</b>：ステップ2では、テンプレートとなるcaseファイルからジオメトリに固有なOpenFOAM caseファイルを生成し、ステップ1で作成されたジオメトリを挿入する。

3. <b>メッシュ作成</b>：作成された障害物のジオメトリのメッシュを生成する。

4. <b>シミュレーション</b>：具体的なOpenFOAM caseファイルをシミュレーションする。一旦、収束条件が満たされると、シミュレーションは修了する。この条件とは、最大のステップ数あるいは無視できる程の残差として設定される。

5. <b>ポスト処理</b>：このステップでは、OpenFOAMのcaseファイルの結果は、VTKファイル形式に変換されて、pixel/voxelという結果がparaViewを使って生成され、ディスクに保存される。

　　　　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360150/0344a41d-dc68-6b01-a99b-3744112e74ee.png)
全体的なOpenFOAMによるシミュレーションの設定。流体は、inletよりシミュレーション領域に流れ、障害物の周囲に到達し、outletよりシミュレーション域から出ていく。



###ネットワークアーキテクチャ
FCNは、入力画像のピクセル単位でのクラス分けを行う画像のsegmantationタスクに広く使われている。それぞれのクラスは、検出された物体のタイプ（例えば、自動車、歩行者、犬）に対応している。この特性は、ちょうどCNNのように最初に入力画像をスケールダウンし、畳込みとプーリング処理を適用することによって達成される。しかしながら、CNNとは対照的に、次のステップでは、その画像はいわゆる逆畳み込み処理（転置畳み込みとしても知られる）を使ってスケールアップされる一方で、ピクセル毎に割り当てられるラベルは保存される。仮に、入力と出力がひっくり返ると、逆畳み込み層は、畳込み層と同一であある。したがって、FCNは任意の形状の入力を受け入れ、訓練中に与えられた訓練データに基づく入力テンソルのそれぞれのエントリに数値を割り当てることが可能である。


したがって、FCNは障害物のボクセル格子を受け入れ、障害物周りの流体の流れを予測しようとし、OpenFOAMシミュレーションから得られる正解データと比較することが可能である。

この論文に使用されたネットワークアーキテクチャは、
[https://github.com/loliverhennigh/Steady-State-Flow-With-Neural-Nets](https://github.com/loliverhennigh/Steady-State-Flow-With-Neural-Nets)
を適用している。

ネットワークアーキテクチャは、すべての畳込みが保たれていて、residual connectionsとU-Networkアーキテクチャ両方の利点を得ている。これによって、早い計算速度を保ちつつも、精度を劇的に向上させることを示した。流体の流れの予測という文脈において、ネットワークのタスクは浮動小数点の数値を、ピクセル毎にある位置の流れの速度を代表する入力テンソルに割り当てることである。

流体の速度ベクトルは二次元において２つの要素を持っているので、FCNは2つのテンソル即ち、x方向の流速に対応するテンソルとy方向の流速に対応するテンソルを出力する。具体的には、ニューラルネットの出力は、次元[バッチサイズ,幅,高さ;2]である。このネットワークは、PixelCNN++から着想を得たいくつかの要素を利用している。

###制限事項
層流の流れは、周囲を流体が流れるジオメトリによって与えられる予測可能なパターンに従い、適切なニューラルネットワークはシミュレーションされたジオメトリと最終的な流体の流れとの間の非線形な依存関係を取り出すかもしれない。実際には、流体の流れの構造は障害物の形状だけでなく、粘性や密度、温度などの流体の特性にも依存している。他のパラメータには、境界条件の種類や化学反応、そしてそれ以上のもっと多くのものも含まれている。レイノルズ数のより大きな部分的な乱流あるいは完全に発達した乱流については、CFDに対するデータ駆動型の手法によってモデル化することができないほどのより複雑な振る舞いを示す。

流体の流れの物理的に正確なモデルは、流速v(x)、密度ρ(x)、圧力p(x)そしてエネルギーe(x)の場の量を説明する。しかしながら、低流速かつ化学反応の発生しない層流の設定においては、シミュレーション領域内に置いて流体の密度、圧力そしてエネルギーはおよそ一様に分布しているので、無視することができる。したがって、データ駆動型の手法においては流体の流れの速度のみに着目した。

本研究では、トレーニングデータの生成の為にある一定の流体のパラメータと境界条件が選ばれた。結果として、シミュレーションされたジオメトリと流体の流れとの間の学習された依存関係は、シミュレーションのパラメータが訓練データの生成に使われたものと同じか、それに近いシミュレーション設定の部分的なセットに対してのみ有効である。これらのシミュレーションのパラメータは、本手法におけるニューラルネットの入力に組み込まれていないので、このネットワークが事前に学習されなかったシミュレーションパラメータに一般化できるとは期待していない。


###結言
我々は、与えられた訓練データを用いて、FCNが層流の振る舞いを学習することができることを見てきた。

流体の流れの予測のために素晴らしいFCNの実装を行ってくれた[https://github.com/loliverhennigh](https://github.com/loliverhennigh)に深く感謝します。彼は、とてつもなく大きなインスピレーションを私に与えてくれました。