PyTorch预测值相同的处理

2022-10-22 11:35:40

最近训练一个BP神经网络做回归,发现拟合效果很烂,甚至我用单样本训练竟然还是欠拟合。然后我昨天晚上发现,这个预测结果,随着我epoch次数的增加,最后所有预测结果会趋同。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这边一共放了三张大图,每张大图里面有两张小图,上面的小图记录了train accuracy(红)和test accuracy(蓝),评价标准是R square;下面的小图是我追踪的预测结果。三次训练分别是10、3、2个样本。
可以很明显看到,训练集上的R square最后趋近于0, R 2 = 1 − R S S T S S R^2=1-\frac{RSS}{TSS}R2=1TSSRSS
当 R 2 = 0 有 R S S = T S S 当R^2=0 有RSS=TSSR2=0RSS=TSS
即 ∑ i ( y i − y ^ ) 2 = ∑ i ( y i − y ˉ ) 2 即\sum_i (y_i-\hat{y})^2=\sum_i (y_i-\bar{y})^2i(yiy^)2=i(yiyˉ)2
这也就是说我的预测值跟真实的平均值一模一样了,从下面的三张小图可以看出来确实如此,最后所有预测值合并成一条曲线了。
其实我到现在也没明白为啥会这样,我是用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平方原来会趋于零,不胜感激【抱拳】。

  • 作者:JasmineFeng
  • 原文链接:https://blog.csdn.net/jasminefeng/article/details/111169579
    更新时间:2022-10-22 11:35:40