求助。
C++手写LSTM,偶遇Loss==NaN强如怪物,拼尽全力,无法战胜。
我只是抱着试一试的心态,凭兴趣学的机器学习,正好放假了有时间打代码,不是专业选手。
话说有没有这方面专业大佬,启发我一下这是什么原因?如何解决?
我也上网查了一些资料,Loss==NaN的原因有这几点(可能有重叠):
1. 梯度消失或爆炸;
2. 计算Softmax时指数过大或过小;
3. 超参数不恰当;
4. 原数据有问题;
解决方法有下面几点:
1. 梯度裁剪;
2. 降低学习率、正则化参数;
3. 使用更高级的权重初始化方法;
4. 检查原数据;
我进行了梯度裁剪,控制梯度、边权和节点值都在[-1e10, 1e10]之间。没有每进行一次乘法就裁剪,请问需要这样吗?
计算Softmax时将指数限定在了[-23, 23]。
我的梯度下降限定迭代次数为20000次,不进行正则化、学习率为0.4时,在迭代期间已经没有收敛,超参数是否有待优化?
我的权重初始化方法很原始,是 (1e-4 * 0~2000随机整数 / 1000) - 1e-4,请问这样有影响吗?
数据是我自己编的小数据,总共两个点,每个点长度不超过10,x和y都是0或1。
我用的数据类型是double,这里面很多问题都和double的浮点下溢有关,请问在没有其他专门库的情况下,推荐使用double吗?
恳求各位大佬不吝赐教!
图为限定迭代次数为20000次,学习率为1.6和0.8时的输出层情况,纵向排列的是训练过程中的输出,横向排列的是边权“收敛”后的输出。