如何理解Fourier Neural Operator (FNO)

写这篇blog是因为多方参考才读懂这两篇文章,希望能用自己的语言表达出来加深一下理解。因为是刚刚开始学习这部分内容,错误之处敬请指出。

前言

2022年Nvidia发表在arXiv上的的FourcastNet作为几乎是最早的一篇气象大模型的工作(之前Google Research的MetNet主要还是对于降水的预报)。除了Transformer的backbone之外,使用到了2021年发表在ICLR上的Fourier Neural Operator。为了更好的理解模型的理论基础,可以详细学习一下 Fourier neural operator for parametric partial differential equations 以及他的前期工作 Neural operator: graph kernel network for PDE。

文章指路:
GNO
FNO
作者对这两篇文章的解析blog

算子Operator概念理解

算子(Operator)是函数空间到函数空间的映射。从广义上讲,对任何函数进行某一项操作都可以看作是一个算子。在神经网络中例如convolution,fully connected layer等,都可以当作一种算子。

因此,区别于之前的一些PINN文章,从 给定的一个函数中采样 x x x和对应的 y y y,建立一个神经网络来学习这个函数,本篇文章中提到的Operator旨在学习一个函数簇到另一个函数簇的映射。例如,具有不同初始条件的Burgers方程,到这些方程的解的映射,是这个神经网络算子需要学习的内容。

因此他的好处在于,对于某种表达形式的方程,例如Burgers方程,训练一个算子可以得到Burgers方程不同初始条件下的解。而文章中所提到的参数 a a a,可以理解成初始条件/边界条件/含有物理意义的系数等。

问题建立

请添加图片描述
假设我们有一个一般的二阶椭圆偏微分方程,其中u是需要求解的函数,f(x)是右端项,a(x)是参数。一般的,f(x)和a(x)均为已知。f(x)也可以理解成物理方程中的强迫项。方程可以以算子的形式表示,如下图所示。请添加图片描述
偏微分方程一般可以写成上述形式。 L a L_a La表示在参数 a a a是的算子。
在这里插入图片描述
作者希望用神经网络来模拟映射关系F,实现一组方程在给定不同参数a的情况下,求得方程的解。其中,A是参数a的集合,或者理解成参数空间。
在这种情况下,神经网络的输入和输出都是函数的表达式。为了能表示出函数,作者在 a a a u u u上进行了K个点的采样 P i = 1 , … , K P_{i=1,…,K} Pi=1,,K,并通过 a j ∣ P k a_j | P_k ajPk u j ∣ P k u_j | P_k ujPk作为网络的输入输出来进行训练。

Graph Neural Operator的思想

作者考虑使用格林函数(Green Function)作为PDE的求解方法。格林函数是一种用来解有初值条件和边界条件的非齐次微分方程的函数。

证明

若可找到线性算符L的格林函数G,则有在这里插入图片描述由于 L a u ( x ) = f ( x ) L_au(x) = f(x) Lau(x)=f(x),则可以得到 L a u ( x ) = ∫ L G ( x , s ) f ( s ) d s L_au(x) = \int LG(x,s)f(s)ds Lau(x)=LG(x,s)f(s)ds。其中,L算子只对x起作用,不对被积分的变量s起作用,因此可以得到 L a u ( x ) = L ∫ G ( x , s ) f ( s ) d s L_au(x)= L\int G(x,s)f(s)ds Lau(x)=LG(x,s)f(s)ds,所以也可以得到 u ( x ) = ∫ G ( x , s ) f ( s ) d s u(x) = \int G(x,s)f(s)ds u(x)=G(x,s)f(s)ds,其中s表示定义域中的某一个点,例如G(1,0)就表示x=0对x=1这个点的影响。因此对 s s s进行积分,就可以理解成要求解定义域中的点对x的影响。

如果进行离散采样,并且把所有离散点看作图神经网络中的节点的话,点对x的影响可以看作是图神经网络的边的传递。

采样多少个数据点可以用来表示一组a_j和u_j?

即上述K为多少比较合适?

考虑有向边,建立图神经网络的复杂度为O(k^2)。根据Monte Carlo integration 的error【这边暂时还没理解为什么看这个error,可能理解错了】,error和采样点的关系为 δ ∼ K − 1 / 2 \delta \sim K^{-1/2} δK1/2。当对函数采样200个点时(对于每一组函数对,训练用400个,测试用200个),就已经可以达到比较好的效果。

Fourier Neural Operator的思想

如果将图神经网络中的message passing替换成Fourier变换和逆变换层,则可以得到FNO的大致结构,如下图所示。FNO是图片— 图片的学习。
在这里插入图片描述

具体的,对于每一层神经网络的输入,FNO层做三件事情:

  1. 对于输入进行傅立叶变换
  2. 过滤掉比较高频的modes,这一步我自己的理解是为了消除一些采样的噪声等,提高模型的鲁棒性
  3. 对于低频modes进行傅立叶逆变换。

W为bias term,用shortcut的方式增加一个偏差项(线性)。因为傅立叶具有周期性,通过激活函数 σ \sigma σ来恢复函数的非周期边界条件和一些高频modes。

直观对比CNN滤波和Fourier滤波

作者在blog中给出了很直观的Fourier filter和CNN filter的比对。CNN的filter可以很好的捕捉局部的特征,可以很好的提出图片的边缘信息。而傅立叶filter是 全局 的,并且是三角函数,因此可以更好的用来表示连续方程。在这里插入图片描述

03-17
### FNO 的定义及其在 IT 领域的应用 FNOFourier Neural Operator)是一种基于神经网络的方法,主要用于解决偏微分方程(PDEs)。这种方法通过引入傅里叶变换来捕捉全局依赖关系,从而能够高效地处理复杂的物理场模拟问题[^4]。相比于传统的数值方法,FNO 提供了一个端到端的框架,能够在保持高精度的同时显著减少计算成本。 #### 技术背景 FNO 结合了深度学习中的 Transformer 架构特点与傅里叶分析理论。其核心思想在于利用频谱空间的信息表达能力,将输入信号映射至频域后再进行操作,最后再转换回原始空间。这一过程不仅保留了传统有限差分法的优势,还进一步提升了模型泛化性能[^5]。 以下是实现 FNO 的一段简化代码示例: ```python import torch.nn as nn class FourierNeuralOperator(nn.Module): def __init__(self, modes, width): super(FourierNeuralOperator, self).__init__() self.modes = modes self.width = width # 定义卷积层和其他组件... def forward(self, x): # 傅里叶变换部分逻辑 x_ft = torch.fft.rfft(x, dim=-1) out_ft = torch.zeros_like(x_ft) out_ft[:, :, :self.modes] = ... # 自定义频域操作 return torch.fft.irfft(out_ft, n=x.size(-1), dim=-1) # 初始化并应用该模块 fno_model = FourierNeuralOperator(modes=16, width=64) output = fno_model(input_tensor) ``` 此代码片段展示了如何构建一个基本版本的 FNO 模型,并说明了其中涉及的关键步骤——即通过对输入张量执行快速傅里叶变换 (FFT),然后对其进行特定模式的选择和修改,最终返回逆 FFT 后的结果。 #### 应用场景 FNO 广泛应用于科学计算领域,特别是在流体力学、气候建模等领域中表现突出。例如,在天气预报任务中,它可以用来加速大气动力学仿真;而在材料科学研究方面,则可用于预测晶体结构变化趋势等复杂现象[^6]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值