未发表

本篇工作时关于连续时间的PDE。也是从因果关系的角度入手,最近看过几篇该作者的工作。(简而言之就是从初始条件方向开始训练)

目前的PINN框架缺乏尊重物理系统演化所固有的时空因果结构。因此,作者提出PINNs损失函数的简单再表述来解决上述问题。并且这个函数可以在模型训练期间明确解释物理因果关系。并将它用作评估PINN收敛的一种机制。

首先,作者表明,目前的通过梯度下降训练连续时间的PINN,可能会隐含地偏向于在稍后的时间,甚至在解决初始条件之前就首先逼近PDE的解,这严重违反了时间因果关系。尤其当目标函数表现出对初始数据强烈的依赖性(混沌系统)时,就很容易失败。通过一个简单地例子描述一下:

one-dimensional Allen-Cahn equation

将边界条件作为硬约束。下图是作者的结果,经典的PINN无法处理好这个问题。

原始的PINN应该也可以求解,下图是我去原始PINN中找到的。

为什么PINN会失败呢?作者通过分析损失函数给出了解释。

一开始,定义一个时间残差损失,即在某个时间点,在该点的所有空间残差损失的平均。如下。

那么,PINN的总损失就可以写成

借助切线核理论,进一步离散损失,就可以得到下式。

离散后的损失告诉我们,如果我们想要最小化在某个时间点的时间残差损失,我们需要准确地预测该点的u和前一时刻的u,而在PINN的框架中,我们将对整个时空域内的u同时进行最小化。这就违反了时间因果关系,使得PINN的收敛性受到影响。只有在前一时刻PINN的模型得到好的优化的时候,小幅度后的PINN残差最小化才有意义。

根据下图,我们可以看到,原始PINN更容易关注远离初始条件的位置。

根据上述的观察,作者提出了PINN的因果训练,通过对损失函数的重新表述来使得PINN满足因果规律。具体地说,就是给每个时间残差损失前添加一个权重,如下。

作者希望,在ti被充分最小化前,它以及它之前时刻的权重都应该很大,它们之后的权重要很小。通过下式的权重选择实现这个目标。

那么总损失就可以写成

这就可以从时间小的开始训练。当时我的疑惑是:网络收敛会很难吧。当优化到中间时,如果前面有学不好了,那么网络就会重新训练前面,会导致收敛上的困难吧?需要去调参设计吧,后面作者使用退火算法来解决。

可以看到改进后可以找到正确的解了。

并且,根据下图,还可以发现一个规律。训练刚开始的时候,除了0时刻,其余时刻权重全是0。也就是网络先学习初始条件附近的。随着训练的进行,权重会逐渐的释放,并且终会收敛到1。

这就可以为训练PINN提供收敛标准,当所有权重趋于1时,PINN训练完成。实际中可以人为选取一个小于1的阈值来停止训练。停止条件如下。

关于因果参数的敏感性,也就是我上面的疑惑,作者做了消融。发现因果参数太小的会阻止网络有效最小化后面的时间残差,太大会导致训练困难。因为前面的时间残差要充分小才能激活后面的时间权重。所以作者使用一组递增因果参数进行训练,虽然会导致计算量的增加,但是避免了人工干预的繁琐。此外作者还提出了一个改进的MLP结构,具体的解释将在另一篇论文中,暂时还没有去看。

实验结果如下

实验结果还是很好的,有效的解决了远离初始位置训练不好的问题。

Respecting causality is all you need for training physics-informed neural networks的更多相关文章

  1. [Xavier] Understanding the difficulty of training deep feedforward neural networks

    目录 概 主要内容 Glorot X, Bengio Y. Understanding the difficulty of training deep feedforward neural netwo ...

  2. Xavier——Understanding the difficulty of training deep feedforward neural networks

    1. 摘要 本文尝试解释为什么在深度的神经网络中随机初始化会让梯度下降表现很差,并且在此基础上来帮助设计更好的算法. 作者发现 sigmoid 函数不适合深度网络,在这种情况下,随机初始化参数会让较深 ...

  3. Understanding the difficulty of training deep feedforward neural networks

    本文作者为:Xavier Glorot与Yoshua Bengio. 本文干了点什么呢? 第一步:探索了不同的激活函数对网络的影响(包括:sigmoid函数,双曲正切函数和softsign y = x ...

  4. MLHPC 2018 | Aluminum: An Asynchronous, GPU-Aware Communication Library Optimized for Large-Scale Training of Deep Neural Networks on HPC Systems

    这篇文章主要介绍了一个名为Aluminum通信库,在这个库中主要针对Allreduce做了一些关于计算通信重叠以及针对延迟的优化,以加速分布式深度学习训练过程. 分布式训练的通信需求 通信何时发生 一 ...

  5. Aluminum: An Asynchronous, GPU-Aware Communication Library Optimized for Large-Scale Training of Deep Neural Networks on HPC Systems

    本文发表在MLHPC 2018上,主要介绍了一个名为Aluminum通信库,这个库针对Allreduce做了一些关于计算通信重叠以及针对延迟的优化,以加速分布式深度学习训练过程. 分布式训练的通信需求 ...

  6. MLHPC 2016 | Communication Quantization for Data-parallel Training of Deep Neural Networks

    本文主要研究HPC上进行数据并行训练的可行性.作者首先在HPC上实现了两种通信量化算法(1 Bit SGD以及阈值量化),然后提出了自适应量化算法以解决它们的缺点.此外,发挥出量化算法的性能,作者还自 ...

  7. Training Deep Neural Networks

    http://handong1587.github.io/deep_learning/2015/10/09/training-dnn.html  //转载于 Training Deep Neural ...

  8. [Converge] Training Neural Networks

    CS231n Winter 2016: Lecture 5: Neural Networks Part 2 CS231n Winter 2016: Lecture 6: Neural Networks ...

  9. 阅读笔记 The Impact of Imbalanced Training Data for Convolutional Neural Networks [DegreeProject2015] 数据分析型

    The Impact of Imbalanced Training Data for Convolutional Neural Networks Paulina Hensman and David M ...

  10. [CS231n-CNN] Training Neural Networks Part 1 : activation functions, weight initialization, gradient flow, batch normalization | babysitting the learning process, hyperparameter optimization

    课程主页:http://cs231n.stanford.edu/   Introduction to neural networks -Training Neural Network ________ ...

随机推荐

  1. libcurl CURLOPT_WRITEFUNCTION 回调函数多次触发导致数据错乱的问题

    记录一下自己犯的错误,回调函数本身就会提供数据大小,自己算反而出了问题. size_t Get_Receive_Data(void* buffer, size_t size, size_t nmemb ...

  2. linux常用操作指令记录

    https://maker.pro/linux/tutorial/basic-linux-commands-for-beginners ## 打开终端 ## **Ctrl+Alt+T** ## ls ...

  3. Kali配置gmssl密码算法库

    Kali配置gmssl密码算法库 一.密码算法库的下载 https://github.com/guanzhi/GmSSL/releases 二.安装配置 1 解压 把刚刚下载的GmSSL 3.0.0. ...

  4. Linux查询CPU,内存,硬盘使用率以及网卡流量指令

    Linux查询CPU,内存,硬盘使用率以及网卡流量指令 1.获取cpu使用率 //cpu `top -b -n1 | fgrep "Cpu" | awk '{print 100-$ ...

  5. JavaSE总结(1)

    Java发展历史.HelloWorld.常量.变量类型转换.运算符.方法(函数)1.jdk版本:    jdk1.2---J2EE/J2SE/J2ME    jdk1.5---JavaSE/JavaE ...

  6. linux升级系统内核

    1. 查看老版本系统内核 2. 升级内核 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www. ...

  7. c++练习267题 火柴棒等式

    *267题 原题传送门:http://oj.tfls.net/p/267 题解: #include<bits/stdc++.h>using namespace std;int c,m;in ...

  8. 如何在mac上配置Apache服务器

    ​ 如何在mac上配置Apache服务器 1. 打开终端,开启Apache: //开启apache:  sudo apachectl start //重启apache:  sudo apachectl ...

  9. golang 用gorm生成module文件

    网上的包过于繁琐复杂.所以写个简单.mysql的多种数据类型没有全部实现转化.可以编译成可执行文件. package main import ( "flag" "fmt& ...

  10. Java密码加密的两种保存方式

    密码加密的两种方式(md5和base64) 常见的加密方式有盐值,md5和jdk自带的base64,这里我记录的是base64如何使用,以及破解的方式,话不多说,直接贴代码! 其实md5和加盐值都差不 ...