Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SPINN只支持[x y z]的输入设定,内置的Helmholtz也只支持3d #1074

Open
pecanjk opened this issue Feb 11, 2025 · 6 comments
Open

Comments

@pecanjk
Copy link

pecanjk commented Feb 11, 2025

需求描述 Feature Description

能否优化一下,特别是如果考虑3d wave equation时,会有时间变量

替代实现 Alternatives

No response

@HydrogenSulfate
Copy link
Collaborator

你好,在 #1075 中已经进行了修改

@HydrogenSulfate
Copy link
Collaborator

需求描述 Feature Description

能否优化一下,特别是如果考虑3d wave equation时,会有时间变量

原论文似乎没有考虑对于时间的处理,所以你知道时间变量该如何处理吗?

@pecanjk
Copy link
Author

pecanjk commented Feb 13, 2025

需求描述 Feature Description

能否优化一下,特别是如果考虑3d wave equation时,会有时间变量

原论文似乎没有考虑对于时间的处理,所以你知道时间变量该如何处理吗?

我看原文以及源代码里并没有单独考虑时间变量,是和空间变量一样,也是一个branch

SPINN_4d-L184
还有klein_gordon3dnavier_stokes4d,都有时间变量

@pecanjk
Copy link
Author

pecanjk commented Feb 13, 2025

你好,在 #1075 中已经进行了修改

另外不是很理解
u__x__x = hvp_revrev(lambda x_: self.model.forward_tensor(x_), (xs[0],))
Helmholtz方程里的二阶导数为什么用hvp_revrev实现,SPINN里说Foward_AD能省,PaddleScience里仍然用的Backward_AD?另外我本地用通用的符号化u.diff(x,2)来表示方程,也没有明显看到计算更慢/更省?感觉主要节省是在数据输入只有O(Nd)。

另外SPINN文章里说不同维度的branch没有必要采样数一样,PaddleScience里对不同维度采样数量N不一样时报错?

@HydrogenSulfate
Copy link
Collaborator

你好,在 #1075 中已经进行了修改

另外不是很理解 u__x__x = hvp_revrev(lambda x_: self.model.forward_tensor(x_), (xs[0],)) Helmholtz方程里的二阶导数为什么用hvp_revrev实现,SPINN里说Foward_AD能省,PaddleScience里仍然用的Backward_AD?另外我本地用通用的符号化u.diff(x,2)来表示方程,也没有明显看到计算更慢/更省?感觉主要节省是在数据输入只有O(Nd)。

另外SPINN文章里说不同维度的branch没有必要采样数一样,PaddleScience里对不同维度采样数量N不一样时报错?

  1. paddle目前还没有实现forward-mode ad,hvp_revrev内实际上调用的是paddle.incubate.autograd.jvp这个函数,该函数是基于reverse-mode ad + double-back trick实现的jvp,所以我这里写了是revrev。
  2. 当输入和输出元素数量不同时,jvp和vjp的计算结果是不一样的,前者形状等于输出的形状,后者形状等于输入的形状。这篇论文里输入进行了tensor_contraction才得到的输出,其形状不相等,所以直接用vjp会造成计算loss时形状不正确。
  3. 我试了下不同的轴,使用不同的nc,能够正常运行,不知道你是如何修改的呢?
    Image

@HydrogenSulfate
Copy link
Collaborator

你好,在 #1075 中已经进行了修改

另外不是很理解 u__x__x = hvp_revrev(lambda x_: self.model.forward_tensor(x_), (xs[0],)) Helmholtz方程里的二阶导数为什么用hvp_revrev实现,SPINN里说Foward_AD能省,PaddleScience里仍然用的Backward_AD?另外我本地用通用的符号化u.diff(x,2)来表示方程,也没有明显看到计算更慢/更省?感觉主要节省是在数据输入只有O(Nd)。

另外SPINN文章里说不同维度的branch没有必要采样数一样,PaddleScience里对不同维度采样数量N不一样时报错?

目前PaddleScience的对于sympy.diff的处理是映射到paddle.grad这个反向微分接口上,暂未支持前向微分。至于时间t的输入,我晚点会参考SPINN代码加一下。感谢反馈问题

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants