对于多种任务的联合输出,如果loss出现了Nan,我们首先应该确定到底是哪个任务导致的。其次,可以根据以下可能性或者解决方案来排查Nan。
1)降低学习率,降为原来的0.1——0.001
2)添加L2正则,或者在优化器中添加weight_decay(一般0.1——0.01)
3)排查出现Nan的网络层,对输入的表示进行数据归一化BatchNorm
4)使用了RNN作为特征学习网络,尽量避免在输出后使用ReLU激活函数,可能出现梯度爆炸。可以通过添加“gradient clipping”来解决
5)权重初始化方案有问题,多尝试几种不同的初始化方法
6)dropout参数过小,或者dropout频繁
7)可能出现了log(0)。请注意,我们经常在mask中会使用0进行标记,然后使用log(mask)进行某种剔除,这时候非常可能出现Nan。最好的方法是log(mask+1e-9)进行非0处理。
参考文献:
神经网络训练时损失(loss)不下降常见解决办法以及训练时损失出现nan可能原因以及解决