BERT继续预训练任务之loss为nan

最近想使用领域的数据对BERT继续进行预训练,让BERT具备领域知识。因此使用领域数据对BERT进行了继续预训练。

首先,继续预训练的任务仍然是沿用BERT的预训练任务,MLM和NSP任务。

模型的结构很简单,就是输入经过BERT进行编码,然后把编码后的句子的[CLS]对应的位置的向量直接输入给下游任务的NSP,进行预测,把被[MASK]位置所对应的向量输入MLM进行预测还原被mask的词即可。

但是我在预训练的过程中,出现了NSP的loss为nan的情况。网上搜索了原因,说loss出现nan,可能输入中存在nan,中间计算结果出现nan,或者学习率太大,或者梯度爆炸,被除数为零等。自己去查了输入和中间计算结果,都没有发现存在nan的,学习率设置为0.001,应该也不算大。

然后实在没办法,就把计算nsp的loss的输入都重新打印出来,然后再手动使用nn.CrossEntropyLoss()去计算,结果发现也没有nan,然后再去看自己定义的loss =nn.CrossEntropyLoss(ignore_index=vocab['[PAD]']),mlm和nsp的loss定义的都是一样,发现传了一个参数ignore_index,但是自己输入的数据中,label全为0,所以就导致出现了loss为nan。查阅相关资料发现,在计算nsp loss的时候,在loss的定义上,不需要传ignore_index,而在计算mlm loss的时候则需要这个参数。两个预训练任务的loss虽然损失都是交叉熵损失,但不应该是一模一样的。

你可能感兴趣的:(自然语言处理,大数据,bert,自然语言处理)