著者: Wang Liqi、インテル エッジ コンピューティング イノベーション アンバサダー
1. PINN - 物理的制約を追加するニューラル ネットワーク
物理情報に基づく物理情報ニューラル ネットワーク (PINN) は、教師あり学習タスクを解決するために使用されるニューラル ネットワークの一種で、従来のニューラル ネットワークのようにトレーニング データ サンプルの分布規則を学習できるだけでなく、説明されている物理法則も学習できます。数学の方程式によって。純粋なデータ駆動型のニューラル ネットワーク学習と比較して、PINN はトレーニング プロセス中に物理情報の制約を課すため、より少ないデータ サンプルを使用して、より優れた汎化機能を備えたモデルを学習できます。この記事では主にこのニューラル ネットワークと関連アプリケーションを分析します。
1.論文の紹介
物理学に基づいたニューラル ネットワーク: 非線形偏微分方程式を含む順問題および逆問題を解決するための深層学習フレームワーク。
https://www.sciencedirect.com/science/article/pii/S0021999118307125
2019年、ブラウン大学応用数学の研究チームは、物理方程式を演算上の制約として使用する「物理的インスピレーションを受けたニューラルネットワーク」(PINN)を提案し、計算物理学の分野で権威ある雑誌であるJournal of Computational Physicsに発表した。計算物理学)。この論文は出版されると大きな注目を集めました。コード システムが完全であるため、このペーパーにより、開発者は関連する学習フレームワークをさまざまな分野に簡単に適用できます。そのため、出版後すぐに、他の研究者によって一連の異なる PINN が開発されました。PINN は、AI 物理学の分野における現在の論文で最も一般的なフレームワークおよび語彙の 1 つであると言っても過言ではありません。
2.アルゴリズムの説明
いわゆる物理ニューラル ネットワークでは、トレーニング結果が物理法則を満たすように、実際には物理方程式を制約としてニューラル ネットワークに追加します。そして、このいわゆる制限はどのように達成されるのでしょうか? 実際、物理方程式の反復間の差をニューラル ネットワークの損失関数に追加することにより、物理方程式もトレーニング プロセスに「参加」します。このようにして、ニューラル ネットワークは、トレーニングの反復中にネットワーク自体の損失関数だけでなく、物理方程式の各反復における差異も最適化するため、最終的なトレーニング結果は物理法則を満たすようになります。
2.ディープXDE
DeepXDE は、ブラウン大学の George Karniadakis 教授の指導のもと、2018 年夏から 2020 年夏にかけて Lu Lu によって開発され、PhILM によってサポートされています。DeepXDE はもともとブラウン大学の Subversion で SciCoNet (Scientific Computing Neural Networks) という名前で自己ホストされていました。2019 年 2 月 7 日、SciCoNet は Subversion から GitHub に移行し、名前が DeepXDE に変更されました。
1.DeepXDEの機能
DeepXDE は上記のアルゴリズムの多くを実装しており、多くの機能をサポートしています。
- 任意のメッシュ生成を必要としない複雑なドメイン ジオメトリ。原始的な幾何学的形状は、間隔、三角形、長方形、多角形、円盤、直方体、および球です。他のジオメトリは、和集合、差分、交差の 3 つのブール演算を使用して構築ソリッド ジオメトリ (CSG) として構築できます。
- マルチフィジックス、つまり (時間依存の) 結合偏微分方程式。
- 5 種類の境界条件 (BC): ディリクレ、ノイマン、ロビン、周期的および一般 BC は、任意の領域または点のセットで定義できます。
- (スタック/非スタック) 完全接続ニューラル ネットワーク、残差ニューラル ネットワーク、(時空間) マルチスケール フーリエ特徴ネットワークなどのさまざまなニューラル ネットワーク。
- 6 つのサンプリング方法: 一様サンプリング、擬似ランダム サンプリング、ラテン超立方体サンプリング、ハルトン数列、ハンマーズリー数列、ソボル数列。
- トレーニング ポイントは、トレーニング中に一定に保つことも、特定の反復ごとにリサンプリングすることもできます。
- トレーニング中にモデルを保存し、トレーニングされたモデルをロードすると便利です。
- ドロップアウトを使用した不確かさの定量化。
- 早期停止など、トレーニング中にモデルの内部状態と統計を監視するための、さまざまな (重み付けされた) 損失、オプティマイザー、学習率スケジュール、メトリクスなどのコールバック。
- ユーザーコードを数式のようにコンパクトにします。
- DeepXDE のすべてのコンポーネントは疎結合であるため、DeepXDE は適切に構造化され、高度に構成可能になっています。
- DeepXDE は、新しいニーズに合わせて簡単にカスタマイズできます。
2. 数値例
(1)、問題設定
次の式で与えられる非線形シュレーディンガー方程式を解きます。
周期境界条件は次のとおりです。
初期条件は次のとおりです。
Deepxde は実数のみを使用するため、複素偏微分方程式の実数部と虚数部を明示的に分割する必要があります。
単一の残差の代わりに:
2 つの (実数値) 残差が得られます。
ここで、u (x, t) と v (x, t) はそれぞれ h の実数部と虚数部を表します。
import numpy as np
import deepxde as dde
# 用于绘图
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
x_lower = -5
x_upper = 5
t_lower = 0
t_upper = np.pi / 2
# 创建 2D 域(用于绘图和输入)
x = np.linspace(x_lower, x_upper, 256)
t = np.linspace(t_lower, t_upper, 201)
X, T = np.meshgrid(x, t)
# 整个域变平
X_star = np.hstack((X.flatten()[:, None], T.flatten()[:, None]))
# 空间和时间域/几何(对于 deepxde 模型)
space_domain = dde.geometry.Interval(x_lower, x_upper)
time_domain = dde.geometry.TimeDomain(t_lower, t_upper)
geomtime = dde.geometry.GeometryXTime(space_domain, time_domain)
# 损失的“物理信息”部分
def pde(x, y):
"""
INPUTS:
x: x[:,0] 是 x 坐标
x[:,1] 是 t 坐标
y: 网络输出,在这种情况下:
y[:,0] 是 u(x,t) 实部
y[:,1] 是 v(x,t) 虚部
OUTPUT:
标准形式的 pde,即必须为零的东西
"""
u = y[:, 0:1]
v = y[:, 1:2]
# 在'jacobian'中,i 是输出分量,j 是输入分量
u_t = dde.grad.jacobian(y, x, i=0, j=1)
v_t = dde.grad.jacobian(y, x, i=1, j=1)
u_x = dde.grad.jacobian(y, x, i=0, j=0)
v_x = dde.grad.jacobian(y, x, i=1, j=0)
# 在“hessian”中,i 和 j 都是输入分量。 (Hessian 原则上可以是 d^2y/dxdt、d^2y/d^2x 等)
# 输出组件由“组件”选择
u_xx = dde.grad.hessian(y, x, component=0, i=0, j=0)
v_xx = dde.grad.hessian(y, x, component=1, i=0, j=0)
f_u = u_t + 0.5 * v_xx + (u ** 2 + v ** 2) * v
f_v = v_t - 0.5 * u_xx - (u ** 2 + v ** 2) * u
return [f_u, f_v]
# 边界条件和初始条件
# 周期性边界条件
bc_u_0 = dde.PeriodicBC(
geomtime, 0, lambda _, on_boundary: on_boundary, derivative_order=0, component=0
)
bc_u_1 = dde.PeriodicBC(
geomtime, 0, lambda _, on_boundary: on_boundary, derivative_order=1, component=0
)
bc_v_0 = dde.PeriodicBC(
geomtime, 0, lambda _, on_boundary: on_boundary, derivative_order=0, component=1
)
bc_v_1 = dde.PeriodicBC(
geomtime, 0, lambda _, on_boundary: on_boundary, derivative_order=1, component=1
)
# 初始条件
def init_cond_u(x):
"2 sech(x)"
return 2 / np.cosh(x[:, 0:1])
def init_cond_v(x):
return 0
ic_u = dde.IC(geomtime, init_cond_u, lambda _, on_initial: on_initial, component=0)
ic_v = dde.IC(geomtime, init_cond_v, lambda _, on_initial: on_initial, component=1)
data = dde.data.TimePDE(
geomtime,
pde,
[bc_u_0, bc_u_1, bc_v_0, bc_v_1, ic_u, ic_v],
num_domain=10000,
num_boundary=20,
num_initial=200,
train_distribution="pseudo",
)
# 网络架构
net = dde.maps.FNN([2] + [100] * 4 + [2], "tanh", "Glorot normal")
model = dde.Model(data, net)
アダムの最適化
# 强烈建议使用 GPU 加速系统.
model.compile("adam", lr=1e-3, loss="MSE")
model.train(epochs=1000, display_every=100)
L-BFGSの最適化
dde.optimizers.config.set_LBFGS_options(
maxcor=50,
ftol=1.0 * np.finfo(float).eps,
gtol=1e-08,
maxiter=1000,
maxfun=1000,
maxls=50,
)
model.compile("L-BFGS")
model.train()
Compiling model...
'compile' took 0.554160 s
Training model...
Step Train loss Test loss Test metric
1000 [1.25e-02, 1.32e-02, 2.72e-06, 3.28e-04, 5.27e-06, 4.65e-06, 2.24e-02, 1.31e-03] [1.25e-02, 1.32e-02, 2.72e-06, 3.28e-04, 5.27e-06, 4.65e-06, 2.24e-02, 1.31e-03] []
2000 [7.03e-04, 7.62e-04, 6.76e-06, 1.33e-05, 2.88e-07, 8.49e-06, 4.01e-04, 3.86e-05]
INFO:tensorflow:Optimization terminated with:
Message: STOP: TOTAL NO. of f AND g EVALUATIONS EXCEEDS LIMIT
Objective function value: 0.001928
Number of iterations: 945
Number of functions evaluations: 1001
2001 [7.18e-04, 7.43e-04, 6.27e-06, 1.23e-05, 2.94e-07, 8.89e-06, 4.01e-04, 3.82e-05] [7.18e-04, 7.43e-04, 6.27e-06, 1.23e-05, 2.94e-07, 8.89e-06, 4.01e-04, 3.82e-05] []
Best model at step 2001:
train loss: 1.93e-03
test loss: 1.93e-03
test metric: []
'train' took 179.449384 s
(<deepxde.model.LossHistory at 0x13422ad90>,
<deepxde.model.TrainState at 0x10d759850>)
# 做预测
prediction = model.predict(X_star, operator=None)
u = griddata(X_star, prediction[:, 0], (X, T), method="cubic")
v = griddata(X_star, prediction[:, 1], (X, T), method="cubic")
h = np.sqrt(u ** 2 + v ** 2)
# 绘制预测
fig, ax = plt.subplots(3)
ax[0].set_title("Results")
ax[0].set_ylabel("Real part")
ax[0].imshow(
u.T,
interpolation="nearest",
cmap="viridis",
extent=[t_lower, t_upper, x_lower, x_upper],
origin="lower",
aspect="auto",
)
ax[1].set_ylabel("Imaginary part")
ax[1].imshow(
v.T,
interpolation="nearest",
cmap="viridis",
extent=[t_lower, t_upper, x_lower, x_upper],
origin="lower",
aspect="auto",
)
ax[2].set_ylabel("Amplitude")
ax[2].imshow(
h.T,
interpolation="nearest",
cmap="viridis",
extent=[t_lower, t_upper, x_lower, x_upper],
origin="lower",
aspect="auto",
)
plt.show()
3. OpenVINO IR モデルの生成
LabVIEW OpenVINO を使用して deepxde モデルを推論する場合は、次の手順を実行する必要があります。
1. deepxde モデルをミドルウェアとして onnx モデルに変換します。
コードでは、まず参照入力として X_star と同じ形状の X2 を作成する必要があります (X2 は CPU 上の行列である必要があります)。次に、重みが とまったく同じである新しい CPU ベースの mode2 を作成する必要があります。モデル。最後に、torch.onnx.export を使用して onnx モデルを生成します。
2. コマンド ラインを使用して、onnx モデルを IR モデルに変換します。
mo --input_model Schrodinger.onnx --input_shape "[256,2]"
コマンドでは、入力形状を 256*2 に設定します。ここで、0 列目は位置 x、1 列目は時間 t です。256 は、各時点で推論する必要がある x ポイントの数であり、任意の長さにすることができます。
上記 2 つの手順を完了すると、フォルダー内にさらに 3 つのファイル (Schrodinger.onnx、Schrodinger.xml、および Schrodinger.bin) があることがわかります。このうち、onnx は pytorch で生成された onnx モデル、xml と bin は mo で生成された OpenVINO IR モデルです。
4. LabVIEWはIRモデルを呼び出します
LabVIEW は、NI が発表したグラフィカルプログラミング環境で、科学研究や産業用計測および制御の分野で広く使用されています。LabVIEWの波形グラフ、強度グラフ、その他のコントロールを使用すると、ユーザーは独自のモデルのトレーニング結果をより直観的に観察できます。
私たちが作成した Schrodinger_OpenVINO.vi を使用すると、シュレディンガー方程式の OpenVINO モデルをすぐに推論できます。LabVIEWを使用してモデルを呼び出す手順は次のとおりです。
1. モデルの初期化: LoadIR.vi を使用して xml および bin ファイルを呼び出します推論エンジンは CPU または GPU (Intel コア グラフィックスまたは独立したグラフィックス) を使用できます。
2. 位置を初期化します。トレーニングに使用するパラメーターに従って、-5 ~ 5 の範囲で任意の数の位置ポイントをシミュレートする必要があります (この場合は 256 個の位置ポイントが使用されます)。
3. 初期化時間。トレーニングのパラメーターに従って、0 ~ pi/2 の範囲で任意の数の時点をシミュレートする必要があります (この場合、201 時点が使用されます)。
4. モデルについて推論するとき。各サイクルでは、ある時点のコピーが 256 個コピーされ、256 個の位置点すべてが 2*256 の 2 次元配列に形成され、その後 256*2 配列に転置されてネットワークに入力されます。
5. 出力を取得します。出力は 256*2 ですが、その意味は入力とは異なります。0 列目は波動関数 h の実数部、1 列目は h の虚数部です。したがって、波形グラフを使用して 2 つの曲線を表示するには、その前に結果を 2*256 に転置する必要があります。
6. 全期間およびすべての場所の結果を取得します。For ループ インデックスを使用すると、すべての期間の実部、虚部、および大きさの結果が保存され、強度グラフに表示されます。
7. release.vi を使用して OpenVINO モデルを閉じます。
プログラムを実行します。Intel A770 ディスクリート グラフィックス カード (デバイス名 GPU.1) を使用してモデルを実行します。実行結果は次のとおりです。
左側の波形グラフは各時点における波動関数の実部と虚部の曲線、右側の強度グラフは全時点の実部、虚部、振幅分布を示します。結果は、OpenVINO を使用した物理情報ニューラル ネットワーク モデルの推論が deepxde の結果と完全に一致していることを示しています。さらに、A770 のモデルでも最大の加速が得られ、CPU リソースが大幅に節約されます。
5.会社紹介
Shanghai Yiku Intelligent Technology Co., Ltd. は、国内有数の人工知能ソフトウェア プロバイダーおよびロボット アプリケーション開発者であり、エッジ コンピューティングに基づく高性能でコスト効率の高い産業用ハードウェアを含む、ローコードで再構成可能な人工知能カスタマイズ プラットフォームを開発しています。このプラットフォームのグラフィカルディープラーニングビジョンソフトウェアは、スマートマニュファクチャリング、スマートヘルスケア、スマート教育、その他の分野のカスタマイズされたニーズを満たし、同時に人工知能教育ソフトウェアおよびハードウェアプラットフォーム(音声インタラクションスイート、ドライバーレス)を構築しました。スイート)、大多数の大学ユーザー向け、ロボット アーム キット、すべてのハードウェアをサポートするクラウド実験プラットフォーム)、同社は Baidu、Softbank Robotics、NI、Intel の戦略的パートナーである iFlytek Venture Capital の企業です上海交通大学の優れたパートナーであり、上海市のハイテク企業であり、蘇州の有数の人材であり、百度フライングパドル人工知能産業エンパワーメントセンターに定住しています。 70 を超える特許と著作権を保有しており、本社は上海にあり、支店は蘇州と安慶にあります。
Yiku ソフトウェア ツールキットは、会社の公式 Web サイトからダウンロードできます: Yiku Intelligent