引言
函数和算子
函数:
指两个向量空间的映射:
比如对于 f 1 ( x ) = s i n ( x ) f_1(x)=sin(x) f1(x)=sin(x); for x ∈ R x\in\mathbf{R} x∈R
z = f 1 ( x ) = s i n ( x ) ∈ [ 0 , 1 ] z=f_1(x)=sin(x)\in[0, 1] z=f1(x)=sin(x)∈[0,1]
就是说 f 1 f_1 f1 映射 x ∈ R → [ 0 , 1 ] x\in\mathbf{R}→[0,1] x∈R→[0,1]
算子:
指无限维函数空间之间的映射:
G ( f 1 ( x ) ) = f 2 ( x ) G(f_1(x))=f_2(x) G(f1(x))=f2(x)
比如微分算子→ d d x \frac{d}{d x} dxd
将函数 f 1 f_1 f1 映射到了另一个函数 f 2 f_2 f2:
让 f 1 ( x ) = s i n ( x ) f_1(x)=sin(x) f1(x)=sin(x)
应用这个微分算子后
f 2 = d f 1 ( x ) d x = d d x s i n ( x ) = c o s ( x ) f_2=\frac{df_1(x)}{d x}=\frac{d}{d x}sin(x)=cos(x) f2=dxdf1(x)=dxdsin(x)=cos(x)
含参的偏微分方程(也可以说是条件可变的偏微分方程)
含参的偏微分方程是指求解时候的一些参数能够改变,包含了形状,初始条件,边界条件,系数等等。
N
\mathcal{N}
N表示了一个非线性微分算子,含参的偏微分方程可以表示成:
N ( u , s ) = 0 \mathcal{N}(u,s)=0 N(u,s)=0
其中 u u u 是输入函数, s s s 是未知偏微分方程的解(同样是一个函数)。
其中 s s s是根据 u u u求得的,偏微分方程的求解算子就变成了
G
(
u
)
=
s
G(u)=s
G(u)=s
Note: 换句话说,我们可以将PDE的通解表示为一个算子
G
G
G。
记住
s
s
s本身就是一个函数,所以如果我们在任意点
y
y
y求值,输出将是一个实数。(这里的
y
y
y是自变量)
G ( u ) ( y ) = s ( y ) ∈ R G(u)(y)=s(y)\in \mathbf{R} G(u)(y)=s(y)∈R
算子的普遍近似定理
∀ ϵ > 0 \forall \epsilon >0 ∀ϵ>0, 有正整数 n , p , m n,p,m n,p,m, 常数 c i k , W b i j k , b b i j k , W t k , b t k c_i^k,W_{bij}^k,b_{bij}^k,W_{tk},b_{tk} cik,Wbijk,bbijk,Wtk,btk 使:
∣
G
(
u
)
(
y
)
−
∑
k
=
1
p
∑
i
=
1
n
c
i
k
σ
(
∑
j
=
1
m
W
b
i
j
k
u
(
x
j
)
+
b
b
i
k
)
.
σ
(
W
t
k
.
y
+
b
t
k
)
∣
<
ϵ
\left|G(u)(y)-\sum_{k=1}^{p}\sum_{i=1}^{n}c_i^k\sigma\left(\sum_{j=1}^{m}W_{bij}^{k}u(x_j)+b_{bi}^k\right).\sigma(W_{tk}.y+b_{tk})\right|<\epsilon
G(u)(y)−k=1∑pi=1∑ncikσ(j=1∑mWbijku(xj)+bbik).σ(Wtk.y+btk)
<ϵ
这个定理就是为了说明,这个算子是存在的,能够找到的。
神经网络
神经网络是一个函数,它的形式可以表示为: (https://book.sciml.ai/notes/03/)
N N ( X ) = W n σ n − 1 ( W n − 1 σ n − 2 ( . . . ( W 2 σ 1 ( W 1 X + b 1 ) + b 2 ) + . . ) + b n − 1 ) + b n NN(X)=W_n\sigma_{n-1}(W_{n-1}\sigma_{n-2}(...(W_2\sigma_1(W_1X+b_1)+b_2)+..)+b_{n-1})+b_n NN(X)=Wnσn−1(Wn−1σn−2(...(W2σ1(W1X+b1)+b2)+..)+bn−1)+bn
所以我们可以用2个神经网络来实现算子的普遍近似定理。
分支(Branch):
N N b ( u ( x ) ) = b ( u ( x ) ) = c . σ ( W b u ( x ) + b b ) NN_b(u(\textbf{x}))=b(u(\textbf{x}))=\textbf{c}.\sigma\left(W_{b}u(\textbf{x})+\textbf{b}_{b}\right) NNb(u(x))=b(u(x))=c.σ(Wbu(x)+bb)
表示我需要很多个 u ( x ) u(\textbf{x}) u(x)函数,近乎于无限次幂,我才能够泛化到任何情况的求解。
主干(Trunk):
N N t ( y ) = t ( y ) = σ ( W t . y + b t ) NN_t(\textbf{y})=t(\textbf{y})=\sigma(W_{t}.\textbf{y}+\textbf{b}_{t}) NNt(y)=t(y)=σ(Wt.y+bt)
表示对于各个函数,我有一些条件需要去满足,比如初始条件和边界条件。
DeepOnet
为了学习含参偏微分方程的解算子,尝试用两个神经网络来近似 G G G (算子的解):
G θ ( u ) ( y ) = ∑ k = 1 q b k ( u ( x 1 ) , u ( x 2 ) , . . . , u ( x m ) ) ⏟ B r a n c h . t k ( y ) ⏟ T r u n k G_\theta(u)(y)=\sum_{k=1}^q\underset{Branch}{\underbrace{b_k\left(u(x_1),u(x_2),...,u(x_m)\right)}}.\underset{Trunk}{\underbrace{t_k(\textbf{y})}} Gθ(u)(y)=k=1∑qBranch bk(u(x1),u(x2),...,u(xm)).Trunk tk(y)
我们想要得到 G G G,所以我们的目标是
G θ ( u ) ( y ) ≈ G ( u ) ( y ) G_\theta(u)(y)\approx G(u)(y) Gθ(u)(y)≈G(u)(y)
要训练出一个网络,使得对于任何 y y y,就是对于任何的边界或初始条件,我都能获得这个偏微分方程的解。
所以我们将这个条件强加到一个损失函数中(训练中的 y y y我们是已知的):
L O p e r a t o r ( θ ) = 1 N P ∑ i = 1 N ∑ j = 1 P ∣ G θ ( u ( i ) ) y j ( i ) − G ( u ( i ) ) y j ( i ) ∣ 2 \mathcal{L}_{Operator}(\theta)=\frac{1}{NP}\sum_{i=1}^N\sum_{j=1}^P\left|G_{\theta}(u^{(i)})y_j^{(i)}-G(u^{(i)})y_j^{(i)}\right|^2 LOperator(θ)=NP1i=1∑Nj=1∑P Gθ(u(i))yj(i)−G(u(i))yj(i) 2
L O p e r a t o r ( θ ) = 1 N P ∑ i = 1 N ∑ j = 1 P ∣ ∑ k = 1 q b k ( u ( x 1 ) , u ( x 2 ) , . . . , u ( x m ) ) . t k ( y j ( i ) ) − G ( u ( i ) ) y j ( i ) ∣ 2 \mathcal{L}_{Operator}(\theta)=\frac{1}{NP}\sum_{i=1}^N\sum_{j=1}^P\left|\sum_{k=1}^q{b_k\left(u(x_1),u(x_2),...,u(x_m)\right)}.t_k(y_j^{(i)})-G(u^{(i)})y_j^{(i)}\right|^2 LOperator(θ)=NP1i=1∑Nj=1∑P k=1∑qbk(u(x1),u(x2),...,u(xm)).tk(yj(i))−G(u(i))yj(i) 2
其中:
m : m: m: 评价输入函数的点个数(选取了多少个样本点来做训练)
q : q: q: 输出神经元的个数
N : N: N: 输入函数的个数。
P : P: P: 评价输出函数的点个数
基于物理信息的 DeepONets
与PINN类似,基于物理信息的DeepONets输出函数通过最小化非线性微分算子的残差来与物理约束保持一致。
L P h y s i c s ( θ ) = 1 N Q m ∑ i = 1 N ∑ j = 1 Q ∑ k = 1 m ∣ N ( u ( i ) ( x k ) , G θ ( u ( i ) ) ( y j ( i ) ) ∣ 2 \mathcal{L}_{Physics}(\theta)=\frac{1}{NQm}\sum_{i=1}^{N}\sum_{j=1}^{Q}\sum_{k=1}^{m}\left|\mathcal{N}(u^{(i)}(x_k),G_{\theta}(u^{(i)})(y_j^{(i)})\right|^2 LPhysics(θ)=NQm1i=1∑Nj=1∑Qk=1∑m N(u(i)(xk),Gθ(u(i))(yj(i)) 2
其中 N \mathcal{N} N是一个非线性微分算子, { y j } i = 1 Q \{y_j\}_{i=1}^{Q} {yj}i=1Q是collocation points(用来执行物理约束)。
所以总loss是:
L ( θ ) = L O p e r a t o r ( θ ) + L P h y s i c s ( θ ) \mathcal{L}(\theta)=\mathcal{L}_{Operator}(\theta)+\mathcal{L}_{Physics}(\theta) L(θ)=LOperator(θ)+LPhysics(θ)
问题实例
Diffusion-reaction system
由源项为 u ( x ) u(x) u(x)的非线性偏微分方程描述的隐式算子( u ( x ) u(x) u(x)是已知的,不同的方程不一样,要求解这个偏微分方程,求解这个 s s s, s s s是关于 x x x和 t t t的函数):
∂ s ∂ t = D ∂ 2 s ∂ x 2 + k s 2 + u ( x ) \frac{\partial s}{\partial t}=D\frac{\partial^2 s}{\partial x^2}+ks^2+u(x) ∂t∂s=D∂x2∂2s+ks2+u(x)
( x , t ) ∈ ( 0 , 1 , ] × ( 0 , 1 ] (x,t)\in (0,1,]\times(0,1] (x,t)∈(0,1,]×(0,1]
其中, D = 0.01 D=0.01 D=0.01 是扩散系数, k = 0.01 k=0.01 k=0.01 是反应速率。
Note: 我们不会使用任何配对的输入输出数据。我们只知道初始条件和边界条件都是零。
训练
我们将源项 u ( x ) u(x) u(x)映射到PDE解 s ( x , t ) s(x,t) s(x,t)。因此,我们将使用PI-DeepONet ( G θ G_{\theta} Gθ)近似隐式解算子( G G G)。
对于这个偏微分方程,我们知道对于给定的输入函数 u ( i ) u^{(i)} u(i):
u ( i ) = ∂ s ( i ) ∂ t − D ∂ 2 s ( i ) ∂ x 2 − k [ s ( i ) ] 2 u^{(i)}=\frac{\partial s^{(i)}}{\partial t}-D\frac{\partial^2 s^{(i)}}{\partial x^2}-k[s^{(i)}]^2 u(i)=∂t∂s(i)−D∂x2∂2s(i)−k[s(i)]2
理想情况下,我们通过偏微分方程算子来近似 s s s的解 G θ ( u ( i ) ) ( x , t ) ≈ G ( u ( i ) ) ( x , t ) = s ( i ) ( x , t ) G_{\theta}(u^{(i)})(x,t)\approx G(u^{(i)})(x,t)= s^{(i)}(x,t) Gθ(u(i))(x,t)≈G(u(i))(x,t)=s(i)(x,t) :
那么对于函数
u
u
u:
u
(
i
)
≈
∂
G
θ
(
u
(
i
)
)
(
x
,
t
)
∂
t
−
D
∂
2
G
θ
(
u
(
i
)
)
(
x
,
t
)
∂
x
2
−
k
[
G
θ
(
u
(
i
)
)
(
x
,
t
)
]
2
u^{(i)}\approx \frac{\partial G_{\theta}(u^{(i)})(x,t)}{\partial t}-D\frac{\partial^2 G_{\theta}(u^{(i)})(x,t)}{\partial x^2}-k[G_{\theta}(u^{(i)})(x,t)]^2
u(i)≈∂t∂Gθ(u(i))(x,t)−D∂x2∂2Gθ(u(i))(x,t)−k[Gθ(u(i))(x,t)]2
用
R
θ
(
i
)
(
x
,
t
)
R_{\theta}^{(i)}(x,t)
Rθ(i)(x,t)表示计算损失:
R
θ
(
i
)
(
x
,
t
)
=
∂
G
θ
(
u
(
i
)
)
(
x
,
t
)
∂
t
−
D
∂
2
G
θ
(
u
(
i
)
)
(
x
,
t
)
∂
x
2
−
k
[
G
θ
(
u
(
i
)
)
(
x
,
t
)
]
2
R_{\theta}^{(i)}(x,t)=\frac{\partial G_{\theta}(u^{(i)})(x,t)}{\partial t}-D\frac{\partial^2 G_{\theta}(u^{(i)})(x,t)}{\partial x^2}-k[G_{\theta}(u^{(i)})(x,t)]^2
Rθ(i)(x,t)=∂t∂Gθ(u(i))(x,t)−D∂x2∂2Gθ(u(i))(x,t)−k[Gθ(u(i))(x,t)]2
所以物理损失
L
P
h
y
s
i
c
s
\mathcal{L}_{Physics}
LPhysics 为:
L P h y s i c s ( θ ) = 1 N Q ∑ i = 1 N ∑ j = 1 Q ∣ R θ ( i ) ( x r , j ( i ) , t r , j ( i ) ) − u ( i ) ( x r , j ( i ) ) ∣ 2 \mathcal{L}_{Physics}(\theta)=\frac{1}{NQ}\sum_{i=1}^{N}\sum_{j=1}^{Q}\left|R_{\theta}^{(i)}(x_{r,j}^{(i)},t_{r,j}^{(i)})-u^{(i)}(x_{r,j}^{(i)})\right|^2 LPhysics(θ)=NQ1i=1∑Nj=1∑Q Rθ(i)(xr,j(i),tr,j(i))−u(i)(xr,j(i)) 2
其中 ( x r , j , t r , j ) (x_{r,j},t_{r,j}) (xr,j,tr,j) 是 “collocation points” 来评价模型好坏, N N N是评价的函数个数, Q Q Q表示评价点的个数, r r r无实际意义,代表函数里的点,于下文的 u u u下标所代表函数的点进行区分。
另一方面,我们用零初始条件和边界条件 L O p e r a t o r ( θ ) \mathcal{L}_{Operator}(\theta) LOperator(θ):
L O p e r a t o r ( θ ) = 1 N P ∑ i = 1 N ∑ j = 1 P ∣ G θ ( u ( i ) ) ( x u , j ( i ) , t u , j ( i ) ) − G ( u ( i ) ) ( x u , j ( i ) , t u , j ( i ) ) ) ∣ 2 \mathcal{L}_{Operator}(\theta)=\frac{1}{NP}\sum_{i=1}^{N}\sum_{j=1}^{P}\left|G_{\theta}(u^{(i)})(x_{u,j}^{(i)},t_{u,j}^{(i)})- G(u^{(i)})(x_{u,j}^{(i)},t_{u,j}^{(i)}))\right|^2 LOperator(θ)=NP1i=1∑Nj=1∑P Gθ(u(i))(xu,j(i),tu,j(i))−G(u(i))(xu,j(i),tu,j(i))) 2
式中, ( x u , j , t u , j ) (x_{u,j},t_{u,j}) (xu,j,tu,j)是初始条件和边界条件的点。因此,由于我们在零初始和边界条件下工作, G ( u ( i ) ) ( x u , j ( i ) , t u , j ( i ) ) = 0 G(u^{(i)})(x_{u,j}^{(i)},t_{u,j}^{(i)})=0 G(u(i))(xu,j(i),tu,j(i))=0:
L O p e r a t o r ( θ ) = 1 N P ∑ i = 1 N ∑ j = 1 P ∣ G θ ( u ( i ) ) ( x u , j ( i ) , t u , j ( i ) ) ) ) ∣ 2 \mathcal{L}_{Operator}(\theta)=\frac{1}{NP}\sum_{i=1}^{N}\sum_{j=1}^{P}\left|G_{\theta}(u^{(i)})(x_{u,j}^{(i)},t_{u,j}^{(i)})))\right|^2 LOperator(θ)=NP1i=1∑Nj=1∑P Gθ(u(i))(xu,j(i),tu,j(i)))) 2
最后,总损失为:
L
(
θ
)
=
L
o
p
e
r
a
t
o
r
(
θ
)
+
L
P
h
y
s
i
c
s
(
θ
)
\mathcal{L}(\theta)=\mathcal{L}_{operator}(\theta)+\mathcal{L}_{Physics}(\theta)
L(θ)=Loperator(θ)+LPhysics(θ)
总结
总结一下,在基于物理信息的DeepONets中,对于一个偏微分方程,我们有不同的源项(source),我们想要对于任何的源项都能求解。
我们用一个偏微分算子
G
G
G来近似要求解的
s
s
s,那么我们就能表示出
u
u
u,
u
u
u是关于
x
x
x的函数,是已知条件,带入
x
x
x和
t
t
t后求得训练出来的偏微分算子
G
G
G,进而求得训练出来的
u
u
u,进一步求物理损失。同时对于每个函数的边界点,初始设置的为0,也算损失,相加为总损失,训练出来的
G
G
G便能表示不同初始条件下这个微分方程的解。
PS:代码实战