RandONets 是一种基于随机投影的浅层神经网络,旨在高效学习线性和非线性算子。该方法结合了随机化技术和神经网络,以更低的计算成本和更高的数值精度学习各种算子,特别是在科学计算和工程领域中的应用。其核心思想是通过随机投影简化网络结构,使得模型训练和计算更加高效。
核心思想
随机投影:RandONets 采用了Johnson-Lindenstrauss (JL) 投影和随机傅里叶特征 (RFFN) 等方法,这些方法利用低维随机映射来有效表示和近似线性和非线性算子。这种方法减少了传统神经网络所需的计算复杂度,使得网络训练更加快速。
浅层网络:与深度神经网络相比,RandONets 使用的为浅层网络。由于其较少的层数和参数,RandONets 在保持高精度的同时,减少了计算资源的需求,训练和推理速度显著提高。
线性和非线性算子的逼近:RandONets 可以逼近各种类型的算子,包括线性和非线性算子。这些算子在科学计算中发挥重要作用,特别是在解决偏微分方程(PDE)等问题时,具有广泛的应用。
理论基础
RandONets 的理论依据表明,它们能够作为通用逼近器,即可以精确地逼近任何线性和非线性算子。这一理论结果扩展了陈和陈(1995)的证明,为算子的学习和逼近提供了强有力的理论支持。
MATLAB 示例
code链接:https://github.com/GianlucaFabiani/RandONets。
主函数为 train_RandONet.m,用于训练 RandONet 模型。
我们在 main_RandDeepOnet_examples.m 文件中提供了5个示例/演示:
反导数问题( load('data_antiderivative.mat')
,基于 DeepXDE Python 库中的问题)带外力的单摆问题( load('data_Pendulum.mat')
,基于 DeepXDE Python 库中的问题)线性PDE扩散-反应问题( load('data_DiffReac.mat')
)非线性PDE粘性Burgers方程( load('data_burgers.mat')
)非线性PDE Allen-Cahn方程( load('data_AllenCahn.mat')
)
问题描述
本研究聚焦于学习线性和非线性泛函算子 的任务。此类算子定义了两个无穷维函数空间 和 之间的映射。为简单起见,我们假设 和 均为 的子集,其中 表示定义在 上的连续函数的集合。
集合 的元素为函数 ,它们通过算子 转化为其他函数 。对于 ,算子 的值表示为
这种算子在许多科学和工程应用中具有重要作用,特别是在偏微分方程的背景下。通过有效学习这些非线性算子(即从数据中发现),我们期望在从流体动力学和材料科学到金融和生物系统等领域提升我们的理解和预测能力。
尽管目标是从数据中学习作用于函数()的算子,但为了能够应用网络逼近,必须对其进行离散化。一个实用方法是使用函数在有限个位置 的取值 ,其中 ,这些位置被称为“传感器”。
对于输出函数的数据,有两种情况。第一种是输出函数在固定网格 上已知,这称为“对齐”数据。另一种是输出网格对每个输入函数随机变化,称为“未对齐”数据。如果该网格均匀采样且足够稠密,可通过插值将输出函数近似到固定位置,回归为对齐数据的情况。然而,当输出仅在稀疏位置可用时,插值变得不切实际。尽管如此,正如论文中所述,我们的方法可以应对这种情形,但在训练机器学习模型时会增加计算成本(因为此时无法完全利用数据的固定结构)。
代码文档
我们提供了用户友好且适用于 MATLAB 的工具,用于学习线性和非线性算子。基于随机投影的算法是一种快速高效的函数逼近机器学习算法。
train_RandONet.m
训练 RandONet 模型。
语法:
net = train_RandONet(ff, yy, Nt, Nb, kmodel)
输入:
ff
: 分支网络的输入矩阵(函数)。yy
: 主干网络的输入向量(空间位置)。Nt
: 主干网络的神经元数(默认值:200)。Nb
: 分支网络的神经元数(默认值:1000)。kmodel
: 模型类型(1 表示 JL,2 表示 RFFN,默认值为 2)。
输出:
net
: 训练好的 RandONet 模型,包含主干和分支网络的参数,包括权重和偏置。
结构:
tr_fT
: 主干网络激活函数(非线性变换)。tr_fB
: 分支网络激活函数(非线性变换)。`alphat
, betat`: 主干网络的输入变换参数。
alphab, betab
: 分支网络的输入变换参数。C
: 内积的权重矩阵。
描述:该函数通过 COD 伪逆初始化网络参数,并训练主干和分支层,结果存储在输出 net
中。
eval_RandONet.m
评估 RandONet 模型,通过计算主干和分支网络的加权内积。
语法:
G = eval_RandONet(net, ff, yy)
输入:
net
: RandONet 模型结构,包含以下字段:tr_fT
: 主干网络激活函数。tr_fB
: 分支网络激活函数。alphat, betat
: 主干网络输入变换参数。alphab, betab
: 分支网络输入变换参数。C
: 内积的权重矩阵。ff
: 分支网络的输入函数。yy
: 主干网络的输入空间位置。
输出:
G
: RandONet 模型的输出,计算为主干和分支网络变换的加权内积 。
描述:该函数将输入通过主干和分支网络变换后,利用权重矩阵 对这些变换的内积进行加权,得出结果。
💙整理不易,希望各位道友能够多多支持宝库,支持邪云宝库!你的一个点赞、一次转发、 随手分享,都是宝库前进的最大动力~
💛2024,不忘初心,宝库会给大家带来更好的内容,让我们2024,一起暴富!