由于输出是无穷大的,因此难以使用神经网络进行回归,因此,您特别容易出现爆炸梯度问题(可能是nans的原因)。
从历史上看,爆炸梯度的一种关键解决方案是降低学习率,但是随着像Adam这样的每参数自适应学习率算法的出现,您不再需要设置学习率即可获得良好的性能。除非您是神经网络的恶魔并且知道如何调整学习时间表,否则几乎没有理由再使用SGD了。
您可以尝试以下操作:
通过分位数归一化或z评分对输出进行归一化。为严格起见,请根据训练数据而不是整个数据集计算此转换。例如,使用分位数归一化,如果示例位于训练集的第60个百分位数中,则其值为0.6。(您也可以将分位数归一化值向下移动0.5,以使第0个百分位数为-0.5,第100个百分位数为+0.5)。
通过增加辍学率或对权重添加L1和L2惩罚来增加正则化。L1正则化类似于特征选择,并且由于您说过将特征数减少到5可以提供良好的性能,因此L1也可以。
如果这些仍然无法解决问题,请减小网络规模。这并不总是最好的主意,因为它会损害性能,但是在您的情况下,相对于输入特征(35),您拥有大量的第一层神经元(1024),因此可能会有所帮助。
将批次大小从32增加到128。128是相当标准的,可能会增加优化的稳定性。



