NaN
- 计算softmax loss时要用numeric robust 的计算方式. softmax与 loss可能要分开计算. 得到前者的计算方式可以是常规方法. 但计算后者时要注意无穷大和NaN的出现.
- NaN的出现一定是因为出现了无穷大. 无穷大的出现则是因为变量存储的数值超出了变量数据类型能表示的最大值.使用GPU计算常用float32, 它的最大表示值在(10^{38.5})附近.
- learning_rate太大可能导致非数的出现: weight值会变得很大(超过10应该就算大了). 在forward的过程中会不断乘以weight值, 这样就会导致神经元的激活值达到无穷大. 然后, 只要碰到值为0的weight(小概率)或与其他的无穷大, 就会出现NaN.
- 像素级别的loss的取均值决定learning_rate的数量级. 我使用(224 imes 224)的图片, 如果loss是对单个像素的均值, 则数量级在(10^{-5}). 如果是对单张图片的loss, 要再小4个数量级.(caffe fcn使用了(10^{-10}))
- 出现问题时要积极寻找到问题来源, 重要的问题说三遍:出现问题时要积极寻找到问题来源, 出现问题时要积极寻找到问题来源. 不能瞎猜, 更不能直接放弃.
loss不下降了
- 先尝试使用更小的learning_rate, 如果不行, 就尝试更大的. 在使用不同大小的learning_rate训练网络的过程中, learning_rate并非一定要递减. 这是亲身体验过的. 原因不明, 可能是因为大的learning_rate让weight set跳入了一个更好的basin.