Network)について学習したことをまとめます。様々なところで先人が取り組まれており,以下のサイトを参考にさせていただきました。Network)では,大量の教師データを用意して,モデル出力が教師データと一致するように重みを最適化していきます。この学習方法は教師データが存在する入力変数の範囲で誤差を最小化しているだけで,データが存在しない範囲ではどれだけモデルが極端な挙動をしたとしても制御することは難しいです。そこで,教師データへの当てはまりだけでなく,データの生成ロジック(支配方程式)に対する当てはまりも評価するように学習方法を改良したものがPINNです。このデータは通常のNNの仕組みと同様,モデル出力との誤差をとるための教師データとして扱います。空間座標)の形式になっており,物理量uが含まれていません。物理量をあらかじめ教師データとして与えるのではなく,学習途中でモデルが吐き出す物理量uをもとに支配方程式の残差を計算します。教師データとの一致を見つつも,支配方程式にも適合するような物理量を出力するように学習が行われます。コードパッケージのインポート必要パッケージをインストールします。モデルの中身まで細かく定義する必要があるので,今回はpytorchを用います。境界条件(初期条件,固定壁条件)に沿ったデータをそれぞれ100件ずつ作成します。時間tと空間座標xは乱数で生成します。物理量uは初期条件の場合はsin関数,固定壁条件の場合は0を埋め込んでいます。支配方程式の残差の評価には,乱数で生成した5000点を用います。u_initial)plt.show()モデルの作成モデルを定義します。NNクラスは一般的なニューラルネットワークです。これをBurgersPINNクラスのイニシャライザに渡すことで,Physics-Informedな学習ができるようになります。f特に重要なのはBurgersPINN内のfit()関数の以下の部分です。通常のNNでは教師データのuとモデル出力u_predから損失関数を計算しますが,ここではloss_piという項が追加されています。これが,モデル出力から計算した支配方程式の残差となります。pi_weight支配方程式の残差はnet_f関数によって計算されます。ここが面白いポイントで,pytorchの自動微分機能(auto_grad)を使うことで,x,t,u等の変数同士の微分が簡単に計算できます。通常このような非線形式は厳密解がないものも多く,解くためにかなり緻密な変換を要する(今回挙げているバーガース方程式も「コール・ホップ変換」というものが必要となる)のですが,NN内で物理量を処理することでこのような恩恵が得られます。学習1000エポック分の学習を行います。label='loss_pi')plt.legend()loss_uに比べてloss_piのオーダーが大きすぎるかもしれません。ここはパラメータの調整次第かなと思います。物理量uと支配方程式の残差fを可視化します。32)plt.colorbar()plt.show()期待通り,全領域で残差fが0に近づき,物理量uの分布も支配方程式に沿ったものになっています。0.75に固定して,物理量uと残差fをプロットしました。まとめPINNの基本としてバーガース方程式の検討を行いました。次は,より高度な支配方程式に基づいたモデルにチャレンジしたいと思います。雰囲気データサイエンティストの。