首先我们有算子的万有逼近定理:
可以用一个神经网络来描述它:
称上述神经网络是堆叠的DeepONet.它以y为输入,输出 [ t 1 , t 2 , ⋯ , t p ] T ∈ R p [t_1,t_2,\cdots,t_p]^T\in \mathbb{R^p} [t1,t2,⋯,tp]T∈Rp,除了Trunk网络,还有p个branch网络,每个网络都以 [ u ( x 1 ) , u ( x 2 ) , ⋯ , u ( x m ) ] T [u(x_1),u(x_2),\cdots,u(x_m)]^T [u(x1),u(x2),⋯,u(xm)]T为输入,并输出一个标量 b k ∈ R b_k\in\mathbb{R} bk∈R.我们把他们合起来即为:
在实践中,p至少是10阶,而且使用许多分支网络是低效的。因此我们将所有分支网络合并为一个单个分支网络,也就是单个分支网络输出向量 [ b 1 , b 2 , ⋯ , b p ] T ∈ R p [b_1,b_2,\cdots,b_p]^T\in\mathbb{R}^p [b1,b2,⋯,bp]T∈Rp.这样得出的网络称为非堆叠的DeepONet,该网络可以被视为所有分支网络共享同一组参数的堆叠DeepONet,其中非堆叠的DeepONet的数学依据是如下的定理:其中 < , ⋅ , > <,\cdot,> <,⋅,>表示 R p \mathbb{R}^p Rp中的点乘运算,g和f可以选择不同类别的神经网络,如全连接神经网络,残差神经网络和卷积神经网络。网络结果如下图所示:
也即,DeepONet时一种网络架构,没有定义其内部(主干和分支)的具体神经网络形式.接下去的几个例子都是选择最简单的全连接网络作为子网络架构,如果输入函数有一定的结构,那么可以用专门的层:例如,如果 { x 1 , x 2 , ⋯ , x m } \{x_1,x_2,\cdots,x_m\} {x1,x2,⋯,xm}在等间距的网格上,那么可以在Branch net中用卷积层。
那么数据怎么得到呢?首先数据点是三元组(u,y,G(u)(y))因此特定的输入u可能出现在具有不同y值的多个数据点中,例如,大小为1w的数据集可能仅从100个输入u得到,每个数据集在100个不同的y位置处评估G(u)(y).从来在数据集中,对于每个u,就在G(u)的定义域中随机选择P个不同的y点,因此数据点的总数是P × \times ×#u.同时在DeepONet中,我们使用 [ u ( x 1 ) , u ( x 2 ) , ⋯ , u ( x m ) ] [u(x_1),u(x_2),\cdots,u(x_m)] [u(x1),u(x2),⋯,u(xm)]作为分支网络的输入来表示u(x),所以我们也要估计需要多少个m来实现良好的精度 ϵ \epsilon ϵ。
先看一个显式算子的例子:
例子:考虑如下ODE系统:
{
d
s
(
x
)
d
x
=
u
(
x
)
,
x
∈
(
0
,
1
]
s
(
0
)
=
0
\begin{cases} \frac{ds(x)}{dx}=u(x),x\in(0,1]\\ s(0)=0 \end{cases}
{dxds(x)=u(x),x∈(0,1]s(0)=0
我们目的是根据不同的输入u(x)来预测s(x),如上问题等价于去学习一个不定积分算子。
所以需要确定的算子是 G : u ( x ) ↦ s ( x ) = s 0 + ∫ 0 x u ( τ ) d τ G:u(x)\mapsto s(x)=s_0+\int_0^xu(\tau)d\tau G:u(x)↦s(x)=s0+∫0xu(τ)dτ.即从源项到解的算子。我们利用FNN来学习不定积分算子,其中网络输入是u(x),y输出是G(u)(y).
但其实算子的输入函数不一定是源项,也可以是边界条件、初始条件.
再看一个隐式算子的例子.学习非线性扩散反应PDE和源项u(x):
在这个例子中我们要学习的算子是 G : u ( x ) ↦ s ( x , t ) G:u(x)\mapsto s(x,t) G:u(x)↦s(x,t),即从源项u(x)到PDE的解s(x,t).我们首先在100$\times$100的网格上使用二阶隐式有限差分求解扩散反应系统,然后对每个s,从这1w个网格点中随机选择P个点,所以数据集的大小等于P和u个样本数量的乘积.
至此,是本文的文献总结,文章中还有一些数值算例.