xianggebenben / dlADMM

dlADMM: Deep Learning Optimization via Alternating Direction Method of Multipliers
153 stars 37 forks source link

如何把dlADMM算法用于physics informed neural network的训练? #1

Closed xgxg1314 closed 2 years ago

xgxg1314 commented 2 years ago

您好,非常感谢您的开源仓库,很值得学习借鉴的工作!我有个疑问,是否可以将您的算法用于PINN的训练,不知道您是否了解PINN。这里有个知乎帖子介绍: PINN代码实现

简单说就是loss的构造跟一般的监督学习不太一样,传统监督学习中loss = Loss(pred - ture),但在PINN中,把微分方程也加入到loss中,于是PINN的loss = Loss(pred - ture) + Loss_pde。而构造Loss_pde过程中,需要使用自动微分求导,用来构造微分方程中的各阶导数项,进而得到Loss_pde。 pytorch实现PINN的算例代码

` def net_f(self, x, t): """ The pytorch autograd version of calculating residual """ u = self.net_u(x, t)

    u_t = torch.autograd.grad(
        u, t, 
        grad_outputs=torch.ones_like(u),
        retain_graph=True,
        create_graph=True
    )[0]
    u_x = torch.autograd.grad(
        u, x, 
        grad_outputs=torch.ones_like(u),
        retain_graph=True,
        create_graph=True
    )[0]
    u_xx = torch.autograd.grad(
        u_x, x, 
        grad_outputs=torch.ones_like(u_x),
        retain_graph=True,
        create_graph=True
    )[0]

    f = u_t + u * u_x - self.nu * u_xx
    return f`

上述代码就是构造Loss_pde。不知道您的算法框架中,能否实现加入这个Loss_pde,进而实现PINN的训练?看您的代码中,应该没有使用自动微分求导。

VistaLee commented 2 years ago

你好,感谢关注我们的工作。dlADMM通过对神经网络引入层间变量,将原本的loss函数最小化问题拆成了多个子问题进行求解,每个子问题的目标函数只依赖部分变量。Loss_pde里需要用到DNN输出u对于外部输入(x, t)的梯度信息,如果直接应用dlADMM的话u与(x, t)独立,不能求梯度。