赞
踩
提示:这里可以添加本文要记录的大概内容:
最近在复现语义相似度计算相关模型时候遇到ESIM模型,首先数据集采用的是LCQMC数据,数据集通过句子对和标签作为训练数据。在设计好ESIM模型之后,对模型进行训练时候发现了训练过程中的loss为nan的问题。
问题截图如下所示:
首先,本着面向百度编程的原则在网上搜寻了关于loss为nan的情形,网上的结果基本都是说:梯度消失、损失函数不当(出现0的除法)以及batch_size设置不当和输入数据有误等问题。由于LCQMC数据集先前在其它的模型上训练和测试成功,因此,这里我就没有考虑是数据的问题。然后在模型的每一层进行 print 调试。
其次,在调试过程中,由于一开始没有掌握方法将dataloader的shuffle设置为true,因此每次调试的时候报错的地方不一致就没有考虑到数据本身问题。后来将shuffle设置为false,那么模型训练时候就会按照顺序加载数据,然后在输出中发现:nan总是出现在161408到161472条数据之间,那么可以表示是数据除了问题。
于是,到训练集的161408和161472条数据之间进行一一输入ESIM模型查看是否出现nan,最终当遇到下面一条数据时候,模型的loss就会出现nan。
最后,接下来,就是到模型中去分析为什么会出现nan值的原因,最终在ESIM模型中的 soft_attention_align 方法中找到了原因:引起nan出现的原因是方法中用到了attention矩阵对输入的句子进行权重计算,而结合我们的报错数据,最终确定到是由于 “亲哈”该条句子经过分词、填充之后没有登录词,因此该条句子会全部被填充为0元素,这样在经过编码层、lstm、attention之后就会出现nan值的情况。
解决方法是:考虑到输入句子经过分词、填充之后存在登录词为0的情况,而这样全为0的句子输入到网络会引起部分计算报错nan。那么解决办法是在dataset处理阶段,经过分词、词索引之后对当前句子的索引列表进行判断,仅仅当句子1和句子2同时包含登录词的情况下才纳入我们的输入数据。
ESIM模型代码参考:https://github.com/pengshuang/Text-Similarity/tree/master/models
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。