**问题:**用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
参考解决方案
- 1.在pred_x上加一个很小的量,如1e-10
loss = crossentropy(out+1e-8, target)
- 2.采用更小的学习率
- 3.做梯度裁剪