Deep Ritz Method 是鄂维南老师(Weinan E)提出来的一种用神经网络求解PDE的方法, 作为最开始的几篇探讨DeepLearning 与PDE 关系的文章,他的很多思想还是很厉害的, 下面我们来介绍一下这篇文章以及我在实现时遇到的一些问题。
基本思想
对于给定的一个变分问题
我们怎么用神经网络来求解呢?
事实上, 我们把 中的每个点看做训练样本, 将
看做是神经网络的输出, 将
看做是损失函数去优化, 这个问题便解决了。
但是具体实践过程中,有以下几点要注意:
1.采用 Adam 作为优化器, 初始学习率为 1e-3;
2. 网络结构采用 Resnet 结构, 也就是
3.激活函数选取 有点奇怪,应该是作者仔细选取后得出来的,原文是这样说的(To balance simplicity and accuracy)
4. 损失函数是一个积分的形式, 我们把它取成离散和。 值得注意的是: 这里的离散和并不是传统意义上的积分和(Riemann和)。举个例子, 我们一般求解 上的问题, 均匀采点,解方程。 但是这里的离散和不是均匀采点得来的,而是来自均匀分布采样。即 x_i 是从均匀分布中采的点, Loss Function 为
我的体会
1. 损失函数不一定为正
2. 文章中给定的函数在我的实际计算中可能会梯度爆炸, 所以我采用的激活函数是 Tanh()
3. 对于高维问题的边界采样还不是很友好(好像也没有什么其他的办法)
注意到以上情况后,复刻文章中的实际例子便很简单了。 比方说:
对于文章中的第一个例子:
此问题对应的变分形式为
其中第二项用来惩罚边界,作者给出的解为
我采用
- Adam优化器, 初始学习率为1e-3,
- 边界的惩罚因子为500,
- 每次从内部随机采点500个,边界采点100个,
- xavier初始化神经网络的W,b,
- 训练50000次
得到最后的结果为
![](https://i-blog.csdnimg.cn/blog_migrate/34062f39359b20d40b20e577cffe8810.png)
再来测试一个高维例子:
可以看到
上述两个例子的代码见