PyTorch预测值相同的处理

最近训练一个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=TSS R2=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})^2 i(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平方原来会趋于零,不胜感激【抱拳】。

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值