最近训练一个BP神经网络做回归,发现拟合效果很烂,甚至我用单样本训练竟然还是欠拟合。然后我昨天晚上发现,这个预测结果,随着我epoch次数的增加,最后所有预测结果会趋同。

pytorch回归loss pytorch回归预测值相同_神经网络


pytorch回归loss pytorch回归预测值相同_数据挖掘_02


pytorch回归loss pytorch回归预测值相同_数据挖掘_03


这边一共放了三张大图,每张大图里面有两张小图,上面的小图记录了train accuracy(红)和test accuracy(蓝),评价标准是R square;下面的小图是我追踪的预测结果。三次训练分别是10、3、2个样本。

可以很明显看到,训练集上的R square最后趋近于0,pytorch回归loss pytorch回归预测值相同_神经网络_04

pytorch回归loss pytorch回归预测值相同_深度学习_05

pytorch回归loss pytorch回归预测值相同_pytorch_06

这也就是说我的预测值跟真实的平均值一模一样了,从下面的三张小图可以看出来确实如此,最后所有预测值合并成一条曲线了。

其实我到现在也没明白为啥会这样,我是用MSE作损失函数的呀,又没拿R平方当损失函数,为啥它最后会趋于零呢???

我的网络结构是这样的:

  • Layer1: Linear(7,1) —> BatchNorm —> ReLU —> Dropout
  • Layer2: Linear(1,100) —> BatchNorm —> ReLU —> Dropout
  • Layer3: Linear(100,150) —> BatchNorm —> ReLU —> Dropout
  • Last_layer : Linear(150,1)

按理说这四层应该能拟合绝大部分函数了,但为什么还是会欠拟合呢,而且最后预测值还一毛一样???
我今天早晨又调试了一下,我明白他是怎么预测出全部相同的了。
这玩意儿,每一层学习出来的权重W都是10^-3数量级的,bias好多都是0,这就导致了Layer3在做完Dropout后,想Last_layer输入的x全是0,然后Last_layer轻轻松松就让所有的预测值相同了,通过bias。
我吐了呀,没想到神经网络这么心机。
我还发现梯度好像很小,有梯度消失之嫌。

这个时候我突然想起来以前看过BatchNorm和Dropout同时存在会导致训练更差的推文:“BN和Dropout单独使用都能减少过拟合并加速训练速度,但如果一起使用的话并不会产生1+1>2的效果,相反可能会得到比单独使用更差的效果。”

然后我就删掉了Dropout层,同时调大了学习率(抵抗梯度消失)。
然后现在R平方总算能达到0.5了,我好开心。
但是不得不承认神经网络对我真是玄学,希望懂的大佬能给我解释解释为啥R平方原来会趋于零,不胜感激【抱拳】。