Created by: wangxicoding
- Fix INF bug in softmax_cross_entropy_op.
- Repair softmax test bug.
- Add boundary tests to softmax_cross_entropy_op, make sure no INF.
https://github.com/PaddlePaddle/Paddle/blob/fff270eacd83384ad9a62db1af38d7db65dd2cd3/paddle/fluid/operators/softmax_with_cross_entropy_op.cu#L155 计算max_data<-64时会将其强制截断为-64。实测expf(-104.0f)时就会出现数值下溢为0, 假如softmax前面全连接层获得的logits数值都<= (-64-104),就会出现expf数值下溢,进而导致sum(expf(logits - max_data))=0, log(0)出现-inf。 最终 sofmax -= log(0),出现inf,导致后面反向出现inf,最终训练出现nan。
按代码意思其实应该是对(logits - max_data)做clip,避免计算loss时出现log(exp(softmax))出现log(0)的现象。数值稳定版本的softmax_cross_entropy_op见新加注释可以不需要clip。test的softmax函数已按(logits - max_data)做clip进行修改。