流体力学で考える

日常にある流体を“見える化”するブログ

深層学習

2次元キャビティ流れのPINNで学習に失敗した話

公開: 2026-04-09更新: 2026-04-10
2次元キャビティ流れのPINNで学習に失敗した話

先日、Physics Informed Neural Networks(PINN)を用いて2次元キャビティ流れを解く記事をアップしました。この実装にあたっては、実は何回か学習に失敗しています。この記事では、2次元キャビティ流れのPINNの作成を通じてどのような失敗をしたかと得られた気付きについて説明します。2次元キャビティ流れのPINNの記事を先に読むことをお勧めします。

失敗1: 境界条件の損失関数の設計

コーナーの速度不連続問題

キャビティ流れでは、上辺(移動壁)は u=1m/su = 1\,\mathrm{m/s}、左・右・下辺(静止壁)は u=0m/su = 0\,\mathrm{m/s} という境界条件を持ちます。

問題になるのは上辺と側壁が接するコーナーです。コーナー点は「移動壁上の点(u=1u = 1)」でありながら「静止壁上の点(u=0u = 0)」でもあるという矛盾した境界条件を持ちます。この速度の不連続はNavier-Stokes方程式の古典的な特異点として知られており、数値計算でも特別な扱いが必要になります。

重みなし損失関数での失敗

最初に試した損失関数は、上辺の全点に一様な損失をかける設計でした。

bc_loss["topwall_u"] = torch.mean((flow_topwall_out[:, 0:1] - u_top) ** 2) bc_loss["topwall_v"] = torch.mean((flow_topwall_out[:, 1:2]) ** 2)

この設計では、コーナー付近の点でもネットワークに u=1u = 1 を強制します。しかし隣接する静止壁の損失では同じコーナー付近で u=0u = 0 を要求します。ネットワークはこの矛盾した要求を同時に満たそうとするため、コーナー近傍で不自然な速度分布が生じました。

重み付き損失関数による改善

この問題への対処として、上辺の損失にコーナーで 00 になる重みを導入しました。

w(x)=12x,x[0.5,0.5]w(x) = 1 - 2|x|, \quad x \in [-0.5,\, 0.5]

xx はキャビティ中心を原点とした座標です。x=0x = 0(上辺中央)では w=1w = 1、コーナー x=±0.5x = \pm 0.5 では w=0w = 0 になります。これにより、コーナー付近では境界条件の損失寄与がゼロになり、矛盾した制約をネットワークに課さずに済みます。

topwall_weighting = 1 - 2 * torch.abs(topwall_points[:, 0:1]) bc_loss["topwall_u"] = torch.mean(topwall_weighting * (flow_topwall_out[:, 0:1] - u_top) ** 2) bc_loss["topwall_v"] = torch.mean(topwall_weighting * (flow_topwall_out[:, 1:2]) ** 2)

重みあり・なしの速度プロファイル比較を以下に示します。

重みなし:

重みあり(改善後):

重みなしではCFD参照解との乖離が大きく、特に壁面近傍で誤差が顕著でした。重みを導入することでプロファイルが参照解に近づきました。

PINNの損失関数は複数の項から構成されますが、矛盾した制約を持つ点には損失を与えないという設計が重要です。どの境界条件をどの強さで課すかが学習の成否を左右します。

失敗2: コロケーション点数の不足

コロケーション点とPDE残差の関係

PINNのPDE損失は、領域内部のコロケーション点(サンプリング点)における方程式残差の平均です。

LPDE=1Ni=1Nf(xi)2\mathcal{L}_\mathrm{PDE} = \frac{1}{N}\sum_{i=1}^{N} |f(\mathbf{x}_i)|^2

ここで f(xi)f(\mathbf{x}_i) は点 xi\mathbf{x}_i におけるPDEの残差、NN はコロケーション点数です。この損失は、領域全体にわたるPDE残差の積分

Ωf(x)2dx\int_\Omega |f(\mathbf{x})|^2 \, d\mathbf{x}

のMonte Carlo推定と解釈できます。NN が小さい分だけカバーできる範囲が狭くなり(=サンプリングされなかった領域が広くなり)、NNにPDEの制約を十分に課せていないことになります。

点数の違いによる精度の比較

以下は、コロケーション点数を少なくした場合(内部点を大幅に減らした場合)との比較です。

点数少(改善前):

点数多・ベースライン(改善後):

点数が少ない場合は、速度プロファイルがCFD参照解から大きく外れていました。点数を増やすことで、領域全体でのPDE残差が均一に小さくなり、精度が向上しました。

今回のベースラインでは表面から2,000点、内部から10,000点をサンプリングしています。PINNでは点数を増やすほど精度が向上しますが、1ステップあたりの計算コストも増加します。点数と計算コストのトレードオフを意識しながら設定する必要があります。

まとめ

2次元キャビティ流れのPINNを作成する中で、以下の2点が学習の成否に大きく影響しました。

  • 境界条件の特異点(コーナーの速度不連続)には、重み関数 w(x)=12xw(x) = 1 - 2|x| を使って重視したい境界条件を制御できる
  • コロケーション点数はPDE残差のMonte Carlo推定の分散に直結するため、十分な点数(今回は内部10,000点)が必要

PINNはNavier-Stokes方程式の残差を損失関数に組み込むだけで解が得られる一方、損失関数の設計とサンプリング戦略が精度に直接影響します。標準的なCFDにはない設計の自由度がある分、こうした失敗も生じやすいです。

さらに深く学ぶための書籍

本記事のテーマをより深く学びたい方には、以下の書籍をおすすめします。

入門・学部レベル

  • ゼロから作るDeepLearning(斎藤康毅、オライリー・ジャパン):ニューラルネットワークと自動微分の仕組みをゼロから実装しながら学べる一冊です。Physics Informedについての記述はありませんが、行間が丁寧で分かりやすく、ニューラルネットワークの学習を深く理解するには非常に役立ちます。

発展・大学院レベル

  • Data-Driven Science and Engineering: Machine Learning, Dynamical Systems, and Control(Steven L. Brunton・J. Nathan Kutz、Cambridge University Press):データ駆動型の流体力学・物理シミュレーションを体系的に解説しており、PINNを含む最新手法を学ぶのに適した一冊です。

参考文献

  • M. Raissi, P. Perdikaris, G.E. Karniadakis, "Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations", Journal of Computational Physics, Vol. 378, pp. 686–707, 2019. DOI: 10.1016/j.jcp.2018.10.045
  • U. Ghia, K.N. Ghia, C.T. Shin, "High-Re solutions for incompressible flow using the Navier-Stokes equations and a multigrid method", Journal of Computational Physics, Vol. 48, pp. 387–411, 1982.