训练过程中Loss函数出现Nan的可能原因

    技术2024-10-02  61

    综合我做过的一些实验,记录一下实验过程中Loss出现Nan的一些可能原因:

    最简单的,学习率过大。 BTW, 学习率过大还可能导致收敛到一个定值之前实验室的师姐拿云图做DNI分类的结果最后都收敛到同一个数值,结果我后来一看也是学习率过大导致的。

    其中的原因我猜测是使用了ReLU激活函数以后,某一步跨入了一个点,使得出现了dead neuron的现象,然后前面的参数全部不更新,导致最后的结果变成了定值。所以ReLU的学习率一般不会很大。

    解决方法:

    base_lr,至少减小一个数量级。如果有多个loss layer,需要找出哪个损失层导致了梯度爆炸,并减小该层的loss_weight,而非是减小通用的base_lr。设置clip gradient,用于限制过大的diff。参考

    坏样本的加入 比如一个样本的全是0,你减去均值除以方差以后就变成了nan,你自己不会发现,进入神经网络以后会使得突然loss也变nan了(因为反传是需要用到的)

    参考

    你自己定义的某个Tensor没有初始化 比如代码中实现一些简单的weight matrix的时候,你直接使用torch.FloatTensor作为训练参数,但是FloatTensor本身的初始化是不适用于深度神经网络的,此时最好用nn.init.kaiming_normal()之类的函数初始化一下。

    损失函数的Bug

    原因:有时候损失层中loss的计算可能导致NaN的出现。比如,给InfogainLoss层(信息熵损失)输入没有归一化的值,使用带有bug的自定义损失层等等。

    现象:观测训练产生的log时一开始并不能看到异常,loss也在逐步的降低,但突然之间NaN就出现了。

    措施:看看你是否能重现这个错误,在loss layer中加入一些输出以进行调试。

    Processed: 0.014, SQL: 9