李鑫
歸一化
有一個步驟叫歸一化(normalization),就是將值壓到[-1, 1]之內。歸一化後訓練的效率更高。
所以,既然你發現了
當訓練數據和測試數據在-1到1之間的時候效果還不錯
而
訓練和測試數據一旦絕對值大於1的時候效果就很差
那解決方案很簡單,直接將輸入數據歸一化就可以。歸一化很簡單,假設你的輸入數據(包括訓練集和測試集)中最大的絕對值為|max|,那你直接把每個輸入數據除以|max|就可以(X = X / |max|)。
實際上,不僅是輸入數據,中間的網絡層的輸出通常也最好是在[-1, 1]之間,所以在很多網絡架構中,中間都會插入很多歸一化層(normalization layer)。
為何歸一化效率更高
上面解釋了歸一化的概念,以及如何進行歸一化。從實踐層面上來說,你的問題已經得到解決。不過你也許好奇為什麼歸一化後訓練效率更高?
你提到
訓練迴歸(x的平方)
也就是是訓練的目標是最小化均方誤差(MSE)。換句話說,MSE越接近零越好。MSE的差距會反向傳播,通過網絡層一層層地回傳到輸入層。
所以,一方面,不管你輸入層怎麼樣,最終的網絡層的權重應該是在零周圍絕對值較小的數(比如位於[-1, 1]之間),這樣對MSE方面的差距才會比較敏感。舉個極端的例子,MSE減少了0.1——這其實已經是相當大的變動了,但是網絡層的權重都是什麼2000、3000的,那MSE變動導致的那一點更新對權重而言根本感覺不大——所以說,梯度爆炸是不好的。。另一方面,既然輸出這一端權重是,比方說,[-1, 1]之間,而你輸入那段範圍遠遠大於[-1, 1],那其中的網絡層必須至少有一層權重超出[-1, 1]的範圍(除非你的激活函數很奇葩,有放大作用,但你用的ReLU負值歸零,正值保留 ,可沒有放大作用),換言之,
需要梯度爆炸,輸入層和輸出層才接得起來。
那梯度都爆炸了,就別指望訓練效率高了。