最近写的网络,然后感觉是没问题的,但是训练过程中,有时候会所有参数都变成nan
第一次出现这个问题,我用的正态分布初始化,默认方差1,然后改成0.01好了 当时猜测是梯度爆炸了
第二次出现这个问题,是我迭代了很多轮之后忽然某一轮出现了这个问题,初始化方式uniform初始化,初始参数范围 [-1/hidden_dim, 1/hidden_dim] , lr 5/10w
解决方法再这里看到的:
https://stackoverflow.com/questions/33712178/tensorflow-nan-bug
也就是,写网络的时候,对梯度要做clip,如果是交叉熵,因为有log的计算,在log之前也要保证log(x) x的值不能太小,也需要做clip
cross_entropy = -tf.reduce_sum(y_*tf.log(tf.clip_by_value(y_conv,1e-10,1.0)))
另外一个有意思的点,就是tensorflow,我load没有加clip的model 然后可以用加了clip的继续训练(我只在交叉熵的那边加了clip)。应该是因为Tf的load model只是把Variable按照load的model设定了。这点使得修复bug很方便。