手动实现的神经网络,每次训练loss完全一样,怎么办?
问题:Loss/Accuracy不变
今天下午跑实验2,手写的回归算法。反复检查Code没有问题,但是Loss从epoch2开始一直不变(如图)。是什么原因呢?
网上方案
经过手动排查,网上列出的原因主要有以下三种,测试了均没有效果。
学习率太大、太小
根据指数搜索策略,手动更改学习率为0.1、0.01、0.001后,loss依旧不变。
y y y和 y ^ \hat{y} y^不在同一维度,发生了广播
for X, Y in train_iter:
# the predication
Yhat = net(X)
# ensure y^ and y in same size
print("Yhat",yhat.size())
print("Y",Y.size())
手动检查,发现维数完全正确。
最后一层添加了激活函数
去除激活函数。发现仍然没有改变。
训练过程中存在命名错误
例如:dataloader命名为y,和训练过程中的y命名重复
最终解决:数据集的virance不够大(太简单了)
手动打印了梯度,发现从epoch2开始gradient矩阵为零。
最终发现原因:
- 数据集中向量的方差太小。
- 使用性质较好的Relu作为激活函数。
- 使用网络层数较多,特征学习充分
- 最终使得模型在数据集上一次收敛。
更改如下:
- 让向量均匀分布。
- 使用性质没有那么优良的Sigmoid作为激活函数。
- 减少隐藏层个数 Debug时可以直接使用线性模型进行debug
- 出现了数值不稳定错误 例如:Softmax和交叉熵分别定义可能会导致溢出
结果:
各位亲可以试一下以上方法,如果成功了,记得点个赞哦~ 也欢迎补充其它可能的原因。