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\times 224\)的圖片, 如果loss是對單個像素的均值, 則數量級在\(10^{-5}\). 如果是對單張圖片的loss, 要再小4個數量級.(caffe fcn使用了\(10^{-10}\))
- 出現問題時要積極尋找到問題來源, 重要的問題說三遍:出現問題時要積極尋找到問題來源, 出現問題時要積極尋找到問題來源. 不能瞎猜, 更不能直接放棄.
loss不下降了
- 先嘗試使用更小的learning_rate, 如果不行, 就嘗試更大的. 在使用不同大小的learning_rate訓練網絡的過程中, learning_rate並非一定要遞減. 這是親身體驗過的. 原因不明, 可能是因為大的learning_rate讓weight set跳入了一個更好的basin.