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虽然损失都是交叉熵损失,但不应该是一模一样的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值