提交作者 | 梁嘉铭 |
提交时间 | 2022-04-22 |
版本号 | V1.3 |
依赖飞桨版本 | develop 版本 |
文件名 | 20220310_DeepXDE_design_for_paddle.md |
-
Support function approximation
Goal: Support the following test examples: func.py, dataset.py
-
Support solving forward ODEs
Goal: Support the following test examples: A simple ODE system
-
Support solving inverse ODEs
Goal: Support the following test examples: Inverse problem for the Lorenz system, Inverse problem for the Lorenz system with exogenous input
Deepxde是一个非常有用的求解函数逼近,正向/逆常/偏微分方程 (ODE/PDE)代码仓库。该功能会增加 Paddle 在科学计算方面的使用。
-
例如
paddle.sin()
,paddle.cos()
算子的求高阶导数,所以不支持apply_feature_transform()
以及apply_output_transform()
函数。 考虑参考#32188pr,对 sin/cos 函数的求二阶导数算子进行支持。具体将在#L93行添加SinGradGradFunctor
方法,以及CosGradGradFunctor
方法,并在L267处进行调用,在L1477处进行注册。 -
Paddle 近期合入了
L-BFGS
优化器以及BFGS
优化器,调用方式为函数式调用
Tensorflow、Pytorch、jax 均在 deepxde 中得到支持。
其中 Pytorch 的L-BFGS
优化器可以类似于 optimizer 式的调用,而tensorflow中是类似于 Paddle 合入的L-BFGS
优化器,通过构造一个待优化的函数进行优化。
但是考虑到 L-BFGS 优化器输入为一维向量,所以在输入优化的权重参数时,需要将其转换为一维向量。可参考 TensorFlow 的实现,tfp_optimizer。
在代码中 PaddlePaddle 的名称会被书写为 paddle。
实现方式主要参考Pytorch
的实现方式。
在 paddle 中已经通过commit 提交对 Jacobian 进行了支持,该求导方式就是通过paddle.grad()
对函数求导,而 deepxde 已经实现了 Jacobian 类,所以只需要求解 y 对 x 的导即可,使用paddle.autograd.grad
进行求导,具体为
self.J[i] = paddle.autograd.grad(y, self.xs, create_graph=True, retain_graph=True)[0]
含义为求解 y 对 x 的导,并且保留求导过程中的计算图,以便后续求解 y 对 x 的二阶导。
为提前加入对 sin/cos 等算子的高阶导数,我们将模型默认设置为静态图模式,具体是在模型 forward()函数前用 @paddle.jit.to_static
进行自动转换。
根据任务要求,测试在 excample 中如下文件。
- func.py, dataset.py
- ode_system.py
- Lorenz_inverse.py, Lorenz_inverse_forced.ipynb
实现功能已经完成。总体可以在活动时间内完成。
对 deepxde 新增 backend, 无影响。