【神经网络+数学】——(1)神经网络求解一元积分问题
背景神经网络快速发展,对传统的数学问题求解提出了新的思路,积分问题传统方式采用牛顿莱布尼茨公式,存在原函数难以找到的不足,以及现有被积函数的表达式可能无法显式表达,只能通过离散点来表示,而神经网络不依赖表达式,只要有离散的点(被积函数曲线上的点)即可完成积分。但缺点是不如传统得到原函数表达式的情况,神经网络积分不能计算任意定义域内的,必须是训练集给定的范围内的。问题描述2x+exp(x)2x+ex
背景
神经网络快速发展,对传统的数学问题求解提出了新的思路,积分问题传统方式采用牛顿莱布尼茨公式,存在原函数难以找到的不足,以及现有被积函数的表达式可能无法显式表达,只能通过离散点来表示,而神经网络不依赖表达式,只要有离散的点(被积函数曲线上的点)即可完成积分。但缺点是不如传统得到原函数表达式的情况,神经网络积分不能计算任意定义域内的,必须是训练集给定的范围内的。
问题描述
2x+exp(x)2x+exp(x)2x+exp(x)
给定区间x in (−1,1)x\ in\ (-1,1)x in (−1,1)上积分
原函数为x2+exp(x)x^2+exp(x)x2+exp(x)
可计算F(1)-F(0)得到真实值用来测试精度
神经网络搭建
# 原函数网络
self.raw_net = Sequential([
# 需要指定input_shape 否则报错shape不匹配
layers.Dense(1, input_shape=(1,), activation=activation),
layers.Dense(8, activation=activation),
layers.Dense(32, activation=activation),
layers.Dense(8, activation=activation),
layers.Dense(1, )
])
搭建一个菱形网络
模型训练
神经网络为原函数等效器,通过train step的方式完成自动微分,得到被积函数等效器,利用已知的被积函数函数值进行偏差计算,输出loss后反向传播更新神经网络梯度,最后得到原函数等效器用于计算积分值。
训练结果
蓝线和绿线几乎重合了,同时黄线幅值过大导致两者几乎重合。
可见loss下降正常,但黄线上升,下面分析原因:
原函数的拟合情况如图所示,差距增大主要是因为从开始的接近到最后的稳定间隔分离,所以需要进行修正,修正的方式经过思考加入了值约束,将其考虑到loss中,修正后重新训练模型:
可见效果取得了质的飞跃,之前的问题也全部解决,可作为亮点和核心关键算法来写。
扩展工作
神经网络的优势还在于网络模型结构不用变化,可适应一般情况。所以这里修改被积函数为
配置超参数如下:
训练效果:
可见原函数拟合效果极佳
调整迭代次数,得到
实际应用中可根据精度要求以及计算速度的要求灵活选取迭代次数,所以该方法工程落地的指导性较强。
基于本博客的思想和扩展工作成果,本人已撰写一篇论坛论文,欢迎技术交流!
备注
如需技术支持(源码+本项目相关的任何问题答疑),请打赏支付宝并添加支付宝好友备注。
代码质量可靠有保障,提供了丰富的用户接口可以自定义实验,还可根据你的个性化需求进行代码定制修改(比如修改被积函数),提供的主要用户接口如下:
bias = 1#原函数的偏置量
epochs = 5000
lr = 0.001
train_model = True
retrain = False
# 首先xl和xr的范围,不能超出范围去预测范围外的积分值
xl = -1
xr = 1
size = 1000
epoch_interval = 200
# tanh relu sigmoid elu selu
# softmax softplus softsign hard_sigmoid exponential
# linear
activation = 'elu'
更多推荐
所有评论(0)