我们采用神经网络拟合43x1+1x2我们采用神经网络拟合\space\space\frac4{3x_1}+\frac1{x_2} 我们采用神经网络拟合 3x14+x21
实验记录:
无论改变网络层数,还是改变网络的激活函数,当随机取点的范围由0.1-0.5变为0.001到0.5时,误差总会迅速增大,直到0-0.5时彻底跑飞。
原因很明显,函数在x1,x2趋近0时值会变成无穷大,那么怎么解决这一问题呢?
答案非常简单,替换损失函数——由mse换为msle.
整体的代码可以参考我的github项目。
在进一步的实验又发现了许多有趣的现象,记录如下:
1.使用shuffle之后,训练效果变差,卡在8.多左右;
2.将第二个隐藏层的参数由2xsize变为3xsize之后,效果也变差了,也是误差下不去;
以上两点都是在换成msle后出现的问题。
此外,msle在拟合平面上效果也不错。(val集误差仅10-3量级)
至于优化算法:至少在目前这两个网络结构上,sgd和adam的表现差不多:
(sgd)loss: 0.3602 - mean_squared_logarithmic_error: 0.3602 - val_loss: 0.5258 - val_mean_squared_logarithmic_error: 0.5258
(adam)loss: 0.3477 - mean_squared_logarithmic_error: 0.3477 - val_loss: 0.5307 - val_mean_squared_logarithmic_error: 0.5307
但是,当sgd+将第二个隐藏层的参数由2xsize变为3xsize时(以下简称为“宽”()(9),效果竟然变的相当好,这一下子网络变宽的性能竟然体现出来了(后来重新实验发现这种现象消失了!!!why?):
3125/3125 [==============================] - 1s 466us/step - loss: 0.2471 - mean_squared_logarithmic_error: 0.2471 - val_loss: 0.2247 - val_mean_squared_logarithmic_error: 0.2247
我尝试加深一层网络,使用sgd和adam却都让网络变得很糟糕,几乎没能拟合到什么东西(误差8.多下不去,直接预测成平面)
尝试新的loss函数logcosh:
我尝试了logcosh+sgd或adam在窄网络上,logcosh+sgd在宽网络上,结果都差不多:误差一开始从80左右能降到40但之后就不行了,观察图像,发现他其实也差不多是平的,但是好歹平移了一下:
总结:下一步工作设计一个多层for循环自动调参,使我看得更清楚。
为了解决当务之急,我缩小了训练区域,企图通过在小区域内密集训练实现更好的拟合效果,但是效果仍不很明显:
train0-0.3 test0-1 1331.
种群信息导出完毕。
评价次数:25000
时间已过 1.6455268859863281 秒
最优的目标函数值为:8.9836
最优的控制变量值为:
0.10010000000000001
0.4438835845159062
总会有一个差值。。。不知道怎么来的,真实解是0.24-0.24
shuffle=True+1331+adam(sgd根本下不去,这是强行下去了,直接压成两个平面,我服了这个网络的想法):
拟合平面时不使用(或少使用)relu效果更好
;
有时候就是运气不好,优化算法没有奏效,loss下不去,拟合平面时用adam+msle尤为如此;改为sgd+mse似乎更好一些