用L-BFGS方法和深度学习求解偏微分方程
这个例子展示了如何通过使用有限内存BFGS (L-BFGS)算法来训练一个物理神经网络(PINN)来数值计算Burger方程的解。
伯格方程是应用数学不同领域中出现的偏微分方程(PDE)。特别是流体力学、非线性声学、气体动力学和交通流。L-BFGS算法[1]是一种近似Broyden-Fletcher-Goldfarb-Shanno (BFGS)算法的准牛顿方法。
给定计算域 ,这个例子使用物理神经网络(PINN) [2]并训练一个多层感知器神经网络来采集样本 作为输入,其中 空间变量,和 时间是可变的,并返回 式中,u为Burger方程的解:
与 作为初始条件,和 而且 作为边界条件。
该示例通过强制给定输入来训练模型 ,网络的输出 满足伯格方程、边界条件和初始条件。训练这个模型不需要事先收集数据。您可以使用PDE和约束的定义生成数据。
生成培训数据
训练模型需要一个配置点的数据集,这些配置点执行边界条件,执行初始条件,并满足Burger方程。
选择25个等间隔的时间点来执行每个边界条件 而且 .
numBoundaryConditionPoints = [25 25];x0BC1 = -1*ones(1,numBoundaryConditionPoints(1));x0BC2 = ones(1,numBoundaryConditionPoints(2));t0BC1 = linspace(0,1,numBoundaryConditionPoints(1));t0BC2 = linspace(0,1,numBoundaryConditionPoints(2));u0BC1 = 0 (1,numBoundaryConditionPoints(1));u0BC2 = 0 (1,numBoundaryConditionPoints(2));
选择50个等间距的空间点来加强初始条件 .
numInitialConditionPoints = 50;x0IC = linspace(-1,1,numInitialConditionPoints);t0IC = 0 (1,numInitialConditionPoints);u0IC = -sin(pi*x0IC);
将初始条件和边界条件的数据组合在一起。
X0 = [x0IC x0BC1 x0BC2];T0 = [t0IC t0BC1 t0BC2];U0 = [u0IC u0BC1 u0BC2];
选择10,000个点来加强网络的输出,以满足Burger方程。
numInternalCollocationPoints = 10000;points = rand(numInternalCollocationPoints,2);dataX = 2*points(:,1)-1;dataT = points(:,2);
定义神经网络架构
定义一个多层感知器神经网络架构,包含9个完全连接操作,每个操作包含20个隐藏神经元。第一个完全连接操作具有与输入相对应的两个输入通道 而且 .最后一个完全连接操作有一个输出 .
指定网络超参数。
numLayers = 9;numNeurons = 20;
创建神经网络。
layers = featureInputLayer(2);为i = 1:numLayers-1 layers = [layers fullyConnectedLayer(numNeurons) tanhLayer];结束layers = [layers fullyConnectedLayer(1)]
layers = 18×1带有图层的图层数组:1”功能输入2功能2”完全连接20完全连接第三层“双曲正切双曲正切4”完全连接20完全连接层5“双曲正切双曲正切6”完全连接20完全连接层7“双曲正切双曲正切8”完全连接20完全连接层9“双曲正切双曲正切10”完全连接20完全连接层11“双曲正切双曲正切12”完全连接20完全连接层13“双曲正切双曲正切14”连接20全连接层15“Tanh双曲正切16”全连接20全连接层17“Tanh双曲正切18”全连接1全连接层
将图层数组转换为adlnetwork
对象。
Net = dlnetwork(layers)
net = dlnetwork with properties: Layers: [18×1 nnet.cnn.layer.Layer] Connections: [17×2 table] Learnables: [18×3 table] State: [0×3 table] InputNames: {'input'} OutputNames: {'fc_9'} Initialized: 1查看summary。
定义模型损失函数
创建函数modelLoss
,列于模型损失函数节,该节将神经网络、网络输入以及初始和边界条件作为输入,并返回相对于可学习参数和相应损失的损失梯度。
指定培训项目
训练1500次,并使用L-BFGS解算器状态的默认选项。
numEpochs = 1500;solverState = lbfgsState;
训练神经网络
将训练数据转换为dlarray
对象。指定输入X
而且T
有格式“公元前”
(批处理、通道)并说明初始条件有格式“CB”
(频道,批处理)。
X = dlarray(dataX,“公元前”);T = dlarray(dataT,“公元前”);X0 = dlarray(X0,“CB”);T0 = dlarray(T0,“CB”);U0 = dlarray(U0,“CB”);
为L-BFGS更新创建一个包含损失函数的函数句柄。为了求出dlgradient
函数。modelLoss
函数采用自动微分,使用dlfeval
函数。
lossFcn = @(net) dlfeval(@ modelloss,net,X,T,X0,T0,U0);
初始化TrainingProgressMonitor
对象。因为计时器在创建监视器对象时开始,所以请确保创建的对象接近训练循环。
monitor = trainingProgressMonitor(...指标=“TrainingLoss”,...信息=“时代”,...包含=“时代”);
使用自定义训练循环训练网络。在每次迭代中使用完整的数据集。更新网络可学习参数和解算器状态lbfgsupdate
函数。在每次迭代结束时,更新训练进度监视器。
为i = 1:numEpochs [net, solverState] = lbfgsupdate(net,lossFcn,solverState);updateInfo(监视、时代=我);recordMetrics(监控、我TrainingLoss = solverState.Loss);结束
评估模型精度
的值 在0.25、0.5、0.75和1处,将深度学习模型的预测值与使用相对的伯格方程的真实解进行比较万博 尤文图斯 错误。
设置测试模型的目标时间。对于每一次,计算范围[-1,1]中1001个等间距点的解。
tTest = [0.25 0.5 0.75 1];numforecasts = 1001;XTest = linspace(-1,1, numforecasts);XTest = dlarray(XTest,“CB”);
测试模型。
图tiledlayout (“流”)为i=1: number (tTest) t = tTest(i);TTest = t*ones(1, numforecasts);* * * * * * * * * * * * *“CB”);做预测。XTTest = cat(1,XTest,TTest);UPred = forward(net,XTTest);计算目标。UTest = solveBurgers(extractdata(XTest),t,0.01/pi);计算错误。UPred = extractdata(UPred);err = norm(UPred - UTest) / norm(UTest);%绘图预测。nexttile情节(XTest upr,“-”、线宽= 2);ylim ([-1.1, 1.1])%绘制目标。持有在情节(XTest、ut、”——“线宽= 2)从标题("t = "+ t +, Error = "+收集(err));结束传奇([“预测”“目标”])
万博1manbetx支持功能
求解伯格方程函数
的solveBurgers
函数返回博格方程在某些时刻的真解t
详见[3.]。
函数U = solveBurgers(X,t,nu)定义函数。F = @(y) exp(-cos(*y)/(2*pi*nu));G = @(y) exp(-(y.^2)/(4*nu*t));初始化解决方案。万博 尤文图斯U = 0(大小(X));%遍历x个值。为i = 1:数字(X) X = X(i);使用积分函数计算解。万博 尤文图斯的边界x = -1和x = 1中的%条件是已知的,所以保持0不变%由初始化U。如果abs (x) ~ = 1有趣= @ (eta)罪(π* (x-eta)。* f (x-eta)。* g (eta);Uxt = -integral(fun,-inf,inf);Fun = @(eta) f(x-eta) .* g(eta);U(i) = uxt / integral(fun,-inf,inf);结束结束结束
模型损失函数
通过强制给定输入来训练模型 网络的输出 满足伯格方程、边界条件和初始条件。具体来说,有两个量可以使损失最小化:
,
在哪里 而且 .
在这里, 对应计算域边界上的配点,同时考虑边界和初始条件。 是定义域内部的点。
计算 需要求导 输出的 模型的。
这个函数modelLoss
将网络作为输入网
,网络输入X
而且T
,初始条件和边界条件X0
,T0
,情况
,并返回损失以及损失相对于可学习参数的梯度。
函数[loss,gradients] = modelLoss(net,X,T,X0,T0,U0)用初始条件进行预测。XT = cat(1,X,T);U =正向(净,XT);计算关于X和T的导数。gradientsU = dlgradient(sum(U,“所有”), {X T}, EnableHigherDerivatives = true);Ux = gradientsU{1};Ut = gradientsU{2};计算关于X的二阶导数。Uxx = dlgradient(sum(Ux,“所有”), X, EnableHigherDerivatives = true);计算mseF。执行伯格方程。f = Ut + u *Ux - (0.01./pi).*Uxx;零目标=零(大小(f),“喜欢”f);mseF = l2loss(f,zeroTarget);计算mseU。强制初始条件和边界条件。XT0 = cat(1,X0,T0);U0Pred = forward(net,XT0);mseU = l2loss(U0Pred,U0);%通过组合误差使计算损失最小化。损失= mseF + mseU;计算相对于可学习参数的梯度。gradients = dlgradient(loss,net.Learnables);结束
参考文献
Liu, Dong C., Jorge Nocedal。“关于有限内存BFGS方法的大规模优化。”数学规划45岁的没有。1(1989): 503-528。
Maziar Raissi, Paris Perdikaris和George Em Karniadakis,《物理知情的深度学习(第一部分):非线性偏微分方程的数据驱动解》万博 尤文图斯https://arxiv.org/abs/1711.10561
C. Basdevant, M. Deville, P. Haldenwang, J. Lacroix, J. Ouazzani, R. Peyret, P. Orlandi, A. Patera, Burgers方程的谱和有限差分解,计算机与流体14(1986万博 尤文图斯)23-41。