- **问题:**用pytorch的crossentropy做损失函数的时候,迭代几步之后loss为nan。
交叉熵损失函数的具体为:
loss = -(x*ln(z)+(1-x)*ln(1-z))
z = softmax(pred_x)
这样当z为0/1时会出现loss为nan的情况
本人的具体原因
网络中用了MultiHeadAttention,attention的mask全为0,这样attention就为nan,造成个别样本的输出特征全为nan。于是就自己用pytorch写了一个cross_entropy loss函数,剔除掉有时候个别为nan的样本。
github地址:Self_cross_entropy
参考解决方案
- 在pred_x上加一个很小的量,如1e-10
loss = crossentropy(out+1e-8, target)
- 采用更小的学习率
- 做梯度裁剪
The recommended thing to do when using ReLUs is to clip the gradient。
参考自here - 还可能是数据有问题
比如这位的.链接
[参考]
- https://stats.stackexchange.com/questions/108381/how-to-avoid-nan-in-using-relu-cross-entropy